aescrypt-rs
Fast, safe, streaming Rust implementation of the AES Crypt file format
- Read: Full compatibility with all versions — v0, v1, v2, and v3
- Write: Modern v3 only (PBKDF2-HMAC-SHA512, PKCS#7 padding, proper session-key encryption)
- Convert:
convert_to_v3_ext()— recommended for bit-perfect migration with optional 256-bit random password upgrade - Legacy:
convert_to_v3()— soft-deprecated, fully backward compatible - Detect:
read_version()— header-only version check in <1μs (ideal for batch tools) - AES-256-CBC with HMAC-SHA256 (payload) + HMAC-SHA512 (session) authentication
- Constant-memory streaming (64-byte ring buffer)
- Zero-cost secure memory & cryptographically secure RNG via
secure-gatev0.5.10 (enabled by default) - No
unsafein the core decryption path whenzeroizeis enabled - Pure Rust,
#![no_std]-compatible core - 100% bit-perfect round-trip verified against all 63 official v0–v3 test vectors
- Legacy to v3 conversion mathematically proven perfect across 20+ years of AES Crypt history
Support the Original Author
AES Crypt was created and maintained for over two decades by Paul E. Jones.
Paul’s work laid the foundation for secure, cross-platform file encryption that benefits everyone.
If you find AES Crypt (or this Rust port) useful, please consider supporting Paul directly:
- Official apps & licenses: https://www.aescrypt.com/download/
- Business/enterprise licensing: https://www.aescrypt.com/license.html
Your support keeps the original tools alive and funds future development.
Version Support Summary
| Operation | v0 | v1 | v2 | v3 |
|---|---|---|---|---|
| Decrypt | Yes | Yes | Yes | Yes |
| Encrypt | – | – | – | Yes |
| Convert to v3 | Yes | Yes | Yes | — |
| Detect version | Yes | Yes | Yes | Yes |
Why v3-only on write?
Version 3 is the only secure, future-proof variant (PBKDF2 with configurable iterations, UTF-8 passwords, PKCS#7 padding). Producing legacy formats today would be a security downgrade.
Cryptographic Primitives (v3)
| Layer | Encryption | Integrity / KDF |
|---|---|---|
| Password to Master Key | – | PBKDF2-HMAC-SHA512 |
| Session Key + IV (48 B) | AES-256-CBC | HMAC-SHA256 |
| File Payload | AES-256-CBC | HMAC-SHA256 |
Proven Correctness — The Gold Standard
This library has mathematically proven bit-for-bit compatibility via:
- Full round-trip testing against all 63 official AES Crypt test vectors (v0–v3)
convert_to_v3_exttest suite that decrypts legacy files → re-encrypts as v3 → decrypts again → verifies byte-for-byte identityread_version()validated against all 63 real headers (including legacy v0 quirks)- Uses real-world 300,000 PBKDF2 iterations in release mode (no shortcuts)
- Total runtime: ~25 seconds — the sound of unbreakable data integrity
Files created in 2005 with the original AES Crypt tools will round-trip perfectly through aescrypt-rs in 2025 and beyond.
API Highlights
Quick Version Check — Batch-Friendly
use read_version;
use File;
use BufReader;
let file = open?;
let mut reader = new;
let version = read_version?; // Reads just 3–5 bytes
match version
Recommended: convert_to_v3_ext — Migrate with Security Upgrade
use ;
use File;
use ;
let old_password = new;
let input = new;
let mut output = new;
// Generate a 256-bit random password and return it
let generated = convert_to_v3_ext?;
if let Some = generated
Reuse Old Password (Explicit)
let new_password = new;
convert_to_v3_ext?;
Legacy API — Still Works (Soft-Deprecated)
// This still compiles and works — but emits a warning
convert_to_v3?;
Standard Encrypt / Decrypt
use ;
use Cursor;
let plaintext = b"The quick brown fox jumps over the lazy dog";
let password = new;
let mut encrypted = Vecnew;
encrypt?;
let mut decrypted = Vecnew;
decrypt?;
assert_eq!;
println!;
Features
| Feature | Description |
|---|---|
zeroize (default) |
Automatic secure zeroing of keys/IVs on drop (strongly recommended) |
batch-ops |
Parallel encryption/decryption using Rayon (opt-in) |
Installation
[]
= "0.1.6"
Or with all optional features:
= { = "0.1.6", = ["batch-ops"] }
Performance (Intel i7-10510U – Windows 11 – Rust 1.82 – release)
| Workload | Throughput | Notes |
|---|---|---|
| Decrypt 10 MiB | ~171 MiB/s | Pure streaming (no KDF) |
| Encrypt 10 MiB (with KDF) | ~160 MiB/s | Includes PBKDF2-SHA512 (~300k iterations) |
| Full round-trip 10 MiB | ~76 MiB/s | Encrypt → decrypt back-to-back |
~6–7 seconds for a full 1 GiB file on a 2019 laptop (excluding ~180 ms key derivation).
On modern desktop CPUs or Apple Silicon, expect >1 GiB/s.
Parallel performance (batch-ops enabled)
| Files | Sequential | Parallel | Speedup |
|---|---|---|---|
| 8 × 10 MB | 1.04 s | 367 ms | 2.82× |
Secure Random Generation — Now Even Cleaner
- Upgraded to
secure-gatev0.5.10
→ All random IVs and session keys use zero-costRandomIv16::new()andRandomAes256Key::new()
→ Random passwords viaRandomPassword32::random_hex()— 256-bit entropy, 64-character hex
→ Same bulletproof thread-localOsRng(lazy init, panic-on-failure, fullyno_std)
→ No heap allocation, no performance cost, no duplicated RNG code
→ The encryption path now reads like pure intent while staying 100% memory-safe
No breaking changes in v0.1.6 — fully backward compatible.
Legal & Independence
aescrypt-rs is an independent, community-maintained implementation of the publicly documented AES Crypt file format:
https://www.aescrypt.com/aes_file_format.html
It is not affiliated with Paul E. Jones, Packetizer, Inc., or Terrapane Corporation.
Correctness verified against the official reference implementation — no source code copied.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.
Contributing
Pull requests are very welcome!
main is the stable branch.
aescrypt-rs — the modern, safe, provably perfect, and future-proof way to read, write, detect, and upgrade AES Crypt files in Rust.