1个稳定版本
1.0.0 | 2022年3月5日 |
---|
#1894 in 密码学
140KB
3.5K SLoC
包含 (ELF可执行文件/库, 6KB) src/c/rng.o
rusty-saber
Saber后量子方案的安全纯Rust实现。
- Saber是一种基于格的密钥封装机制(KEM)
- 实现基于NIST第3轮的Saber参考实现
- 实现没有使用任何并发技术(SIMD/线程/…,也许除了你CPU的自动向量化)
- 它依赖于
sha3
作为SHA-3实现,以及aes
作为AES分组密码实现(用作随机数生成器) - 它通过了C参考实现的100个测试用例
- C参考实现包含在此分发中,因为它是测试的一部分
- 它实现了三种变体:LightSaber,Saber,FireSaber
- KEM在现代计算机上运行约25毫秒(所有三种变体)
- 实现软件指令级别的常数时间
- 随机数生成器基于AES256计数模式
谁应该使用它?
任何想要使用Saber在两个实体之间协商对称密钥的人。
如何使用它?
将此添加到您的Cargo.toml
[dependencies]
rusty-saber = "1.0"
要使用特定的Saber变体,您需要使用相应的功能标志导入它
[dependencies]
rusty-saber = { version = "1.0", features = ["lightsaber"] }
三个变体的功能标志分别称为lightsaber
,saber
和firesaber
。
simple
示例说明了API
use rusty_saber::api::{
CRYPTO_BYTES, CRYPTO_CIPHERTEXTBYTES, CRYPTO_PUBLICKEYBYTES, CRYPTO_SECRETKEYBYTES,
};
use rusty_saber::kem::{crypto_kem_dec, crypto_kem_enc, crypto_kem_keypair};
use rusty_saber::rng::AesState;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let mut pk = [0u8; CRYPTO_PUBLICKEYBYTES];
let mut sk = [0u8; CRYPTO_SECRETKEYBYTES];
let mut ct = [0u8; CRYPTO_CIPHERTEXTBYTES];
let mut ss_a = [0u8; CRYPTO_BYTES];
let mut ss_b = [0u8; CRYPTO_BYTES];
let mut rng = AesState::new();
//rng.randombytes_init([0u8; 48]); // TODO use a proper seed (like bytes from /dev/urandom) here
// Party a: generate public key `pk` and secret key `sk`
crypto_kem_keypair(&mut pk, &mut sk, &mut rng)?;
// Party b: generate a shared secret `ss_a` and ciphertext `ct` from the public key `pk`
crypto_kem_enc(&mut ct, &mut ss_a, &mut pk, &mut rng)?;
// Party a: derive the same shared secret `ss_b` from the ciphertext `ct` and the secret key `sk`
crypto_kem_dec(&mut ss_b, &mut ct, &mut sk)?;
assert_eq!(ss_a, ss_b);
Ok(())
}
如何运行它?
此库包含两个示例
$ cargo run --example simple
pqcgenkat_kem
示例实现了NIST PQC框架的一部分经典请求/响应文件结构。
$ cargo run --example pqcgenkat_kem
$ ls *.r??
PQCkemKAT_2304.req PQCkemKAT_2304.rsp
$ tail -n 2 PQCkemKAT_2304.rsp
ss = E5256B4F25816367FBE235E47C25ABB78195CEF7DE3F9C77926839F209CDF652
不同的变体可以通过功能标志启用
$ cargo run --example pqcgenkat_kem --features lightsaber
$ ls *.r??
PQCkemKAT_1568.req PQCkemKAT_1568.rsp
saber
是默认变体。不幸的是,您不能同时启用两个变体。
这是否正确?
是的。您可以使用以下命令运行单元测试
$ cargo test --features cref,lightsaber
$ cargo test --features cref
$ cargo test --features cref,firesaber
它比较函数调用的输出与它的C等价物。除了单元测试外,您还可以生成 pqcgenkat_kem
请求/响应文件,并将它们与由C参考实现生成的文件进行比较。我们已经验证它们是等效的。
它快吗?
是的,但它的运行时间比C实现多大约16.2%。在这里,数据总是以时钟周期为单位提及。Rust实现的以下时钟周期计数特性(越小越好)
完整的KEM | 密钥对 | 加密 | 解密 | |
光剑 | 329,964 | 86,665 | 116,139 | 121,433 |
剑 | 586,544 | 182,183 | 216,528 | 232,882 |
火剑 | 923,330 | 282,467 | 318,043 | 335,297 |
C参考实现的以下时钟周期计数特性(越小越好)
完整的KEM | 密钥对 | 加密 | 解密 | |
光剑 | 284,558 | 72,785 | 95,936 | 115,837 |
剑 | 509,361 | 140,370 | 174,995 | 193,996 |
火剑 | 785,548 | 222,955 | 268,561 | 294,032 |
测试是在联想ThinkPad x260(Intel Core i5-6200U CPU @ 2.30GHz)上进行的。在Rust的情况下,使用了如benches/
中所示的criterion 0.3.5,而在C的情况下,使用了参考实现提供的带有TSC寄存器的原始代码。在运行实验之前,我已禁用CPU频率调节。您可以使用bench
子命令,cref
功能和可选的某些变体功能标志来运行基准测试套件。
$ cargo bench --features cref,lightsaber
$ cargo bench --features cref
$ cargo bench --features cref,firesaber
源代码在哪里?
在GitHub上。
内容的许可是什么?
变更日志
- 版本1.0.0:公开发布
我可以在哪里要求修复一个错误?
在GitHub上。
依赖项
~1.5MB
~20K SLoC