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 算法选型全景图
说了这么多,咱们用一张图来总结一下这四个算法的定位和关系。
4.6 我的实战选型建议
做了这么多年的安全架构,我总结了一套后量子密码的选型原则:
- 不要追求「最安全」——安全是够用就好。Kyber-768 和 Dilithium-2 对于绝大多数场景已经足够。
- 考虑迁移成本——从传统密码切换到后量子密码,不仅仅是换算法那么简单。密钥管理、证书体系、协议栈都要改。
- 做好混合部署的准备——我建议在过渡期同时支持传统算法和后量子算法。比如 TLS 1.3 的混合密钥交换,同时用 ECDHE 和 Kyber。
- 关注标准化进展——NIST 还在进行第四轮筛选,可能会有新的算法加入。保持关注,但不要频繁切换。
一个小技巧:在做远程证明协议时,可以把 Kyber 和 Dilithium 组合使用。Kyber 负责密钥封装,Dilithium 负责签名证明。这样既保证了密钥交换的安全性,又保证了证明的不可伪造性。我在实际项目中就是这么做的,效果很好。