4个版本
0.1.9 | 2024年7月7日 |
---|---|
0.1.7 | 2024年6月28日 |
0.1.6 | 2024年6月28日 |
0.1.5 | 2024年6月28日 |
1089 在 密码学 中排名
每月189次下载
在capycrypt中使用
50KB
1K SLoC
capyKEM - 量子抗性算法设计的研究
此仓库是对FIPS 203 (草案)的纯Rust、无std解释,该解释利用一个基于模块学习错误的构建,旨在提供一种安全的关键交换手段,以应对潜在的量子对手。
此库为草案版本,不适用于实际使用。它存在是为了学术实验和增强作者对后量子安全概念的理解。
当前工作项
- 将编码/解码压缩为单个函数
- 参数化编码/解码函数
- 第1部分:实现API级别的函数
- 第2部分:根据以下分析使它们基于MAL-BIND安全
- 以FIPS风格编写文档
- 支持其他两个参数集
- 参数化sample_poly_cbd关于eta
- 将
Vec
的使用替换为hybridarray
超越IND-CCA的概念
Schmieg在这里证明,由于私钥序列化和固定的方式,可能会发生错误绑定属性,这是使用单个种子生成私钥的结果,因此ML-KEM-768(推广到其他变体)不是MAL-BIND-K-CT或MAL-BIND-K-PK安全的。这个结论是从这篇论文中得出的,该论文引入了扩展到IND-CCA之外的马尔-绑定安全概念。
NIST现在提议对FIPS 203 IPD进行以下修改
"我们提议ML-KEM使用单个32字节种子作为解封装密钥,从中扩展rho、sigma和z。
这更小、更简单。更简单,因为我们不需要考虑解封装密钥的格式化或验证。特别是,它确保ML-KEM是MAL-BIND-K-CT和MAL-BIND-K-PK。
FIPS 203 IPD的提议更新
IPD目前指定在解封装之前解包密钥扩展,并预先计算$A$
"packed" unpack ready-to-use keygen
decaps key: --------> decaps key: <--------- 64 byte seed
s, ek, H(ek), z s, ek, H(ek), z, A d, z
NIST的提议是简化此过程
"packed" unpack=keygen ready-to-use
decaps key: --------> decaps key:
g s, ek, H(ek), z, A
但要注意
为了明确起见,我们不提议FIPS 203指定此两步方法。它只是不应阻止它。
实施途径
建议两种应用提议更新的方法
解决方案1:简短
- 将K-PKE.KeyGen重命名为K-PKE.ExpandPrivate;删除第1、2行;并添加rho和sigma作为参数。
- 将ML-KEM.KeyGen重命名为ML-KEM.ExpandPrivate;添加32字节的g作为参数;在第二行调用K-PKE.ExpandPrivate而不是K-PKE.KeyGen,传递rho和sigma;并将第一行替换为:$(\rho, \sigma, z) = J(g)$
- 定义一个新的ML-KEM.KeyGen如下
g <$- B^32
ek, dk = ML-KEM.ExpandPrivate(g)
return (ek, g)
- 将ML-KEM.Decaps修改为接受32字节g作为参数,而不是dk。在第一行之前添加
_, dk = ML-KEM.ExpandPrivate(g)
解决方案2:紧密集成和可读性,更接近实际实现
-
将K-PKE.KeyGen重命名为K-PKE.ExpandPrivate;删除1、2、20和21行;添加rho和sigma作为参数;并返回(^A, ^t, ^s)。
-
添加一个新函数ML-KEM.UnpackPrivate,它接受32字节种子dk作为参数,并执行以下操作
SHAKE-256: $(\rho, \sigma, z) = J(dk)$
^A, ^t, ^s = K-PKE.ExpandPrivate(rho, sigma)
ek = ByteEncode_12(^t) || rho
return (^A, ^t, ^s, ek, H(ek), z)
- 将ML-KEM.KeyGen修改为
dk <$- B^32
(^A, ^t, ^s, ek, h, z) = ML-KEM.UnpackPrivate(dk)
ek = ByteEncode_12(^t) || rho
return (ek, dk)
- 将K-PKE.Encrypt修改为直接接受^A和^t,而不是ek_PKE,删除2-8行。
- 将K-PKE.Decrypt修改为直接接受^s作为参数,而不是dk_PKE,删除5行。
- 将ML-KEM.Decaps修改为接受缩短的32字节dk。将1-4行替换为
(^A, ^t, ^s, ek, h, z) = ML-KEM.UnpackPrivate(dk)
并将^s而不是dk_PKE传递给K-PKE.Decrypt(第7行);将^A和^t而不是ek_PKE传递给K-PKE.Encrypt(第8行)。
- 将ML-KEM.Encaps修改为包含从K-PKE.Encrypt删除的2-8行,在调用K-PKE.Encrypt之前,将^A和^t而不是ek_PKE传递给它。
(可能)后量子安全密码系统
我们的较大密码学算法库将ML-KEM-768与SHA3-sponge构造相结合,用于量子安全的公钥密码系统。它通过使用基于量子对手难以解决的问题的KEM和sponge原语,提供了理论上的量子安全性。该设计将KEM共享的秘密和会话nonce用于初始化SHA-3 sponge,从而便于任意长度消息的高性能对称加密/解密。
我们的构造是非标准的,尚未经过同行评审,并且缺乏任何正式审计。这是一个正在进行的工作,仅支持推荐的NIST-II安全参数集768。此外,当前的FIPS 203 IPD(正如其名称所示),是一个草案,关于安全实现的最终细节可能会发生变化。我们的设计目前仅存在于这个库中,纯粹是作为一种学术好奇心。请自行承担风险,我们不提供安全性、可靠性或效率的保证。
致谢
这个KEM库受到了Filippo Valsorda的优秀ML-KEM文章和go实现的启发,以及伟大的Tony Arcieri等人始终出色的rust-crypto实现在这里。
依赖关系
~1.8–2.5MB
~38K SLoC