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

no-std pqc_kyber

后量子 Kyber KEM 算法的 Rust 实现

8 个版本 (5 个破坏性版本)

0.7.1 2023 年 8 月 23 日
0.7.0 2023 年 8 月 15 日
0.6.0 2023 年 4 月 17 日
0.5.0 2023 年 3 月 16 日
0.2.0 2021 年 5 月 24 日

⚠️ 已报告问题

#59密码学

Download history 6252/week @ 2024-03-14 8491/week @ 2024-03-21 4194/week @ 2024-03-28 5793/week @ 2024-04-04 5551/week @ 2024-04-11 3748/week @ 2024-04-18 4162/week @ 2024-04-25 4746/week @ 2024-05-02 4259/week @ 2024-05-09 5946/week @ 2024-05-16 5041/week @ 2024-05-23 4191/week @ 2024-05-30 3884/week @ 2024-06-06 4954/week @ 2024-06-13 5010/week @ 2024-06-20 3050/week @ 2024-06-27

17,829 每月下载量
7crate中使用(5个直接使用)

MIT/Apache

300KB
7.5K SLoC

Rust 5.5K SLoC // 0.0% comments GNU Style Assembly 625 SLoC // 0.1% comments Assembly 606 SLoC // 0.0% comments JavaScript 601 SLoC // 0.1% comments Bitbake 99 SLoC // 0.0% comments TypeScript 50 SLoC // 0.5% comments

Kyber

Build Status Crates NPM License dependency status

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

本库

  • 与 no_std 兼容,无需分配器,适用于嵌入式设备。
  • 参考文件不包含不安全代码,并使用纯 Rust 编写。
  • 在 x86_64 平台上提供 avx2 优化版本,其中包含来自 C 参考仓库的汇编代码。
  • 使用 wasm-bindgen 编译为 WASM,并在 NPM 上发布了可用的二进制文件。

有关安全级别和操作模式的选项,请参阅功能部分。默认安全设置是 kyber768。

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

请在使用前阅读安全考虑

最低支持的 Rust 版本:1.56.0


安装

cargo add pqc_kyber

用法

use pqc_kyber::*;

对于 x86 平台的优化,启用 avx2 功能和以下 RUSTFLAGS

export RUSTFLAGS="-C target-feature=+aes,+avx2,+sse2,+sse4.1,+bmi2,+popcnt"

密钥封装

// 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 - 无法验证密文。无法解封装共享密钥。

  • RandomBytesGeneration - 尝试填充随机字节时出错(即外部(硬件)RNG 模块可能失败)。


功能

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

[dependencies]
pqc_kyber = {version = "0.7.1", features = ["kyber512", "90s", "avx2"]}
功能 描述
std 启用标准库
kyber512 启用 kyber512 模式,安全级别大致相当于 AES-128。
kyber1024 启用 kyber1024 模式,安全级别大致相当于 AES-256。如果指定了多个安全级别,则会引发编译时错误。
90s 使用计数器模式的 AES256 和 SHA2 替代 SHAKE。这在某些情况下可以提供硬件加速。
90s-fixslice 使用 RustCrypto 的 AES256 fixslice 实现方式,这提供了更强的侧信道攻击抵抗力,尤其是在嵌入式平台上。
avx2 在 x86_64 平台上启用优化版本。在其他架构上设置此标志会导致编译错误。
wasm 用于编译到 WASM 目标。
nasm 使用 Netwide Assembler avx2 代码替代 GAS,以提高可移植性。需要 nasm 编译器:[https://www.nasm.us/](https://www.nasm.us/)
zeroize 这将使用 zeroize 库在释放时将密钥交换结构清零。
benchmarking 启用 criterion 基准测试套件。

Testing

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

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

# This example runs the basic tests for kyber768
cargo test

# This runs the KATs for kyber512 in 90's mode
RUSTFLAGS='--cfg kyber_kat' cargo test --features "kyber512 90s"

有关更多信息,请参阅 testing readme


Benchmarking

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

您需要启用 benchmarking 功能。

有关正确使用方法的信息,请参阅 benchmarking readme


Fuzzing

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


WebAssembly

此库已编译成 WebAssembly 并作为 npm 包发布。使用说明在这里。

https://npmjs.net.cn/package/pqc-kyber

它也位于 wasm readme

安装

npm i pqc-kyber

要自行编译 wasm 文件,您需要启用 wasm 功能。

例如,使用 wasm-pack

wasm-pack build -- --features wasm

它将导出 wasm、javascript 和 typescript 文件到 ./pkg/

将不同的变体编译到单独的文件夹

wasm-pack build --out-dir pkg_kyber512/ -- --features "wasm kyber512" 

www 文件夹中还有一个基本的 html 示例。

从 www 文件夹运行

npm run start

安全考虑

虽然已经尽可能地将 C 参考代码库移植过来,但此库尚未经过任何第三方安全审计,也无法保证 LWE 密码学或由此实现导致的潜在侧信道攻击的可能性。

Kyber 相对较新,建议在与 X25519 等传统算法的混合密钥交换系统中使用 Kyber,而不是单独使用。

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

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

您还可以在这里看到OpenSSH如何用C语言实现这样一个系统:[在这里](https://github.com/openssh/openssh-portable/blob/a2188579032cf080213a78255373263466cb90cc/kexsntrup761x25519.c)。

请自行承担风险。


关于

Kyber是一个IND-CCA2安全密钥封装机制(KEM),其安全性基于在模格上解决学习错误(LWE)问题的难度。它是NIST后量子密码学项目的最终标准化算法。[NIST后量子密码学项目](https://csrc.nist.gov/Projects/Post-Quantum-Cryptography)。

官方网站:[https://pq-crystals.org/kyber/](https://pq-crystals.org/kyber/)

Kyber算法的作者

  • Roberto Avanzi,ARM Limited(德国)
  • Joppe Bos,NXP Semiconductors(比利时)
  • Léo Ducas,CWI Amsterdam(荷兰)
  • Eike Kiltz,Ruhr University Bochum(德国)
  • Tancrède Lepoint,SRI International(美国)
  • Vadim Lyubashevsky,IBM Research Zurich(瑞士)
  • John M. Schanck,University of Waterloo(加拿大)
  • Peter Schwabe,Radboud University(荷兰)
  • Gregor Seiler,IBM Research Zurich(瑞士)
  • Damien Stehle,ENS Lyon(法国)

贡献

欢迎贡献。对于拉取请求,请创建功能分支并将其提交到开发分支。更多信息请参阅[贡献页面](https://github.com/argyle-software/kyber/blob/d18fd65f459c0c5a290f6a0bc1a5832d3528af69/contributing.md)。


替代方案

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

[https://github.com/rustpq/pqcrypto](https://github.com/rustpq/pqcrypto)

依赖

~0–10MB
~100K SLoC