4、NIST后量子密码标准化进程:最终入选算法详解

好,咱们进入正题。NIST的后量子密码标准化,说白了就是一场全球密码学家参与的「算法选美」。从2016年启动,到2022年公布最终入选名单,前后折腾了六年。我全程跟进了这个过程,说实话,看着那些候选算法一轮轮被淘汰,心里还是挺感慨的。

最终入选的四个算法,分成了两大阵营:公钥加密/密钥封装(KEM)和数字签名。每个阵营各有两个算法,互为备份。为什么这么设计?因为密码学这行有个铁律——永远不要把鸡蛋放在一个篮子里。

4.1 CRYSTALS-Kyber:密钥封装的新标杆

Kyber 是基于格密码的密钥封装机制。它用的是 Module-LWE 问题,说白了就是在一个多维格上做「带误差的线性方程组」。你想想看,量子计算机能快速解线性方程组,但一旦加了误差,它就抓瞎了。

核心参数对比:

安全等级 公钥大小 密文大小 共享密钥
Kyber-512(≈ AES-128) 800 字节 768 字节 32 字节
Kyber-768(≈ AES-192) 1184 字节 1088 字节 32 字节
Kyber-1024(≈ AES-256) 1568 字节 1568 字节 32 字节

我个人习惯在远程证明场景里用 Kyber-768。为什么?因为它的安全余量足够,而且性能开销在可接受范围内。我在做 IoT 设备的远程证明协议时,遇到过内存受限的情况,Kyber-512 的 800 字节公钥比 RSA-2048 的 256 字节大不少,但考虑到量子安全,这个代价值得。

实战建议:如果你的设备有硬件随机数生成器,一定要用上。Kyber 的采样过程对随机性要求很高,我曾经见过一个项目因为伪随机数质量不够,导致密钥封装出现偏差——虽然没被攻破,但吓得我赶紧换了硬件熵源。

4.2 CRYSTALS-Dilithium:签名速度之王

Dilithium 和 Kyber 师出同门,都是基于 Module-LWE 的格密码方案。但 Dilithium 做的是数字签名。它的特点是:签名快、验证更快、公钥小。

嗯,这里要注意一个细节:Dilithium 的签名算法是 Fiat-Shamir 范式的一个变种。说白了,它把交互式零知识证明转换成了非交互式签名。这个转换过程用到了随机预言机模型,也就是哈希函数。

// Dilithium 签名流程(简化版)
1. 生成掩码向量 y ← S_γ1^l
2. 计算挑战 c = H(M || w1),其中 w1 = HighBits(Ay)
3. 计算响应 z = y + cs
4. 输出签名 (z, c)

我在做远程证明协议时,Dilithium 是我的首选签名方案。原因很简单:它的验证速度比 FALCON 快一个数量级。在证明方(Prover)资源受限的场景下,Dilithium 的签名生成也足够快。

避坑指南:我曾经在嵌入式设备上部署 Dilithium 时踩过一个坑——它的签名大小在不同安全等级下差异很大。Dilithium-2 的签名是 2420 字节,Dilithium-5 是 4595 字节。如果你的网络带宽有限,记得选对等级。

4.3 FALCON:小而美的格签名

FALCON 走的是另一条技术路线——基于 NTRU 格的 Gentry-Peikert-Vaikuntanathan(GPV)框架。它的核心卖点是:签名极小,公钥也小。

你想想看,FALCON-512 的签名只有 666 字节,比 Dilithium-2 的 2420 字节小了将近四分之三。这在带宽受限的场景下简直是神器。

方案 公钥大小 签名大小 签名速度 验证速度
FALCON-512 897 字节 666 字节 慢 快
FALCON-1024 1793 字节 1280 字节 更慢 快
Dilithium-2 1312 字节 2420 字节 快 很快
Dilithium-5 2592 字节 4595 字节 快 很快

但 FALCON 有个致命弱点——签名生成太慢了。为什么?因为它用了浮点运算,而且采样过程需要高精度的高斯采样。我在 FPGA 上实现过 FALCON,那个浮点运算单元占的面积让我心疼了好久。

我的选择策略:

  • 证明方设备性能强:用 Dilithium,签名快,验证也快
  • 证明方设备性能弱但带宽够:用 Dilithium,签名生成快
  • 带宽极度受限:用 FALCON,但要做好签名生成慢的心理准备
  • 需要频繁验证:两个都可以,但 Dilithium 验证更快

4.4 SPHINCS+:保守派的选择

SPHINCS+ 和其他三个算法完全不同。它不基于格,而是基于哈希函数。说白了,它用哈希函数的单向性来保证安全。这意味着什么?意味着即使量子计算机真的造出来了,只要哈希函数没被攻破,SPHINCS+ 就是安全的。

但代价也很明显——签名太大了。SPHINCS+-128s 的签名是 7856 字节,SPHINCS+-128f 更是达到了 17088 字节。你想想看,在远程证明场景里,每次证明都要传输十几 KB 的签名,这带宽开销可不是闹着玩的。

重要提醒:SPHINCS+ 是有状态的签名方案。它的签名密钥会随着每次签名而改变。如果你不小心把状态搞丢了,或者做了状态回滚,那安全性就全没了。我曾经见过一个团队因为没处理好状态持久化,导致签名密钥重用——虽然没出事,但这个风险绝对不能忽视。

我个人建议,SPHINCS+ 适合用在以下场景:

  • 对量子安全有极致要求的场景(比如军事、金融核心系统)
  • 签名次数有限,且能保证状态管理的场景
  • 作为 Dilithium 或 FALCON 的备份方案

4.5 算法选型全景图

说了这么多,咱们用一张图来总结一下这四个算法的定位和关系。

NIST 后量子密码标准化——最终入选算法全景图 公钥加密 / 密钥封装 (KEM) 数字签名 CRYSTALS-Kyber Module-LWE 格密码 Kyber-512 Kyber-768 CRYSTALS-Dilithium Module-LWE 格签名 FALCON SPHINCS+ 选型建议 • 密钥封装:优先选 Kyber-768,安全与性能的平衡点 • 数字签名:性能优先选 Dilithium,带宽优先选 FALCON • 极致安全:SPHINCS+ 作为备份方案,但注意状态管理 • 远程证明场景:推荐 Kyber-768 + Dilithium-2 组合 • 混合模式:同时部署后量子方案和传统方案,逐步迁移

4.6 我的实战选型建议

做了这么多年的安全架构,我总结了一套后量子密码的选型原则:

  1. 不要追求「最安全」——安全是够用就好。Kyber-768 和 Dilithium-2 对于绝大多数场景已经足够。
  2. 考虑迁移成本——从传统密码切换到后量子密码,不仅仅是换算法那么简单。密钥管理、证书体系、协议栈都要改。
  3. 做好混合部署的准备——我建议在过渡期同时支持传统算法和后量子算法。比如 TLS 1.3 的混合密钥交换,同时用 ECDHE 和 Kyber。
  4. 关注标准化进展——NIST 还在进行第四轮筛选,可能会有新的算法加入。保持关注,但不要频繁切换。

一个小技巧:在做远程证明协议时,可以把 Kyber 和 Dilithium 组合使用。Kyber 负责密钥封装,Dilithium 负责签名证明。这样既保证了密钥交换的安全性,又保证了证明的不可伪造性。我在实际项目中就是这么做的,效果很好。