#后量子密码学 #后量子 # #pqc #依赖

rusty-saber

后量子方案Saber的纯Rust实现

1个稳定版本

1.0.0 2022年3月5日

#1894 in 密码学

MIT许可证

140KB
3.5K SLoC

Rust 2K SLoC // 0.0% comments C 1K SLoC // 0.1% comments

包含 (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"] }

三个变体的功能标志分别称为lightsabersaberfiresaber

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,96486,665116,139121,433
586,544182,183216,528232,882
火剑923,330282,467318,043335,297

C参考实现的以下时钟周期计数特性(越小越好)

完整的KEM密钥对加密解密
光剑284,55872,78595,936115,837
509,361140,370174,995193,996
火剑785,548222,955268,561294,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上。

内容的许可是什么?

MIT许可

变更日志

  • 版本1.0.0:公开发布

我可以在哪里要求修复一个错误?

GitHub上。

依赖项

~1.5MB
~20K SLoC