pepedebicki/pqenc
GitHub: pepedebicki/pqenc
一个用 Rust 实现的后量子文件加密学习型 CLI 工具,采用 ML-KEM-768 密钥封装与 AES-256-GCM 数据加密,帮助开发者在实验环境中实践和探索后量子密码学方案。
Stars: 0 | Forks: 0
# pqenc
学习型 CLI(命令行界面),用于后量子文件加密。使用 **ML-KEM-768**(FIPS 203,
前身为 Kyber)作为密钥封装机制,并使用 **AES-256-GCM** 作为数据封装机制。使用 Rust 实现。
## 免责声明
这是一个**学习和实验工具**。请勿将其用于生产数据、第三方数据或任何您无法承受丢失的数据。磁盘上的 `.pqe` 格式为本项目私有;与 `age`、PGP、OpenSSL 或任何其他工具**没有互操作性保证**。该格式有版本控制,并且可能在不同版本之间发生变化。有关完整的立场声明,请参阅
`docs/superpowers/specs/2026-04-25-pqenc-design.md`(§1)。
## 构建
```
cargo build --release
```
MSRV:Rust 1.75。无需 C 工具链或外部构建依赖。
### Windows 注意事项
在 Windows 上,`windows-msvc` Rust 目标需要带有 C++ 工作负载的 Visual Studio 2022 Build Tools
(提供 `link.exe` 和 Windows SDK)。只需安装一次:
```
winget install Microsoft.VisualStudio.2022.BuildTools `
--override "--wait --quiet --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"
```
然后在任何新的 PowerShell 会话中,对 `setenv.ps1` 进行 dot-source 以导入 MSVC
环境并将 rustup 切换到 `stable-msvc`:
```
. .\setenv.ps1
cargo build --release
```
`windows-gnu` 目标(某些 rustup 安装中的默认目标)另外还需要
带有 `dlltool.exe` 的可用 MinGW;在 Windows 上使用 MSVC 是最省事的
路径。
## 用法
### 生成密钥对
```
pqenc keygen --out alice # writes alice.pqpub + alice.pqsec
pqenc keygen --out alice --password # secret key wrapped with Argon2id + AES-GCM
pqenc keygen --from-password --out alice # only alice.pqpub is written;
# the secret key is reconstructed
# from the passphrase on demand
```
### 使用公钥加密
```
pqenc encrypt --pubkey alice.pqpub --in notes.md
pqenc encrypt --pubkey alice.pqpub --in project/ --out project.pqe --explain
```
如果 `--in` 是一个目录,则内容在加密前(`FLAGS.is_archive = 1`)会在内存中打包为 TAR 归档文件。
### 使用密码派生密钥加密
```
pqenc encrypt --from-password --in notes.md
```
发送方和接收方必须共享该密码。不涉及任何密钥文件。
### 解密
```
pqenc decrypt --seckey alice.pqsec --in notes.md.pqe
pqenc decrypt --from-password --in notes.md.pqe --out notes.md --force
```
### 检查 `.pqe` 头部
```
pqenc inspect notes.md.pqe
```
仅读取头部;从不打开 AEAD 载荷,也不需要密钥。
## 文件格式 `.pqe`
完整详情:`docs/superpowers/specs/2026-04-25-pqenc-design.md` §3。
| 偏移量 | 长度 | 字段 | 描述 |
|---------|--------|------------------|--------------------------------------------|
| 0 | 4 | `MAGIC` | ASCII `"PQE1"`(魔术数字 + 格式版本 1) |
| 4 | 1 | `ALGO_ID` | `0x01` = ML-KEM-768 + AES-256-GCM |
| 5 | 1 | `FLAGS` | 位 0 = `is_archive`(内含 TAR) |
| 6 | 2 | `RESERVED` | `0x0000` |
| 8 | 1088 | `KEM_CIPHERTEXT` | ML-KEM-768 密文 |
| 1096 | 12 | `AEAD_NONCE` | GCM nonce,通过 HKDF 派生并存储 |
| 1108 | 32 | `HKDF_SALT` | 每个文件随机生成 |
| 1140 | 8 | `PAYLOAD_LEN` | u64 小端序(AEAD 密文长度) |
| 1148 | N | `AEAD_CT` | AES-256-GCM 密文 |
| 1148+N | 16 | `AEAD_TAG` | GCM 认证标签 |
总大小:`1164 + N` 字节。
## 安全准则
(规格说明 §7,精简版。)
- 密钥从不被记录日志;秘密类型既不实现 `Debug` 也不实现 `Display`,并在丢弃时进行清零。
- AEAD 标签比较委托给 `aes-gcm` crate;不对手工编写的密钥材料进行等值检查。
- 随机性完全来源于 `rand::rngs::OsRng`。
- 密码使用 Argon2id(`m = 19 MiB, t = 2, p = 1`)进行哈希处理,盐值为来自 `OsRng` 的 16 字节。上下文字符串:`b"pqenc v1 kdf"`(HKDF info),
`b"pqenc v1 seed"`(Argon2 secret)。
- 每次加密都使用新的 KEM 封装和新的 32 字节 HKDF
盐值;没有密钥重用。
- 密码通过 `rpassword` 以交互方式读取;从不通过 CLI 参数、
环境变量或文件读取。
- 输出写入是原子性的(`tempfile::NamedTempFile::persist`)。
- 如果没有 `--force`,现有输出永远不会被覆盖。
- 解密错误统一归并为单一的 `DecryptionFailed`,以避免
oracle 风格的侧信道攻击。
## 非目标
(规格说明 §10。)
- 针对大于 RAM 的文件进行流式/分块加密。
- 数字签名(ML-DSA、Falcon、SPHINCS+)。
- 多接收方加密。
- 与 `age`、PGP、OpenSSL 或任何其他工具的互操作性。
- 密钥服务器,信任网络,密钥分发。
- GUI,守护进程模式,文件监视。
- 来自环境变量、文件或 CLI 参数的密码。
- 混合方案(ML-KEM + X25519)。`ALGO_ID` 字节为此留有
空间;v1 未实现。
## 测试
```
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test --all
cargo audit
```
`cargo audit` 已集成到 `.github/workflows/ci.yml` 的 CI 工作流中。
KAT 集成测试(`tests/kat.rs`)在缺少 NIST 响应文件
`tests/kat/ml_kem_768.rsp` 时将被跳过。有关从何处获取官方向量的信息,请参阅 `tests/kat/ml_kem_768_README.md`。
## 许可证
根据以下任一许可证授权:
- MIT 许可证
- Apache 许可证,版本 2.0
由您选择。
标签:AES-256-GCM, Argon2id, CLI, DEM, DNS 反向解析, FIPS 203, KEM, Kyber, meg, ML-KEM-768, PQC, ProjectDiscovery, Rust, WiFi技术, 云配置检测, 信息安全, 公钥加密, 加密解密, 可视化界面, 后量子密码学, 学习项目, 实验性工具, 密码学, 密钥封装机制, 对称加密, 手动系统调用, 抗量子加密, 数据保护, 数据封装机制, 文件加密, 混合加密, 网络流量审计, 自动化审计, 蓝队防御, 通知系统, 非对称加密