Quantum-Blockchains/dilithium
GitHub: Quantum-Blockchains/dilithium
纯 Rust 实现的 CRYSTALS-Dilithium 和 ML-DSA 后量子数字签名算法库,提供抗量子计算攻击的密钥生成与签名验证功能。
Stars: 27 | Forks: 9
# crystals-dilithium
纯 Rust 实现:
- CRYSTALS-Dilithium(`dilithium2`、`dilithium3`、`dilithium5`)
- ML-DSA(`ml_dsa_44`、`ml_dsa_65`、`ml_dsa_87`)
该代码库基于参考实现构建,包含针对内部向量和 ACVP 风格数据集的测试覆盖。
## 安全说明
此项目尚未经过第三方安全审计。生产环境使用前应进行您自己的安全审查。
## 构建
```
cargo build --release
```
## 快速开始(Dilithium)
```
use crystals_dilithium::dilithium2::Keypair;
let seed = [42u8; 32];
let msg = b"hello world";
let keypair = Keypair::generate(Some(&seed)).unwrap();
let signature = keypair.sign(msg);
let is_verified = keypair.verify(msg, &signature);
assert!(is_verified);
```
## 快速开始(ML-DSA)
```
use crystals_dilithium::ml_dsa_44::Keypair;
use crystals_dilithium::RandomMode;
let seed = [7u8; 32];
let msg = b"hello world";
let keypair = Keypair::generate(Some(&seed)).unwrap();
let sig = keypair.sign(msg, None, RandomMode::Deterministic).unwrap();
assert!(keypair.verify(msg, &sig, None));
```
## ML-DSA 模式
ML-DSA API 支持三种签名/验证流程:
1. 纯模式
- 签名:`sign(msg, ctx, rand)`
- 验证:`verify(msg, sig, ctx)`
2. 预哈希模式
- 签名:`prehash_sign(msg, ctx, rand, ph)`
- 验证:`prehash_verify(msg, sig, ctx, ph)`
- `ph` 是来自 `prehash::PH` 的受支持预哈希算法之一
3. 内部模式(仅用于 ACVP/内部测试)
- 需要特性:`acvp-internal`
- 签名/验证预构建输入:`sign_internal`、`verify_internal`、`sign_mu`、`verify_mu`
`RandomMode` 控制 ML-DSA 签名中的随机数/随机性行为:
- `RandomMode::Deterministic`:确定性签名
- `RandomMode::Hedged`:随机化(基于 RNG)签名
- `RandomMode::Fixed(bytes)`:固定随机数流(仅限 `acvp-internal`)
注意:
- `ctx` 是可选的上下文数据,最多 255 字节。
- API 变体可在 `ml_dsa_44`、`ml_dsa_65` 和 `ml_dsa_87` 中获取。
### 模式示例
纯模式:
```
use crystals_dilithium::ml_dsa_65::Keypair;
use crystals_dilithium::RandomMode;
let kp = Keypair::generate(Some(&[9u8; 32])).unwrap();
let msg = b"pure mode";
let sig = kp.sign(msg, Some(b"app:v1"), RandomMode::Deterministic).unwrap();
assert!(kp.verify(msg, &sig, Some(b"app:v1")));
```
预哈希模式:
```
use crystals_dilithium::ml_dsa_65::Keypair;
use crystals_dilithium::prehash::PH;
use crystals_dilithium::RandomMode;
let kp = Keypair::generate(Some(&[10u8; 32])).unwrap();
let msg = b"prehash mode";
let sig = kp
.prehash_sign(msg, None, RandomMode::Hedged, PH::SHA256)
.unwrap();
assert!(kp.prehash_verify(msg, &sig, None, PH::SHA256));
```
内部模式(`acvp-internal`)仅用于 ACVP/内部向量。
## 错误处理(推荐)
密钥生成和密钥反序列化现在返回 `Result`,以避免在格式错误的输入上发生 panic。
```
use crystals_dilithium::dilithium2::PublicKey;
fn parse_public_key(bytes: &[u8]) -> Result {
PublicKey::from_bytes(bytes)
}
```
同样适用于:
- `Keypair::generate(...)`
- `Keypair::from_bytes(...)`
- `SecretKey::from_bytes(...)`
- `PublicKey::from_bytes(...)`
## 测试
```
cargo test
```
ACVP 内部测试向量已启用特性门控:
```
cargo test --test acvp_internal --features acvp-internal
```
## 基准测试
Criterion 基准测试:
```
cargo bench
```
## 文档
```
cargo doc --open
```
## 许可证
GPL-3.0-only。参见 [LICENSE](LICENSE)。
标签:cryptographic library, CRYSTALS-Dilithium, CVE, lattice-based cryptography, ML-DSA, post-quantum, PQC, Rust, 可视化界面, 后量子密码学, 密码学, 密钥对生成, 手动系统调用, 数字签名, 格基密码, 签名验证, 网络流量审计, 通知系统, 量子抗性