1个不稳定版本
0.1.0 | 2022年7月23日 |
---|
#1866 in 加密学
1.5MB
27K SLoC
dilithium-raw
后量子签名方案dilithium的低级库。
使用经过轻微修改的C代码(由构建脚本编译)作为实际实现,API已修改以将用户对所需随机性的控制权放在首位。
该库具有最小化的依赖关系:在默认配置(不包含serde
支持)下,仅包含cty
。
安全性
警告:此crate旨在作为实现原语并暴露“不易误用”的API的低级crate,以提供用户最大控制。仅在您了解自己在做什么的情况下使用!始终阅读文档中的安全部分。否则请使用高级包装器。
警告:此crate尚未经过正确性审计。C代码是从备受推崇的pqclean
项目复制的,但自那时起已进行了修改。
自行承担风险!
使用方法
API位于dilithiumX
模块中,其中X为{2,3,5}。要生成密钥对,请使用generate_keypair
。注意:它需要一个填充有加密安全随机字节的缓冲区。随机缓冲区不会被修改,因此零化留给用户。示例
use dilithium_raw::dilithium5::generate_keypair;
use rand::rngs::OsRng;
use rand::Rng;
use zeroize::Zeroize;
// fill buffer of 128 bytes with secure random data
let mut random = [0; 128];
OsRng.fill(&mut random[..]);
// generate keypair
let (pubkey, seckey) = generate_keypair(&mut random);
// zeroize the buffer with random data
random.zeroize();
要使用私钥签名消息,请使用sign
,要使用公钥验证它,请使用verify
。verify
对于有效签名返回Ok
,对于无效签名返回Err
。示例
use dilithium_raw::dilithium5::{sign, verify};
// snip, get a `pubkey` and `seckey` with the public and secret key respectively
let msg = "hello world";
let sig = sign(msg, &seckey);
assert!(verify(msg, &sig, &pubkey).is_ok());