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密码学 中排名

Download history 317/week @ 2024-06-25 112/week @ 2024-07-02 22/week @ 2024-07-09

每月189次下载
capycrypt中使用

MIT 许可证

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:简短

  1. 将K-PKE.KeyGen重命名为K-PKE.ExpandPrivate;删除第1、2行;并添加rho和sigma作为参数。
  2. 将ML-KEM.KeyGen重命名为ML-KEM.ExpandPrivate;添加32字节的g作为参数;在第二行调用K-PKE.ExpandPrivate而不是K-PKE.KeyGen,传递rho和sigma;并将第一行替换为:$(\rho, \sigma, z) = J(g)$
  3. 定义一个新的ML-KEM.KeyGen如下
g <$- B^32
ek, dk = ML-KEM.ExpandPrivate(g)
return (ek, g)
  1. 将ML-KEM.Decaps修改为接受32字节g作为参数,而不是dk。在第一行之前添加
_, dk = ML-KEM.ExpandPrivate(g)

解决方案2:紧密集成和可读性,更接近实际实现

  1. 将K-PKE.KeyGen重命名为K-PKE.ExpandPrivate;删除1、2、20和21行;添加rho和sigma作为参数;并返回(^A, ^t, ^s)。

  2. 添加一个新函数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)
  1. 将ML-KEM.KeyGen修改为
dk <$- B^32
(^A, ^t, ^s, ek, h, z) = ML-KEM.UnpackPrivate(dk)
ek = ByteEncode_12(^t) || rho
return (ek, dk)
  1. 将K-PKE.Encrypt修改为直接接受^A和^t,而不是ek_PKE,删除2-8行。
  2. 将K-PKE.Decrypt修改为直接接受^s作为参数,而不是dk_PKE,删除5行。
  3. 将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行)。

  1. 将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