4. NIST PQC标准化进展与选型依据

NIST后量子密码标准化并不是一次性“选冠军”,而是围绕不同数学难题、不同使用场景和不同工程约束,形成一组可组合的标准件。理解FIPS 203、FIPS 204、FIPS 205的定位,以及它们与TLS迁移之间的关系,是后续兼容工程设计的起点。

三份核心标准:KEM与签名的分工

2024年8月,NIST正式发布三项后量子密码标准:FIPS 203(ML-KEM,基于CRYSTALS-Kyber)、FIPS 204(ML-DSA,基于CRYSTALS-Dilithium)和FIPS 205(SLH-DSA,基于SPHINCS+)。它们并非互相替代,而是按功能分工:

  • FIPS 203 / ML-KEM:密钥封装机制(KEM),用于在两个通信方之间协商共享密钥。它是TLS 1.3中替代ECDHE密钥交换的主力,安全类别覆盖NIST Level 1、3、5,对应ML-KEM-512、ML-KEM-768、ML-KEM-1024。
  • FIPS 204 / ML-DSA:基于格的全数字签名算法,用于身份认证和消息签名。TLS中主要替代ECDSA/RSA签名,安全类别同样覆盖Level 1、3、5,对应ML-DSA-44、ML-DSA-65、ML-DSA-87。
  • FIPS 205 / SLH-DSA:基于哈希的无状态签名算法,安全性假设更保守,不依赖格难题,但签名尺寸大、计算较慢。它适合作为ML-DSA的备份或高保障场景,安全类别覆盖Level 1、3、5,对应SLH-DSA-SHA2-128s、SLH-DSA-SHA2-192s、SLH-DSA-SHA2-256s等参数集。

三者的关系可以用一张“算法族—用途—TLS角色”的映射图来理解:

NIST PQC 标准族与 TLS 角色映射 FIPS 203 · ML-KEM 基于 MLWE 的密钥封装 ML-KEM-512 / 768 / 1024 安全类别 L1 / L3 / L5 TLS 角色:密钥交换 FIPS 204 · ML-DSA 基于格的全数字签名 ML-DSA-44 / 65 / 87 安全类别 L1 / L3 / L5 TLS 角色:身份签名 FIPS 205 · SLH-DSA 基于哈希的无状态签名 SLH-DSA-SHA2-128s 等 安全类别 L1 / L3 / L5 TLS 角色:备份签名 TLS 1.3 握手层 ClientHello / ServerHello 扩展协商 key_share · signature_algorithms · supported_groups 混合模式:X25519MLKEM768 等组合 密钥协商 证书签名 备用签名

安全类别:不是“越高越好”

NIST将后量子安全强度划分为Level 1、3、5,分别对应AES-128、AES-192、AES-256的经典安全强度。选型时不能简单认为Level 5一定最优,因为安全类别越高,密钥、签名和密文尺寸越大,握手字节数和计算开销也越高。TLS服务器在并发握手场景下,Level 5的ML-KEM-1024和ML-DSA-87会显著增加带宽与CPU压力。工程上常见的折中是:密钥交换用ML-KEM-768(Level 3),签名用ML-DSA-65(Level 3),在安全性与性能之间取得平衡。

迁移路线图:从混合到纯PQC

NIST与工业界普遍推荐的迁移路径是“先混合、后纯PQC”。混合模式将经典算法(如X25519)与PQC算法(如ML-KEM-768)组合,只要其中一个算法未被攻破,共享密钥就仍然安全。这为迁移期提供了密码敏捷性和回退能力。典型路线可分为三个阶段:

  1. 混合密钥交换先行:在TLS 1.3中启用X25519MLKEM768等混合组,客户端与服务器协商时同时执行经典和PQC密钥交换,共享密钥由两者拼接后派生。此阶段签名仍可用ECDSA,风险最低。
  2. PQC签名逐步替换:当证书链和信任锚支持ML-DSA后,将服务器证书签名算法迁移到ML-DSA-65,同时保留ECDSA证书作为兼容回退。此阶段需要处理证书尺寸膨胀和链验证性能。
  3. 纯PQC与算法退役:在客户端和服务端生态成熟后,逐步移除经典算法,进入纯PQC模式。此时需重新评估安全类别、侧信道防护和硬件加速能力。

侧信道与实现考量

PQC算法在实现层面引入了新的侧信道风险。ML-KEM和ML-DSA的核心操作涉及NTT(数论变换)和多项式采样,若实现中使用数据相关的分支或内存访问模式,可能泄露密钥信息。工程上需要关注:

  • 常数时间实现:NTT、采样和拒绝采样必须避免秘密相关的分支和表查找,优先使用恒定时间算法。
  • 掩码防护:对密钥生成和解封装操作,可采用一阶或高阶掩码,将秘密拆分为多个共享因子,增加功耗分析难度。
  • 故障注入防护:对签名和解封装结果进行冗余校验,防止攻击者通过电压毛刺等故障注入手段诱导错误输出。
  • 内存清零:临时多项式、种子和中间密钥在使用后必须显式清零,避免残留于栈或堆中。

侧信道防护会带来性能开销。以ML-KEM-768为例,掩码实现可能使解封装耗时增加2~5倍。在TLS服务器上部署时,应通过压测确认握手吞吐量是否满足业务SLA,必要时启用硬件加速或会话复用。

TLS中算法组合的约束

TLS 1.3的算法协商通过ClientHello和ServerHello中的扩展完成,PQC迁移引入了几个关键约束:

  • supported_groups:混合密钥交换组(如X25519MLKEM768)需要客户端和服务器同时支持。若客户端只发送经典组,服务器应能回退到X25519,否则握手失败。
  • signature_algorithms:ML-DSA的OID和签名方案标识需要被双方识别。若客户端不支持ML-DSA,服务器应回退到ECDSA证书。
  • 证书链尺寸:ML-DSA-65公钥约1952字节,签名约3309字节,远大于ECDSA P-256。TLS Certificate消息可能超过单个TCP段,需要处理分片和重传。
  • 密钥共享限制:TLS 1.3的key_share扩展对每个组的密钥共享有大小限制,ML-KEM-768的密文约1088字节,公钥约1184字节,需确认是否超出实现限制。

下面给出一个TLS 1.3混合握手的关键参数示例,用于说明实际协商中需要关注的字段和尺寸:

# 示例:TLS 1.3 混合密钥交换参数(教学示例,非实测)
supported_groups:
  - x25519_mlkem768   # 混合组,经典 X25519 + ML-KEM-768
  - x25519            # 回退组
  - secp256r1         # 兼容组

key_share (x25519_mlkem768):
  client_share:
    x25519_pub:  32 字节
    mlkem768_pub: 1184 字节
  server_share:
    x25519_pub:  32 字节
    mlkem768_ct:  1088 字节

signature_algorithms:
  - mldsa65           # 主签名
  - ecdsa_secp256r1_sha256  # 回退签名

# 握手尺寸估算(示例)
# ClientHello 约 1.5 KB,ServerHello 约 1.2 KB
# Certificate (ML-DSA-65) 约 5~6 KB

从工程角度看,选型依据可以归纳为三条:第一,密钥交换优先选择ML-KEM-768,兼顾安全与性能;第二,签名优先选择ML-DSA-65,SLH-DSA作为高保障备份;第三,迁移期必须保留经典算法回退路径,并通过混合模式降低风险。最终决策应结合业务场景、客户端生态、硬件能力和合规要求综合判断,而不是机械套用某一组参数。