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