1个不稳定版本
0.1.0 | 2023年1月17日 |
---|
#1646 in 加密学
310KB
7.5K SLoC
Kyber
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