3 个稳定版本
1.0.2 | 2024 年 4 月 25 日 |
---|
#620 in 密码学
125KB
1K SLoC
kemkem
A rust implementation of ML-KEM, Modular Lattice-based Key Encapsulation Mechanism. This is a post-quantum assymetric encryption scheme for sharing keys, and its difficulty is based on the hardness of the Modular Learning With Errors (M-LWE) problem.
它具有以下特性
- 直观的 API,参数被去混淆,序列化被显式处理
- 支持所有 3 个参数集
- MlKem512
- MlKem768
- MlKem1024
- 针对所有 3 个可能的参数集的通用实现(Const Generic Expressions)
- 二进制文件,用于模拟带有和没有序列化的整个过程,以及用于跟踪单个步骤性能的基准测试。
!! 重要 !!
该项目考虑到安全性,但尚未经过独立审计。测试保证每个主要 ML-KEM 函数(KeyGen、Encaps、Decaps)按预期工作,并且 seeded_test.rs
测试使用预定义的种子运行整个过程,并将中间输出与公开可用的集进行比较。
然而,已经表明,该项目基于的标准 FIPS 203,目前对密钥生成和隐式拒绝随机数生成存在一些时间攻击漏洞。到目前为止,我的实现也存在同样的缺点。
因此,请自行承担风险使用,强烈建议不要在生产环境中使用。
用法
该方案包括 3 个主要步骤,从 A 方生成密钥,B 方进行共享密钥封装,以及 A 方解封装共享密钥。
use kemkem::{mlkem::*, params::*};
// Key Generation (Party A)
let (ek, dk) = key_gen::<MlKem1024>();
// Encapsulation (Party B)
let (key, c) = encaps::<MlKem1024>(ek);
// Decapsulation (Party A)
let key = decaps::<MlKem1024>(c,dk);
序列化对于在各方之间实际发送数据是必需的,kemkem 提供了相应的特性。
use kemkem::{mlkem::*, params::*, serialize:: *};
// Key Generation (Party A)
let (ek, dk) = key_gen::<MlKem1024>();
let ek_bytes = ek.serialize();
// Encapsulation (Party B)
let ek = MlkemEncapsulationKey::<{MlKem1024::K}>::deserialize(&ek_bytes);
let (key, c) = encaps::<MlKem1024>(ek);
let c_bytes = c.serialize();
// Decapsulation (Party A)
let c = MlKemCyphertext::<{MlKem1024::K}, {MlKem1024::D_U}, {MlKem1024::D_V}>::deserialize(&c_bytes);
let key = decaps::<MlKem1024>(c,dk);
参数选择可以通过简单的匹配动态进行
let (ek, dk) = match param_set {
"512" => key_gen::<MlKem512>(),
"768" => key_gen::<MlKem768>(),
"1024" => key_gen::<MlKem1024>(),
_ => panic!("Invalid parameter set")
};
基准测试
对于 MlKem768 参数集
步骤 | 时间 (µs) |
---|---|
KeyGen |
78.3 |
Encaps |
82.2 |
Decaps |
104.7 |
*不进行序列化 |
此测试在我的 AMD Ryzen 7 1700X 上运行,可以使用 cargo bench
进行复制。我决定不在表中包含其他实现,因为我刚开始学习 Rust,无法确保我已经进行了公平的比较。但是,我在我的机器上运行 libcrux
的 ML-KEM-768 基准测试,除了 Decaps 外,其他时间都非常相似,Decaps 运行在 ~70µs
。
依赖项
~2.5MB
~38K SLoC