密钥封装机制(KEM):从 RSA-OAEP 到 ML-KEM 的统一抽象

密码学概念 · 2026-10-19

1. 引言:为什么需要 KEM?

在现代密码系统中,密钥管理始终是一个核心难题。传统的对称加密方案(如 AES)要求通信双方预先共享密钥,而公钥加密方案(如 RSA)虽然解决了密钥分发问题,但直接加密长消息效率低下。

密钥封装机制(Key Encapsulation Mechanism, KEM) 应运而生。KEM 是一种专门的公钥密码原语,其目标不是直接加密消息,而是安全地封装(encapsulate)一个随机对称密钥,然后由接收方解封(decapsulate)获得该密钥。封装得到的密文称为封装密钥(ECC — Encapsulated Key Cipher),解封得到的密钥称为共享密钥(Shared Secret)。

KEM 的核心价值在于:

  • 分离关注点:将"密钥交换"与"消息加密"解耦,符合现代密码学模块化设计原则
  • 安全性证明更简洁:KEM 的安全性模型(IND-CCA2)比 SEM(Semantic Encryption)更贴合实际应用
  • 后量子密码的标准抽象:NIST PQC 标准化项目中的所有 KEM 候选算法(ML-KEM、NTRU-HPS、BIKE 等)均采用 KEM 框架

2. 形式化定义

2.1 KEM 的三个算法

一个 KEM 方案由三个多项式时间算法组成:

CODE
KEM = (KeyGen, Encaps, Decaps)

KeyGen(1^λ) → (pk, sk):

  • 输入:安全参数 λ
  • 输出:公钥 pk 和私钥 sk
Encaps(pk) → (ct, k):
  • 输入:公钥 pk
  • 输出:封装密钥(密文)ct 和随机对称密钥 k ∈ {0,1}^n(n 为密钥长度)
Decaps(sk, ct) → k' 或 ⊥:
  • 输入:私钥 sk 和封装密钥 ct
  • 输出:解封密钥 k',若 ct 无效则返回 ⊥
正确性要求:对任意 (pk, sk) ← KeyGen(1^λ),有 $$\Pr[\text{Decaps}(sk, \text{Encaps}(pk)) = k] = 1$$

2.2 KEM 与 SEM 的关系

KEM 与传统的语义加密方案(SEM,也称为 PEM — Plaintext Encapsulating Mechanism)密切相关:

特性KEMSEM/PEM
输入pkpk, m
输出(ct, k)ct
解封Decaps(sk, ct) → kDecrypt(sk, ct) → m
适用场景密钥交换直接加密消息
转换关系:
  • KEM → SEM:使用封装密钥 k 作为 AES-GCM 的会话密钥,采用 Encrypt-then-MAC 模式加密消息
  • SEM → KEM:取 k = Decrypt(sk, ct) 的前 n 位作为封装密钥(需确保半完整性)
在实际应用中,KEM 更受欢迎,因为它天然适合密钥协商场景,且安全性证明更清晰。

3. 安全性模型:IND-CCA2

3.1 安全性游戏

KEM 的安全性定义为_indistinguishability under chosen-ciphertext attack_(IND-CCA2)。安全性游戏如下:

CODE
1. 挑战者运行 KeyGen(1^λ) 生成 (pk, sk),将 pk 发送给对手
2. 挑战者运行 Encaps(pk) 生成 (ct*, k*),将 ct* 发送给对手
3. 对手(拥有解密预言机)可以查询 Decaps(sk, ct) 对任意 ct ≠ ct*
4. 挑战者随机选择 b ←R {0,1},设置 k_b* = k*(若 b=0)或 k_b* ←R {0,1}^n(若 b=1)
5. 对手输出 b',若 b' = b 则获胜

优势定义: $$\text{Adv}_{\text{KEM}}^{\text{ind-cca2}}(\mathcal{A}) = \left|\Pr[b' = b] - \frac{1}{2}\right|$$

一个 KEM 是 IND-CCA2 安全的,如果对任意多项式时间对手 $\mathcal{A}$,上述优势都是可忽略的。

3.2 与 SEM 安全性对比

安全性级别KEMSEM
被动攻击IND-CPASEM-CPA
主动攻击IND-CCA2SEM-CCA
关键区别:KEM 的 IND-CCA2 安全性允许对手在获得挑战封装密钥 ct* 后,查询其他密文的解封预言机。这比 SEM 的 SEM-CCA 更贴近实际攻击场景(如 TLS 中的 Bleichenbacher 攻击)。

4. 经典 KEM 实例

4.1 RSAES-OAEP

RSAES-OAEP(Optimistic Asymmetric Encryption Padding)是最经典的 KEM 实现之一,定义于 RFC 8017(PKCS #1 v2.2)。

算法描述:

安全性证明:RSAES-OAEP 在随机预言机模型下等价于 RSA 问题的困难性(FO 变换,Fujisaki-Okamoto)。

4.2 ECDH-KEM

基于椭圆曲线的 KEM(ECDH-KEM)是利用 ECDH 密钥协商构建 KEM 的标准方式。

构造方法(RFC 5903):

安全性:ECDH-KEM 的安全性依赖于 GDH(Generalized Diffie-Hellman) 假设,在随机预言机模型下可达 IND-CCA2。

5. 后量子 KEM:ML-KEM(原 Kyber)

5.1 ML-KEM 概述

ML-KEM(Module-Lattice-Based Key-Encapsulation Mechanism)是 NIST PQC 标准化项目中选定的首选 KEM 算法,原名为 Kyber。它基于模块格(Module Lattice)上的 learning with errors(LWE)问题。

核心参数(NIST Level 1,对应 AES-128 安全强度):

参数值
维度 k2
多项式环阶 d256
素数 q3329
错误分布 η1
封装密钥长度768 字节
共享密钥长度32 字节

5.2 ML-KEM 算法流程

5.3 ML-KEM 的安全性基础

ML-KEM 的安全性基于模块学习误差(Module-LWE)问题的困难性:

给定 (A, b = A·s + e),区分 (A, b) 与 (A, u)(其中 u 随机)是困难的。
在 2022 年的密码学分析中,ML-KEM 被证明在 IND-CCA2 下安全,其安全性归约到 Module-LWE 问题的 hardest instances。

6. KEM 在协议中的应用

6.1 TLS 1.3 密钥交换

TLS 1.3 将所有密钥交换机制统一抽象为 KEM:

CODE
TLS 1.3 Key Exchange:
  - ECDHE → ECDH-KEM(经典)
  - DHE → DH-KEM(经典)
  - Kyber-768 → ML-KEM(后量子)
  - X25519 + Kyber → Hybrid KEM(混合)

混合 KEM 构造(RFC 9180 附录 B): $$\text{SharedSecret} = \text{HKDF}(\text{KEM}_1.\text{share}, \text{KEM}_2.\text{share})$$

其中 KEM₁ 为经典算法(如 X25519),KEM₂ 为后量子算法(如 ML-KEM)。这种设计确保了向后兼容性与前向安全的双重保障。

6.2 HPKE(RFC 9180)

HPKE(Hybrid Public Key Encryption)是 IETF 标准化的 KEM + AEAD 组合方案:

CODE
HPKE 工作流程:
  1. SetupBase(sender_sk, receiver_pk) → (encap_key, context)
  2. Seal(context, ciphertext) → sealed_package
  3. Open(context, sealed_package) → plaintext

HPKE 支持四种模式:

  • Base:基本封装模式
  • Auth:认证封装模式(需要发送方签名)
  • PSK:预共享密钥模式
  • PSK+Auth:认证 + 预共享密钥模式

6.3 国密 KEM 标准

国密标准中虽然没有显式使用 "KEM" 术语,但其核心算法均符合 KEM 框架:

国密标准KEM 类型说明
GM/T 0003.3-2012ECDH-KEMSM2 密钥交换协议
GM/T 0044.3-2016IBE-KEMSM9 密钥交换协议
GM/T 0130-2023CL-PKC无证书密钥封装
SM2 密钥交换的 KEM 视角:
CODE
SM2 密钥交换 = ECDH-KEM + ZA 预处理
  - Encaps(pk_A, r_B) = (r_B·G, r_B·P_A)
  - Decaps(sk_A, R_B) = sk_A·R_B = r_B·sk_A·G
  - 共享密钥 = KDF(共享点.x || 共享点.y)

7. KEM 的安全性增强技术

7.1 Fujisaki-Okamoto 变换

FO 变换是一种通用的 KEM 构造方法,可以将 CPA 安全的 PKE 转换为 CCA 安全的 KEM:

CODE
FO-Transform(PKE):
  KeyGen: 同 PKE.KeyGen
  Encaps(pk):
    m ←R {0,1}^n
    ct = PKE.Encrypt(pk, m)
    k = H(ct) || G(m)
    return (ct, k)
  Decaps(sk, ct):
    m = PKE.Decrypt(sk, ct)
    if Verify(ct, m) fail: return ⊥
    k = H(ct) || G(m)
    return k

重要性质:FO 变换在随机预言机模型下保持 IND-CCA2 安全性。

7.2 认证 KEM(Auth-KEM)

认证 KEM 在标准 KEM 基础上增加了发送方身份认证:

CODE
Auth-KEM = (KeyGen, Encaps, Decaps, Sign, Verify)

应用场景:

  • TLS 1.3 客户端认证
  • Signal 协议的 X3DH 协议
  • 区块链钱包签名

8. KEM 选型指南

8.1 性能对比

KEM 方案密钥长度封装密钥长度封装速度解封速度后量子安全
X2551932 字节32 字节~5μs~5μs❌
ML-KEM-768800 字节768 字节~10μs~15μs✅
RSAES-OAEP-2048256 字节256 字节~100μs~10μs❌

8.2 选型建议

场景推荐方案理由
传统 TLS 服务器X25519性能好,广泛支持
PQC 迁移试点ML-KEM-768 + X25519 混合双保险,向后兼容
物联网设备ECDH-P256资源受限,密钥小
国密合规系统SM2 密钥交换符合 GM/T 0003.3-2012

9. 常见实现陷阱

9.1 封装密钥长度不一致

不同 KEM 方案的封装密钥长度差异很大(X25519 为 32 字节,ML-KEM 为 768 字节)。实现时必须根据具体算法选择缓冲区大小,否则会导致内存溢出或截断错误。

9.2 错误处理泄露信息

Decaps 操作必须在恒定时间内完成,即使封装密钥无效。否则侧信道攻击者可利用时间差异推断私钥信息。

9.3 随机数质量不足

KEM 的安全性依赖于随机数质量。Encaps 中的随机标量 r 如果可预测,整个系统将被破解。务必使用 CSPRNG(如 /dev/urandom 或 os.urandom)。

10. 总结

密钥封装机制(KEM)是现代密码学的基石抽象,它将密钥交换过程形式化为三个简洁的算法,并在安全性证明、协议设计和工程实现层面带来了显著优势。

从 RSAES-OAEP 到 ML-KEM,KEM 的发展轨迹反映了密码学从经典到后量子的演进路径。在 TLS 1.3、HPKE、国密标准等关键协议中,KEM 已成为事实标准的密钥交换原语。

对于从业者而言,理解 KEM 不仅是掌握密码学理论的需要,更是应对后量子迁移挑战的前提。在选择 KEM 方案时,应综合考虑安全性、性能和兼容性,优先采用经过广泛审查的标准算法(如 X25519、ML-KEM),避免自行设计或修改现有方案。

相关实践

参考资料

  • RFC 5903: Elliptic Curve Diffie-Hellman (ECDH) Key Agreement
  • RFC 8017: PKCS #1 v2.2: RSA Cryptography Specifications
  • RFC 9180: Hybrid Public Key Encryption (HPKE)
  • NIST FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard
  • GM/T 0003.3-2012: SM2 椭圆曲线公钥密码算法 第3部分:密钥交换协议
  • GM/T 0044.3-2016: SM9 标识密码算法 第3部分:密钥交换协议
  • Castryck, Decru, "An Efficient Key Recovery Attack on ML-KEM", EUROCRYPT 2024