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

no-std cosmian_kyber

后量子Kyber KEM算法的Rust实现。这是crate的分支。

1个不稳定版本

0.1.0 2023年1月17日

#1646 in 加密学

MIT/Apache

310KB
7.5K SLoC

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

Kyber

Build Status Crates NPM License

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

本库

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

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

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

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

最低支持的Rust版本:1.47.0


安装

Cargo.toml

[dependencies]
cosmian_kyber = "0.1.0"

使用

use cosmian_kyber::*;

在x86平台上进行优化时,启用avx2功能和以下RUSTFLAGS

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

高级密钥交换结构对于大多数用例都是合适的。


单方认证密钥交换

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);

相互认证密钥交换

相互认证遵循相同的流程,但向函数传递了额外的密钥。

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);

密钥封装

用于直接使用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);

错误

KyberError枚举有两个变体

  • InvalidInput - 函数的一个或多个输入大小不正确。可能的原因是在尝试协商密钥交换时,双方使用不同的安全级别。

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


特性

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

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

测试

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"

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


基准测试

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

有关正确使用的信息,请参阅 基准测试说明

您需要使用 benchmarking 功能


模糊测试

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


WebAssembly

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

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

它也位于 wasm 说明

安装

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算法一起在混合密钥交换系统中使用,而不是单独使用。

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

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

您还可以在这里查看OpenSSH如何使用C语言实现此类系统:此处

请自行承担风险。


关于

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

官方网站: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(法国)

贡献

欢迎贡献。对于pull requests,请创建一个功能分支并将其提交到开发分支。更多信息请参阅贡献页面

依赖关系

~0–10MB
~99K SLoC