密钥封装机制(KEM):从经典密钥交换到后量子安全的桥梁

密码学概念 · 2026-06-16

概述

在互联网上,两个从未谋面的通信方如何建立共享秘密?这是密码学最经典的问题之一。密钥封装机制(Key Encapsulation Mechanism, KEM) 是对这一问题的现代形式化答案。

KEM 的核心思想简洁而优雅:发送方使用接收方的公钥,生成一个随机对称密钥及其"封装"(密文),接收方用私钥"解封"得到相同的对称密钥。这一过程不直接加密用户数据——它只安全地传输一个密钥,后续的加解密交给高效的对称密码完成。这种"公钥分发密钥,对称加密数据"的分层设计被称为 KEM/DEM 范式(DEM = Data Encapsulation Mechanism),是现代公钥加密的事实标准。

KEM 的历史可以追溯到 Diffie-Hellman 密钥交换(1976 年),但作为一个独立的形式化概念,KEM 直到 2001 年才由 Victor Shoup 在 ISO 18033-2 标准提案中系统定义。此后,RSA-KEM(RFC 5990, 2007)、DH-KEM(椭圆曲线 ECIES 的核心)、HPKE(RFC 9180, 2022)相继标准化。2024 年 NIST 发布的 FIPS 203(ML-KEM)更是将 KEM 推向了后量子安全的新阶段。

理解 KEM,就是理解现代密钥交换从"交互式协议"到"非交互式封装"的范式转变,也是理解后量子迁移的技术基础。

KEM 的形式化定义

语法结构

一个 KEM 由三个概率多项式时间算法组成:

CODE
KeyGen(1^λ) → (pk, sk)         // 密钥生成:输入安全参数,输出公钥和私钥
Encap(pk) → (ss, ct)           // 封装:输入公钥,输出共享秘密和密文
Decap(sk, ct) → ss 或 ⊥        // 解封:输入私钥和密文,输出共享秘密或失败

其中:

  • pk:公钥(公开)
  • sk:私钥(保密)
  • ss(shared secret):共享秘密,一个随机对称密钥
  • ct(ciphertext):封装密文

正确性

KEM 的正确性要求:对于 KeyGen 生成的任意密钥对 (pk, sk),Encap 生成的任意 (ss, ct),Decap 都能以极高概率恢复相同的 ss:

CODE
Pr[Decap(sk, Encap(pk)) = ss] ≈ 1

即封装-解封过程是无损的(忽略可忽略的解密失败概率)。

安全模型:IND-CCA

KEM 的核心安全目标是 IND-CCA(自适应选择密文攻击下的不可区分性)。安全博弈如下:

定义:如果任何多项式时间 Adversary 赢得该博弈的概率与 1/2 的差值是可忽略的(negligible),则称该 KEM 满足 IND-CCA 安全。

为什么需要 IND-CCA 而非 IND-CPA? 在实际网络环境中,攻击者不仅能被动窃听,还能主动篡改密文并观察接收方的解密反应(错误消息、时序差异等)。这种"解密预言机"能力使得仅满足 IND-CPA 的加密方案在真实场景中可能完全失效——Bleichenbacher 对 PKCS#1 v1.5 的攻击(1998 年)和 ROBOT 攻击(2018 年)就是经典案例。IND-CCA 确保即使面对这种主动攻击,KEM 也不会泄露任何关于共享秘密的信息。

显式拒绝 vs 隐式拒绝

当 Decap 收到一个无效的密文(被篡改或恶意构造)时,KEM 有两种处理策略:

策略机制优点缺点
显式拒绝返回错误符号 ⊥ 或抛出异常概念清晰,出错立即可见可能通过错误消息泄露信息(时间侧信道)
隐式拒绝返回一个伪随机值 H(sk, ct)不泄露任何区分信息,抗侧信道下游必须验证密钥正确性,否则可能"静默失败"
NIST SP 800-227(2025 年 3 月发布征求意见稿,9 月定稿)推荐在大多数场景中使用隐式拒绝,因为它消除了基于错误消息的信息泄露通道。ML-KEM(FIPS 203)采用了隐式拒绝方案。

KEM/DEM 范式:混合加密的理论基础

为什么需要 KEM?

直接使用公钥加密任意长消息存在两个根本问题:

  • 效率低下:RSA 加密速度比 AES 慢约 1000 倍,且密文膨胀严重
  • 消息长度限制:RSA-2048 最多加密 245 字节(OAEP 填充后),无法处理任意长消息
KEM/DEM 范式通过分层设计解决了这两个问题:

CODE
┌──────────────────────────────────────────────────────┐
│                  混合加密方案                          │
├──────────────────────────────────────────────────────┤
│  发送方:                                             │
│    (ss, ct) = Encap(pk)          ← KEM 层          │
│    c = AEAD.Encrypt(ss, message) ← DEM 层          │
│    发送 (ct, c)                                      │
│                                                      │
│  接收方:                                             │
│    ss = Decap(sk, ct)            ← KEM 层          │
│    message = AEAD.Decrypt(ss, c) ← DEM 层          │
└──────────────────────────────────────────────────────┘
  • KEM 层:用非对称密码安全传输一个短随机密钥
  • DEM 层:用该密钥通过 AEAD(认证加密)加密任意长消息

安全性定理

Cramer 和 Shoup 在 2003 年的开创性证明:如果 KEM 满足 IND-CCA 安全,且 DEM 满足 AEAD(IND-CPA + INT-CTXT)安全,则组合后的混合加密方案满足 IND-CCA 安全。

这一定理的实际意义是:安全性的关注点被完美隔离。设计者可以独立分析和优化 KEM 和 DEM,无需担心组合引入新的攻击面。这一理论成果直接推动了 KEM 从"一种加密方式"升级为"公钥加密的标准范式"。

KEM 的历史演进

第一阶段:从密钥交换到密钥封装(1976–2001)

Diffie-Hellman 密钥交换(1976) 是 KEM 的思想先驱,但 DH 是一个交互式协议——双方需要各发送一条消息才能建立共享秘密。相比之下,KEM 是非交互式的——发送方只需知道接收方公钥即可完成封装。

从 DH 到 KEM 的抽象化过程:

DH-KEM 的关键变化:

  • 封装方(Alice)可以独立完成全部操作,无需等待响应
  • 共享秘密由封装方的随机数和接收方的公钥共同决定
  • 封装结果(ct)是一条单向消息
RSA-KEM(2001–2007) 是第一个被标准化的 KEM 构造。传统 RSA 加密(如 PKCS#1 v1.5)依赖填充方案来保证安全性,但填充方案的复杂性导致了大量实际攻击。RSA-KEM 的设计哲学更简单:

CODE
RSA-KEM:
  KeyGen: 生成 RSA 密钥对 (N, e, d)
  Encap(pk=N, e):
    随机选择 r ∈ [1, N-1]
    ct = r^e mod N          // RSA 加密
    ss = KDF(r)             // 密钥派生
    返回 (ss, ct)
  Decap(sk=d, ct):
    r = ct^d mod N          // RSA 解密
    ss = KDF(r)
    返回 ss

RSA-KEM 的优势在于:它避免了复杂的填充方案,安全性规约到 RSA 问题的难度上,且证明更紧致(tighter reduction)。ISO/IEC 18033-2:2006 和 RFC 5990(2007 年)标准化了 RSA-KEM。RFC 9690(2025 年 2 月)进一步将其纳入 CMS(加密消息语法)。

第二阶段:椭圆曲线 KEM 与 ECIES(1997–2010s)

将 DH-KEM 迁移到椭圆曲线群上,得到 ECIES(Elliptic Curve Integrated Encryption Scheme)。ECIES 的核心是 DH-KEM + KDF + MAC + 对称加密的组合,其优势在于:

  • 更短的密钥长度(256 位 ECC ≈ 3072 位 RSA 的安全强度)
  • 更快的计算速度
  • 更小的密文开销
ECIES 被 ANSI X9.63、SECG SEC 1、ISO 18033-2 等多个标准采纳,是椭圆曲线加密的实际应用标准。

HPKE(Hybrid Public Key Encryption, RFC 9180, 2022 年) 是 KEM 形式化的里程碑。HPKE 不仅是一个具体的 KEM 实现,更是一个通用框架,定义了:

  • DHKEM(基于 X25519/X448 的 DH-KEM)
  • KEM 的组合模式(single-shot 和 sequential)
  • 密钥导出函数(key schedule)的标准化
  • 从 KEM 到完整 AEAD 加密的端到端流程
HPKE 已被 TLS 1.3(ECH 扩展)、MLS(Message Layer Security)、WIMSE 等协议采纳,成为现代加密协议的 KEM 基础设施。

第三阶段:后量子 KEM(2024–至今)

2024 年 8 月,NIST 正式发布 FIPS 203,标准化了 ML-KEM(Module-Lattice-Based Key-Encapsulation Mechanism),基于 CRYSTALS-Kyber 算法。这是密码学历史上第一个标准化的后量子 KEM。

ML-KEM 的三个参数集:

参数集安全等级公钥长度密文长度共享秘密长度
ML-KEM-512≈128 位800 B768 B32 B
ML-KEM-768≈192 位1184 B1088 B32 B
ML-KEM-1024≈256 位1568 B1568 B32 B
ML-KEM 的安全基于 Module Learning with Errors(MLWE) 问题的困难性。与 RSA 和 ECC 不同,MLWE 问题不存在已知的多项式时间量子算法。

Fujisaki-Okamoto 变换:从 CPA 到 CCA 的关键桥梁

为什么 PKE 通常是 CPA 安全的

大多数高效的公钥加密方案(包括 RSA、Elgamal、Kyber 的底层 PKE)天然只满足 IND-CPA(选择明文攻击下的不可区分性)。CPA 安全意味着密文不会泄露明文信息,但无法抵抗主动攻击——攻击者可以通过修改密文并观察解密结果来获取信息。

FO 变换的原理

Fujisaki-Okamoto(FO)变换(1999 年提出,2017 年由 Hofheinz、Hövelmanns、Kiltz 给出模块化分析)是将 IND-CPA 安全的 PKE 转换为 IND-CCA 安全的 KEM 的标准方法。

FO 变换的核心思想:在解封时重新加密并验证一致性

关键洞察:Decap 不是简单地解密后返回明文,而是验证密文的合法性。如果攻击者篡改了密文,重新加密的结果不会匹配,KEM 返回一个伪随机值而非错误。

ML-KEM 中的 FO 变换

ML-KEM 内部使用了 FO 变换的变体(在 Kyber 的 CPA-PKE 基础上构建 CCA-KEM)。ML-KEM 的 Decap 流程:

  • 用私钥解密密文得到候选消息 m'
  • 用 m' 和公钥重新执行加密,得到候选密文 ct'
  • 比较 ct' 与原始 ct
  • 一致则返回 KDF(m' || ct),不一致则返回 KDF(z || ct)(z 是封装在私钥中的隐式拒绝种子)
这一设计确保了 ML-KEM 满足 IND-CCA 安全,且采用隐式拒绝策略。

KEM 组合器:混合安全的设计艺术

为什么需要混合?

在从经典密码向后量子密码迁移的过渡期,存在一个现实困境:

  • 经典 KEM(如 X25519):经过数十年实战检验,但可被量子计算机破解
  • 后量子 KEM(如 ML-KEM):抗量子,但标准化时间短,实现中可能存在未知漏洞
KEM 组合器(KEM Combiner) 的解决方案:同时使用两个 KEM,只有当两者都被攻破时系统才会被破解。

组合器的安全定义

一个 KEM 组合器 Combine(KEM₁, KEM₂) 满足:如果 KEM₁ 或 KEM₂ 中至少一个是 IND-CCA 安全的,则组合后的 KEM 也是 IND-CCA 安全的。

组合方式

逐层组合(Cascade/Tree Combiner)

CODE
Hybrid_KEM.Encap(pk₁, pk₂):
  (ss₁, ct₁) = KEM₁.Encap(pk₁)
  (ss₂, ct₂) = KEM₂.Encap(pk₂)
  ss = KDF(ss₁ || ss₂ || ct₁ || ct₂)  // 关键:密文也作为 KDF 输入
  返回 (ss, (ct₁, ct₂))

并行组合(Dual-PRF Combiner)

CODE
ss = KDF(ss₁ ⊕ ss₂)   // 简单但安全性证明较弱

NIST SP 800-227 推荐使用逐层组合,因为密文作为 KDF 输入可以防止某些分割攻击。

X-Wing:混合 KEM 的工程典范

X-Wing(2024 年由 Peter Schwabe 等提出)是一个基于 X25519 和 ML-KEM-768 的混合 KEM,被 IETF 的 HPKE 后量子工作组(draft-ietf-hpke-pq)重点讨论。X-Wing 的设计要点:

  • 共享秘密 = BLAKE3(ML-KEM共享秘密 || X25519共享秘密 || 公钥拼接)
  • 单一共享秘密输出(32 字节),对下游协议透明
  • 无需修改 HPKE 框架即可集成
X-Wing 代表了"混合安全"的工程方向:在不牺牲后量子安全性的同时,保留经典密码的成熟保障。

KEM 在现代协议中的应用

TLS 1.3 中的密钥交换

TLS 1.3 的密钥交换本质上是 DH-KEM 的应用:

TLS 1.3 使用 (EC)DHE 作为密钥交换机制,其本质就是一个 DH-KEM:客户端生成临时密钥对,封装共享秘密(通过 server 的公钥派生),服务器解封。每次握手使用新的临时密钥对,天然提供前向安全性。

HPKE:通用 KEM 框架

HPKE(RFC 9180)定义了一个端到端的加密框架,包含:

  • KEM 层:DHKEM(X25519)、DHKEM(X448)
  • 密钥派生:基于 HKDF 的密钥调度
  • AEAD 层:AES-GCM、ChaCha20-Poly1305 等
HPKE 的四个模式:

模式描述应用场景
Base单向加密,仅使用接收方公钥异步消息、文件加密
Auth双向认证,双方使用签名密钥端到端加密
PSK预共享密钥增强已有共享秘密的场景
Auth_PSK签名 + PSK最高安全级别

OpenPGP 与 CMS 中的 KEM

  • RSA-KEM(RFC 5990, 2007):用于 OpenPGP 和 CMS 的密钥传输
  • RSA-KEM in CMS(RFC 9690, 2025):更新版标准,替代 RFC 5990
  • ML-KEM in CMS(RFC 9936, 2025):后量子 KEM 在 CMS 中的应用标准
这些标准的持续推进表明,KEM 不仅在理论层面是公钥加密的标准范式,在工程实践中也已成为密钥传输的实际标准。

国密体系中的 KEM

SM2 密钥交换协议

国密 SM2 算法(GM/T 0003.2)包含一个密钥交换协议,其本质是一个 DH-KEM 的变体。双方在椭圆曲线 Fp-256 上交换临时公钥,通过 Diffie-Hellman 派生共享秘密,再经 KDF 导出会话密钥。

SM2 密钥交换的特点是:

  • 双方互相认证(通过身份 ID 和签名公钥)
  • 提供前向安全性
  • 密钥派生使用 SM3 哈希函数

TLCP 协议中的密钥交换

TLCP(GM/T 0024)协议在握手阶段使用 SM2 密钥交换。与 TLS 1.3 不同,TLCP 的密钥交换使用静态 SM2 密钥(而非临时密钥),这意味着 TLCP 不提供前向安全性——长期私钥泄露可导致历史会话被解密。这一设计在国密合规场景下的取舍值得深入思考。

国密 KEM 的后量子迁移路径

国密体系向后量子 KEM 迁移面临独特挑战:

  • SM2 密钥交换基于椭圆曲线离散对数问题(ECDLP),可被 Shor 算法在多项式时间内破解
  • SM2 的 256 比特密钥长度在量子场景下仅提供约 128 比特安全强度(Grover 算法对对称密码的影响),但 Shor 算法直接破解 ECDLP,安全强度降至 0
  • 密评合规要求(GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》)增加了迁移的复杂度——迁移方案必须同时满足抗量子安全和密评合规
当前业界正在探索的路径包括:
  • 混合密钥交换:在 TLCP 中同时执行 SM2 密钥交换和 ML-KEM 封装,共享秘密 = KDF(ss_sm2 || ss_mlkem),即使其中一个被攻破,另一个仍保证安全性
  • 双证书体系扩展:利用国密双证书体系(签名证书 + 加密证书),在证书协商阶段同时交换 SM2 和 ML-KEM 公钥
  • 基于国密算法的后量子 KEM 构造:研究基于 SM3 哈希和 SM4 分组密码的 KEM 构造(如基于哈希的 KEM),但目前尚未有标准化方案
  • 中电信量子专利 CN118540163A:提出 QKD + PQC 混合方案增强 TLCP,结合量子密钥分发和后量子 KEM 实现双重保护

KEM 的安全考量

侧信道攻击

KEM 的实现面临多种侧信道攻击:

  • 时间侧信道:Decap 的比较操作(ct' == ct)如果不是常量时间的,攻击者可通过时间差异判断密文是否有效
  • 功耗分析:封装/解封过程中的标量乘法可能泄露私钥信息
  • 缓存侧信道:查表操作(如 NTT 运算中的访问模式)可能泄露密钥
ML-KEM 的实现需要特别注意:
  • NTT(数论变换)的常量时间实现
  • FO 变换中的比较操作必须是常量时间的
  • 隐式拒绝机制本身也需要常量时间执行

解密失败攻击

某些 KEM 方案(包括 ML-KEM-512)存在非零的解密失败概率。如果攻击者能够大量提交无效密文并观察是否被接受,可能通过统计方法恢复私钥。ML-KEM 的参数集设计已将失败概率降至 2^-128 以下,在工程上可视为零。

随机数质量

KEM 的 Encap 操作需要高质量的随机数来生成共享秘密。如果随机数生成器的熵不足,生成的共享秘密可能被预测。这一风险在后量子 KEM 中同样存在——ML-KEM 的内部随机性直接影响封装过程的安全性。

总结

KEM 从 Diffie-Hellman 密钥交换的思想萌芽,经过 Shoup 的形式化定义、Cramer-Shoup 的 KEM/DEM 范式证明、HPKE 的通用框架标准化,发展到 ML-KEM 的后量子安全实现,已经成为现代密码学最核心的基础设施之一。

理解 KEM 的关键要点:

  • 形式化抽象:KeyGen / Encap / Decap 三算法结构,统一了所有密钥传输机制
  • 安全模型:IND-CCA 保证主动攻击下的安全性,是 KEM 设计的核心目标
  • KEM/DEM 范式:分层设计使公钥加密的安全性证明和工程实现大幅简化
  • FO 变换:从 CPA 到 CCA 的标准桥梁,ML-KEM 的核心构造工具
  • 混合 KEM:过渡期安全的工程实践,KEM 组合器提供"双重保险"
  • 协议应用:从 TLS 1.3 到 HPKE 到 OpenPGP/CMS,KEM 是密钥传输的事实标准
随着 NIST SP 800-227(2025 年 8 月定稿)的发布和 ML-KEM 在各协议中的集成加速,KEM 正在从密码学理论概念转变为工程实践的基础构件。对于密码学从业者和安全工程师而言,深入理解 KEM 的设计原理和安全模型,是应对后量子迁移挑战的必备知识。

参考来源

相关实践