#key #parameters #encapsulation #ml-kem #shared-key #generic #serialization

nightly bin+lib kemkem

未经验证、未优化且相当不规范的 ML-KEM 实现

3 个稳定版本

1.0.2 2024 年 4 月 25 日

#620 in 密码学

MIT 许可证

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