enc_file
Password-based, authenticated file encryption with a small versioned header and Argon2id KDF. Ships as both a library and a CLI.
Security note: This project is not audited or reviewed. It protects data at rest but cannot defend a compromised host or advanced side channels. Use at your own risk. For important or sensitive information, use Veracrypt (or similar) instead.
Features
- Argon2id password KDF (per-file salt + stored parameters).
- AEAD: XChaCha20-Poly1305 (default) or AES-256-GCM-SIV.
- Compact binary header (magic, version, alg, KDF kind/params, salt, nonce, length).
- Optional ASCII armor for transport.
- Streaming mode for large files (constant memory; configurable
chunk_size
). - Zeroize-sensitive buffers and use
secrecy
wrappers. - Compute a file hash and print it as hex.
- Usable as library and CLI.
Install
You can install enc-file in several ways:
From crates.io (requires Rust toolchain)
From GitHub Releases (prebuilt binaries)
- Visit the Releases page.
- Download the binary for your platform.
- Place it in a directory in your
PATH
.
From source
# from source
# binary
Add to a project as a library:
# Cargo.toml
[]
= "0.5.0"
Available optional features (check Cargo.toml): aes
for AES-256-GCM-SIV.
CLI Usage
enc-file <SUBCOMMAND>
Subcommands:
enc Encrypt a file (use --stream for large files)
dec Decrypt a file
key Manage an encrypted key map
hash Compute a file hash and print it as hex
Encrypt
# Simple: prompts for password (if your CLI is set up that way) or read from file if supported
Options of interest:
--alg
/-a
AEAD algorithm:xchacha
(default),aes
--stream
stream mode for large inputs--chunk-size <bytes>
chunk size in streaming mode (default from library)--armor
ASCII-armor output--force
overwrite output if it exists--password-file <PATH>
read password from a file (if your CLI wiring includes it)
Decrypt
Hash
# Default blake3
# Specific algorithm (see below)
Key map (optional)
If you use the library’s key map helpers, the CLI can provide small helpers to init/save/load (if wired). Check enc-file key --help
for available subcommands.
Library Usage
Encrypt / Decrypt bytes
use ;
use SecretString;
let pw = new;
let opts = EncryptOptions ;
let ct = encrypt_bytes?;
let pt = decrypt_bytes?;
assert_eq!;
# Ok::
Encrypt / Decrypt files
use ;
use SecretString;
use Path;
let pw = new;
let opts = EncryptOptions ;
let out = encrypt_file?;
let back = decrypt_file?;
assert!;
# Ok::
Streaming encryption
use ;
use SecretString;
use Path;
let pw = new;
let opts = EncryptOptions ;
let out = encrypt_file_streaming?;
# Ok::
Hash helpers
Supported Hash Algorithms
Both the CLI and library support multiple hashing algorithms for files and byte slices:
Algorithm | CLI --alg value(s) |
Output length |
---|---|---|
BLAKE3 | blake3 |
32 bytes |
BLAKE2b-512 | blake2b |
64 bytes |
SHA-256 | sha256 |
32 bytes |
SHA-512 | sha512 |
64 bytes |
SHA3-256 | sha3-256 , sha3256 , sha3_256 |
32 bytes |
SHA3-512 | sha3-512 , sha3512 , sha3_512 |
64 bytes |
XXH3-64 | xxh3-64 , xxh364 |
8 bytes |
XXH3-128 | xxh3-128 , xxh3128 |
16 bytes |
CRC32 | crc32 |
4 bytes |
CLI Example:
# Compute SHA3-512 hash of a file
# Use XXH3-64 (fast, non-cryptographic)
Library Example:
use ;
let digest = hash_file?;
println!;
# Ok::
use ;
let digest = hash_bytes;
assert_eq!;
let file_digest = hash_file?;
println!;
# Ok::
Keyed BLAKE3 (MAC-style)
use hash_bytes_keyed_blake3;
let key = ;
let tag = hash_bytes_keyed_blake3;
assert_eq!;
# Ok::
Key map helpers
use ;
use SecretString;
use Path;
let mut km = new;
km.insert;
let pw = new;
let path = new;
save_keymap?;
let loaded = load_keymap?;
assert_eq!;
# Ok::
Error handling
All fallible APIs return Result<_, EncFileError>
. Common cases:
EncFileError::Io
I/O failuresEncFileError::Crypto
AEAD failures (bad password, tamper)EncFileError::Format
header parsing/validation issues
Tips
- Use streaming for large files to keep memory predictable.
- Consider
--armor
when moving ciphertexts through systems that mangle binary. - For CLI automation, prefer
--password-file
over interactive prompts.
License
MIT OR Apache-2.0
Note on names
The library crate is named enc_file
(snake_case), which is the name you use when importing it in Rust code:
use ;
The compiled CLI binary is named enc-file
(kebab-case), which is the name you use when invoking it from the shell:
This naming separation is intentional and follows common Rust conventions.