Quantus-Network/qp-rusty-crystals
GitHub: Quantus-Network/qp-rusty-crystals
纯 Rust 实现的后量子数字签名方案 ML-DSA(CRYSTALS-Dilithium),并附带兼容 BIP 标准的 HD 钱包功能。
Stars: 8 | Forks: 3
# Rusty Crystals
ML-DSA (CRYSTALS-Dilithium) 后量子数字签名方案的 Rust 实现,支持分层确定性 (HD) 钱包。
此 workspace 提供了与 BIP-32、BIP-39 和 BIP-44 标准兼容的后量子密码学原语和 HD 钱包功能。
## 安全特性
此实现提供了企业级的内存安全:
- **敏感数据的编译期复制防护** - `SensitiveBytes32`、`SensitiveBytes64`、`Keypair`、`SecretKey`、`ExtendedPrivKey` 和 `WormholePair` 故意**不**实现 `Clone`。密钥材料只能被移动。任何复制都必须通过 `to_bytes()`/`from_bytes()` 显式往返进行,使得复制操作在调用处可见。
- **自动内存清零** - 传递给构造函数的源数组以及所有包装器内容在 drop 时会被清零 (`ZeroizeOnDrop`)。传递给 `mnemonic_to_seed` 的助记词字符串被包装在 `Zeroizing` 中,并在**每条**退出路径(包括解析失败和 panic unwind)上进行清除。
- **显式敏感数据处理** - API 要求使用 `(&mut entropy).into()` 语法,使敏感操作变得显眼,并在传输时清零调用者的缓冲区。
- **有限制的派生路径** - `derive_key_from_seed` 和 `generate_wormhole_from_seed` 会拒绝字节长度超过 `MAX_DERIVATION_PATH_BYTES` (256) 或段数超过 `MAX_DERIVATION_DEPTH` (16) 的路径,**在任何内存分配或 HMAC 工作之前**,防止通过攻击者控制的深层路径进行 DoS。
```
// Secure by design - entropy is zeroized after conversion
let mut entropy = [0u8; 32];
getrandom::getrandom(&mut entropy).unwrap();
let keypair = ml_dsa_87::Keypair::generate((&mut entropy).into());
// entropy is now [0,0,0,...] - no sensitive data left in memory
// If you genuinely need a second copy of a keypair, you must opt in explicitly:
let kp_bytes = keypair.to_bytes();
let keypair2 = ml_dsa_87::Keypair::from_bytes(&kp_bytes)?;
// Prefer passing &Keypair instead of duplicating secrets.
```
这消除了密码学应用中与敏感数据处理相关的整类安全漏洞。
## 概述
此 workspace 包含两个独立的 crate:
- **`qp-rusty-crystals-dilithium`** - ML-DSA 数字签名实现
- **`qp-rusty-crystals-hdwallet`** - 用于后量子密钥的 HD 钱包
## 用法
### ML-DSA 数字签名
```
[dependencies]
qp-rusty-crystals-dilithium = "2.0.0"
getrandom = "0.2" # For secure entropy generation if needed
```
**安全提示**:在为密码学操作生成熵时,请务必使用密码学安全的随机源。切勿使用可预测的字符串、时间戳或用户输入作为熵。
```
use qp_rusty_crystals_dilithium::ml_dsa_87;
// Generate secure entropy
let mut entropy = [0u8; 32];
getrandom::getrandom(&mut entropy).expect("Failed to generate entropy");
// Generate keypair
let keypair = ml_dsa_87::Keypair::generate((&mut entropy).into()).expect("Failed to generate keypair");
// Sign message
let message = b"Hello, post-quantum world!";
let signature = keypair.sign(message, None, None);
// Verify signature
let is_valid = keypair.verify(message, &signature, None);
```
### HD 钱包
```
[dependencies]
qp-rusty-crystals-hdwallet = "1.0.0"
```
```
use qp_rusty_crystals_hdwallet::{generate_mnemonic, HDLattice};
// Generate secure seed for mnemonic
let mut seed = [0u8; 32];
getrandom::getrandom(&mut seed).expect("Failed to generate seed");
// Generate mnemonic
let mnemonic = generate_mnemonic((&mut seed).into())?;
// Create HD wallet
let hd_wallet = HDLattice::from_mnemonic(&mnemonic, None)?;
// Derive keys using BIP-44 path
let keys = hd_wallet.generate_derived_keys("44'/0'/0'/0'/0'")?;
```
## Crates
### qp-rusty-crystals-dilithium
ML-DSA 数字签名实现:
- **ML-DSA-44, ML-DSA-65, ML-DSA-87** - 所有安全级别
- **符合 NIST 标准** - 已通过官方测试向量验证
- **纯 Rust 实现** - 内存安全,无 unsafe 代码
- **高性能** - 经优化的实现
### qp-rusty-crystals-hdwallet
后量子 HD 钱包:
- **兼容 BIP-39** - 助记词生成/恢复
- **BIP-32 派生** - 分层确定性密钥
- **BIP-44 路径** - 标准派生路径
- **仅限强化密钥** - 安全的后量子派生
## 测试
运行所有测试:
```
cargo test --workspace
```
获取测试覆盖率:
```
cargo install cargo-tarpaulin
cargo tarpaulin --workspace
```
### NIST KAT 测试
'verify_integration_tests.rs' 中的 test_nist_kat 测试用例涵盖了从 PQCrystals 为 ML-DSA-87 生成的 NIST KAT 测试用例。
我们从 PQ-Crystals 的 C 代码中导出了该测试文件,并在此处导入进行测试。
要重新生成此文件...
```
git clone https://github.com/pq-crystals/dilithium
cd dilithium/ref
make nistkat
./nistkat/PQCgenKAT_sign5
cp ./nistkat/PQCsignKAT_Dilithium5.rsp ???
```
## 代码覆盖率
此仓库的所有关键逻辑和功能均达到了 100% 的代码覆盖率。
```./coverage.sh```
## 许可证
[GPL-3.0](LICENSE) - 详情请参阅 LICENSE 文件。
## 鸣谢
ml-dsa 的代码几乎是原样借鉴自 [Quantum Blockchain 的移植版本](https://github.com/Quantum-Blockchains/dilithium)
,即 [pq-crystals](https://github.com/pq-crystals/dilithium) 的 Rust 移植。
标签:CVE, HD钱包, ML-DSA, Rust, 内存安全, 加密算法库, 可视化界面, 后量子密码学, 数字签名, 网络流量审计, 通知系统