跳到主要内容

1. 简介 (Introduction)

基于模块格的密钥封装机制 (Module-Lattice-Based Key-Encapsulation Mechanism, ML-KEM) 是一种 IND-CCA2 安全的密钥封装机制 (Key Encapsulation Mechanism, KEM), 由 NIST PQC Project [NIST-PQ] 在 [FIPS203] 中标准化. ML-KEM 是最终标准化版本的名称, 与通常称为 "Kyber" 的标准前版本不兼容.

[RFC9629] 定义了 KEMRecipientInfo 结构, 用于在 CMS enveloped-data 内容类型, CMS authenticated-data 内容类型和 CMS authenticated-enveloped-data 内容类型中使用 KEM 算法. 本文档规定在 KEMRecipientInfo 结构中直接使用 [FIPS203] 的三个参数集, 即 ML-KEM-512, ML-KEM-768 和 ML-KEM-1024. 本文档既不处理也不排除将 ML-KEM 作为任何混合方案一部分使用.

1.1. 约定和术语 (Conventions and Terminology)

本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" 和 "OPTIONAL" 仅当它们像此处这样以全大写形式出现时, 才应按 BCP 14 [RFC2119] [RFC8174] 中的说明解释.

1.2. ML-KEM

ML-KEM 是一种基于格的 KEM, 使用 Module Learning with Errors 作为底层原语. 这是一种结构化格变体, 可提供良好性能以及相对较小且均衡的密钥和密文大小. ML-KEM 标准化了三个参数集: ML-KEM-512, ML-KEM-768 和 ML-KEM-1024. 各安全级别的参数被选择为至少分别达到通用 128-bit, 192-bit 或 256-bit 分组密码的安全性. 附录 B 提供了关于 ML-KEM 安全级别和大小的更多信息.

所有 KEM 算法都提供三个函数: KeyGen(), Encapsulate() 和 Decapsulate().

下面概述 ML-KEM 算法的这三个函数, 并引用 [FIPS203] 中的对应函数:

KeyGen() -> (ek, dk) : 生成公共封装密钥 (ek) 和私有解封装密钥 (dk). [FIPS203] 为 ML-KEM 私钥规定了两种格式: 64-octet 种子 (d,z) 和(展开的)私有解封装密钥 (dk). [FIPS203] 中的 Algorithm 19 (ML-KEM.KeyGen()) 生成公共封装密钥 (ek) 和私有解封装密钥 (dk). 另一种方式是先生成种子 (d,z), 再展开该种子以得到密钥; 此时 [FIPS203] 中的 Algorithm 16 (ML-KEM.KeyGen_internal(d,z)) 将种子展开为 ek 和 dk. 私钥编码注意事项见 [RFC9935] 第 6 节.

Encapsulate(ek) -> (c, ss) : 给定接收者的公钥 (ek), 生成要传递给接收者的密文 (c), 以及供发起者使用的共享秘密 (ss). [FIPS203] 中的 Algorithm 20 (ML-KEM.Encaps(ek)) 是 ML-KEM 的封装函数.

Decapsulate(dk, c) -> ss : 给定私钥 (dk) 和密文 (c), 为接收者生成共享秘密 (ss). [FIPS203] 中的 Algorithm 21 (ML-KEM.Decaps(dk,c)) 是 ML-KEM 的解封装函数. 如果私钥以种子形式存储, 则第一步可能需要使用 ML-KEM.KeyGen_internal(d,z) 来计算 dk. 如果私钥同时以种子格式和展开格式存储, 一致性注意事项见 [RFC9935] 第 8 节.

ML-KEM 的所有安全级别都在内部使用 SHA3-256, SHA3-512, SHAKE128 和 SHAKE256.