
rscrypto v0.9.0
Rust 密码学,零必需依赖:哈希、校验和、MAC、KDF、密码哈希、AEAD、签名、RSA、密钥交换、ML-KEM 和 ML-DSA。可移植的 Rust 参考实现,带 SIMD 与 ASM 后端。
rscrypto
rscrypto 是一个 Rust 库,提供密码学原语、哈希、密码哈希和校验和。
一个特性模型控制所有这些功能。
可移植 Rust 是参考实现。
SIMD 和汇编后端在支持的平台上使其更快。
生产构建不依赖 C、FFI、OpenSSL 或系统库。
rscrypto 仅提供原语。
它不是 TLS 栈、PKI 工具包、密钥存储或协议实现。
安装
rscrypto 需要 Rust 1.100。
在 Rust 1.100 稳定之前,请使用 1.100 beta 或更新的 nightly。
加速的 POWER、IBM Z 和 RISC-V 构建需要 nightly 编译器;
portable-only 构建支持声明的 MSRV。
参见工具链。
仅含 SHA-2 的最小 no_std 构建:
[dependencies]
rscrypto = { version = "0.11", default-features = false, features = ["sha2"] }
所有原语,使用操作系统随机性:
[dependencies]
rscrypto = { version = "0.11", features = ["full", "getrandom"] }
默认特性是 std。
设置 default-features = false 可移除它。
仅对从操作系统获取盐、密钥、nonce 或 RSA 密钥生成熵的 API 启用 getrandom。
特性指南说明了如何选择特性。
Cargo.toml 定义了确切的特性图。
快速开始
use rscrypto::Sha256;
let one_shot = Sha256::digest(b"hello world");
let mut hasher = Sha256::new();
hasher.update(b"hello ");
hasher.update(b"world");
assert_eq!(hasher.finalize(), one_shot);
哈希类型支持一次性使用和流式使用。
examples/README.md 包含 AEAD、签名、RSA、P-256 和 P-384 ECDH、
X25519、ML-KEM、密码哈希和后端内省的可运行示例。
原语与特性
| 系列 | 原语 | 特性 |
|---|---|---|
| 校验和 | CRC-16、CRC-24、CRC-32、CRC-32C、CRC-64/XZ、CRC-64/NVMe | checksums 或叶子特性 |
| 密码学哈希 | SHA-2、SHA-3、SHAKE、cSHAKE、BLAKE2、BLAKE3、Ascon-Hash/XOF/CXOF | crypto-hashes 或叶子特性 |
| 快速哈希 | XXH3-64/128、RapidHash V3-64 | fast-hashes 或叶子特性 |
| MAC 和 KDF | HMAC-SHA-2/SHA-3、KMAC128/256、Poly1305、HKDF-SHA-2、PBKDF2-HMAC-SHA-2 | macs、kdfs 或叶子特性 |
| 密码哈希 | Argon2d/i/id、scrypt、有界 PHC 密码记录 | password-hashing 或叶子特性 |
| 签名和 RSA | ECDSA P-256/P-384、Ed25519、ML-DSA-44/65/87、SLH-DSA(全部 12 个 FIPS 205 集,pure 和 HashSLH-DSA)、RSA 签名、验证、加密和密钥生成 | signatures 或叶子特性 |
| 密钥交换和 KEM | P-256 ECDH、P-384 ECDH、X25519、ML-KEM-512/768/1024 | key-exchange 或叶子特性 |
| AEAD | AES-GCM、AES-GCM-SIV、AES-SIV-CMAC、ChaCha20-Poly1305、XChaCha20-Poly1305、AEGIS-256、Ascon-AEAD128 | aead 或叶子特性 |
签名和 KEM 密钥为 ECDSA、Ed25519、RSA、ML-DSA、ML-KEM 和 SLH-DSA 导入和导出标准 DER(PKCS #8 和 SubjectPublicKeyInfo)。
WebSocket accept 摘要仅出于协议兼容性而存在。
它需要 websocket-sha1 特性。
任何伞形特性(包括 full)都不会启用它。
有关确切的类型和方法,请参见 docs.rs。 API 兼容性说明解释了输出类型、集合种子和保留的方法名。 密码学韧性指南解释了安全假设、迁移边界,以及选择更强密码学时应审查的证据。
平台与分发
可移植 Rust 实现逐字节定义了正确的输出。
每个加速后端必须给出相同的输出。
在编译时,目标决定哪些后端可用。
使用 std 时,rscrypto 还会在运行时检测 CPU 特性并选择后端。
如果没有可用的加速后端,则运行可移植实现。
平台指南列出了支持的目标。
它还解释了分发、no_std 支持以及 portable-only 的限制。
保证
安全声明仅在其证据通过时成立。 缺失或过时的证据会移除声明;它绝不会削弱门禁。
- 正确性: NIST、RFC、上游和 Wycheproof 向量、独立实现、 属性测试、负面测试和 Miri。
- 模糊测试: 模糊测试目标在生产代码上运行,覆盖原语、解析器、状态机 和 trait 边界。 最小化输入作为测试重放。 单独的通道使用 sanitizer 运行它们。
- 后端: 差分测试将每个加速后端与可移植 Rust 进行比较。 它们覆盖长度、对齐、尾部、状态转换、分发 以及原生目标上的回退。
- 常量时间:
ct.toml列出了测试的确切操作。 证据结合了优化链接二进制文件的检查、 针对固定形状内核的 BINSEC 证明,以及针对端到端操作的 DudeCT 计时测试。 - 机密: 拥有机密的类型在
Debug输出中隐藏其内容, 并在 drop 时清除其已初始化的存储。 复制规则因类型而异;例如,带密钥的 BLAKE2 和 BLAKE3 状态支持Clone。 机密所有权清单列出了每种类型。 - 失败: 验证失败不会说明失败原因。 失败的 AEAD 打开会清除未认证的明文。
常量时间声明仅适用于其证据所覆盖的目标、特性、编译器、配置 和操作。 看起来无分支的源代码不是证明。
有关详细信息,请参见测试证据、常量时间模型、机密生命周期 和威胁模型。
rscrypto 尚未经过第三方安全审计。
项目目前无力支付审计费用,而自动化证据不能替代审计。
rscrypto 不声称已审计、通过 FIPS 140-3 验证、经过形式化验证,
或整个 crate 为常量时间。
通过 GitHub 私有漏洞报告报告疑似漏洞。
遵循 SECURITY.md 流程。
不要公开提交 issue。
性能
基准运行 #37092266645 于 2026-10-03 在八个平台上
测量了 v0.10.0 源代码。
每个平台有 346 项哈希、校验和、MAC、XOF 和 scrypt 的同类比较。
每项比较将最快外部 crate 的中位时间除以 rscrypto 的中位时间。
比率高于 1.00x 表示 rscrypto 更快。
| 平台 | 更快 | 3% 以内 | 更慢 | 中位比率 |
|---|---|---|---|---|
Intel Linux (c8i) | 211 | 88 | 47 | 1.09x |
AMD Linux (c8a) | 256 | 81 | 9 | 1.13x |
Intel Windows (c8i) | 186 | 105 | 55 | 1.05x |
AMD Windows (c8a) | 262 | 68 | 16 | 1.09x |
Graviton5 Linux (c9g) | 147 | 121 | 78 | 1.01x |
| POWER10 Linux | 206 | 122 | 18 | 1.07x |
| IBM Z Linux | 301 | 19 | 26 | 2.77x |
| RISC-V Linux | 197 | 79 | 70 | 1.05x |
这些结果来自云和共享主机上的一次运行。 它们不包括 AEAD、签名、密钥交换、ML-KEM、ML-DSA、Argon2 或 RSA 用例, 也不包括 macOS。 基准概览给出了按系列分类的结果、 方法和限制。 比较契约定义了等效的 ML-KEM 和 Argon2 工作负载。 较旧的汇总表混合了不同的工作负载。它们是历史记录,不是当前声明。
项目
指南和示例描述了本仓库中的源代码。 对于已发布版本,请使用匹配的 API 文档。
在更改代码之前,请阅读 CONTRIBUTING.md。
CHANGELOG.md列出了已发布的更改。
许可证
根据 Apache-2.0 或 MIT 双重许可,由您选择。