#密钥交换 #后量子密码学 #后量子 #kyber #kem #kex

no-std safe_pqc_kyber

基于pqc_kyber进行一些安全修复的分支

3个版本

0.6.3 2024年6月20日
0.6.2 2023年12月30日
0.6.1 2023年5月19日

加密学 中排名第108

Download history 12/week @ 2024-04-22 7/week @ 2024-04-29 7/week @ 2024-05-06 21/week @ 2024-05-13 45/week @ 2024-05-20 57/week @ 2024-05-27 28/week @ 2024-06-03 29/week @ 2024-06-10 178/week @ 2024-06-17 48/week @ 2024-06-24 17/week @ 2024-07-01 3/week @ 2024-07-08 20/week @ 2024-07-15 77/week @ 2024-07-22 147/week @ 2024-07-29 92/week @ 2024-08-05

每月下载量336
用于 7 个crate(4个直接使用)

MIT/Apache

120KB
2.5K SLoC

Rust 2K SLoC // 0.3% comments JavaScript 477 SLoC // 0.1% comments TypeScript 50 SLoC // 0.5% comments

Kyber

Build Status Crates License dependency status

这是Argyle-Software的Kyber crate的保守分支。

Kyber算法的Rust实现,该算法由NIST后量子标准化项目标准化。

本库

  • 与no_std兼容,不需要分配器,适用于嵌入式设备。
  • 参考文件不包含不安全代码,并使用纯Rust编写。
  • 使用wasm-bindgen编译为WASM,并在NPM上发布了可用的二进制文件。

有关安全级别和工作模式的不同选项,请参阅特性部分。默认安全设置是kyber768。

建议将Kyber与传统的密钥交换算法(如X25519)一起用于混合系统。

请在使用前阅读安全注意事项

最低支持的Rust版本:1.56.0


安装

cargo add safe_pqc_kyber

使用

use safe_pqc_kyber::*;

密钥封装

// Generate Keypair
let keys_bob = keypair(&mut rng);

// Alice encapsulates a shared secret using Bob's public key
let (ciphertext, shared_secret_alice) = encapsulate(&keys_bob.public, &mut rng)?;

// Bob decapsulates a shared secret using the ciphertext sent by Alice 
let shared_secret_bob = decapsulate(&ciphertext, &keys_bob.secret)?;

assert_eq!(shared_secret_alice, shared_secret_bob);

单方面认证密钥交换

let mut rng = rand::thread_rng();

// Initialize the key exchange structs
let mut alice = Uake::new();
let mut bob = Uake::new();

// Generate Bob's Keypair
let bob_keys = keypair(&mut rng);

// Alice initiates key exchange
let client_init = alice.client_init(&bob_keys.public, &mut rng);

// Bob authenticates and responds
let server_response = bob.server_receive(
  client_init, &bob_keys.secret, &mut rng
)?;

// Alice decapsulates the shared secret
alice.client_confirm(server_response)?;

// Both key exchange structs now have the same shared secret
assert_eq!(alice.shared_secret, bob.shared_secret);

相互认证密钥交换

遵循相同的流程,除了Bob需要Alice的公钥

let mut alice = Ake::new();
let mut bob = Ake::new();

let alice_keys = keypair(&mut rng);
let bob_keys = keypair(&mut rng);

let client_init = alice.client_init(&bob_keys.public, &mut rng);

let server_response = bob.server_receive(
  client_init, &alice_keys.public, &bob_keys.secret, &mut rng
)?;

alice.client_confirm(server_response, &alice_keys.secret)?;

assert_eq!(alice.shared_secret, bob.shared_secret);

错误

KyberError枚举有两个变体

  • InvalidInput - 函数的一个或多个输入大小不正确。这种情况可能是两方在尝试协商密钥交换时使用了不同的安全级别。

  • Decapsulation - 无法认证密文。共享秘密没有被解封装。


特性

如果没有指定安全级别,则默认使用kyber768,这是作者推荐的。它大致相当于AES-192。除了两个安全级别外,所有其他功能可以根据需要组合。例如

[dependencies]
safe_pqc_kyber = {version = "0.6.0", features = ["kyber512"]}
特性 描述
std 启用标准库
kyber512 启用kyber512模式,安全级别大致相当于AES-128。
kyber1024 启用kyber1024模式,安全级别大致相当于AES-256。如果指定了多个安全级别,则会在编译时引发错误。
wasm 编译为WASM目标
清除 使用zeroize crate在释放时将清除密钥交换结构
基准测试 启用criterion基准测试套件

测试

run_all_tests 脚本将通过运行安全级别、变体和crate功能的矩阵来遍历所有可能的代码路径。

已知答案测试需要确定性的rng种子,在RUSTFLAGS中启用kyber_kat以使用它们。在cargo test之外使用此功能将导致编译时错误。测试向量文件相当大,您需要从C参考代码自行构建它们。这里有一个辅助脚本来完成此操作这里

# This example runs the basic tests for kyber768
cargo test

有关更全面的信息,请参阅测试readme


基准测试

使用criterion进行基准测试。如果您已安装GNUPlot,它将在./target/criterion/中生成统计图表。

您需要启用benchmarking功能。

有关正确使用方法的信息,请参阅基准测试readme


模糊测试

模糊测试套件使用honggfuzz,安装和说明在模糊测试页面。


安全考虑

虽然已经尽最大努力从C参考代码库迁移,但此库尚未经过任何第三方安全审计,也不能对LWE密码学中的潜在底层漏洞或由此实现产生的潜在侧信道攻击做出任何保证。

Kyber相对较新,建议在X25519等传统算法旁边将其用于混合密钥交换系统,而不是单独使用。

关于进一步阅读,IETF有关于TLS 1.3中混合密钥交换的草案

https://www.ietf.org/archive/id/draft-ietf-tls-hybrid-design-04.html

您还可以在OpenSSH中查看此类系统的实现方式这里

请自行承担风险。


关于

Kyber是一种IND-CCA2安全的密钥封装机制(KEM),其安全性基于解决模格学习错误(LWE)问题的难度。它是NIST后量子密码学项目的最终标准化算法。

官方网站:https://pq-crystals.org/kyber/

Kyber算法的作者

  • Roberto Avanzi,ARM Limited(DE)
  • Joppe Bos,NXP Semiconductors(BE)
  • Léo Ducas,CWI Amsterdam(NL)
  • Eike Kiltz,Ruhr University Bochum(DE)
  • Tancrède Lepoint,SRI International(US)
  • Vadim Lyubashevsky,IBM Research Zurich(CH)
  • John M. Schanck,University of Waterloo(CA)
  • Peter Schwabe,Radboud University(NL)
  • Gregor Seiler,IBM Research Zurich(CH)
  • Damien Stehle,ENS Lyon(FR)

贡献

欢迎贡献。对于pull请求,请创建功能分支并将其提交到开发分支。更多信息可在贡献页面上找到。


替代方案

PQClean项目为其Kyber C代码库提供了rust绑定

https://github.com/rustpq/pqcrypto

依赖关系

~0–11MB
~97K SLoC