4. NIST PQC标准化进展

聊PQC迁移,绕不开NIST的标准化进程。这就像盖房子得先看地基打得怎么样。NIST从2016年就开始公开征集后量子密码算法,经过好几轮筛选,终于在2022年敲定了第一批 winners。我参与的几个迁移项目,基本都在盯着这份名单做选型。

说白了,NIST帮我们做了第一道筛选。但选哪个算法,还得看你的业务场景。下面我按自己的理解,把这几个算法掰开揉碎了讲讲。

4.1 已选算法:四员大将

目前NIST正式标准化的有四个算法,两个用于密钥封装(KEM),两个用于数字签名。我习惯把它们分成两组来看。

4.1.1 密钥封装:CRYSTALS-Kyber

Kyber 是目前PQC迁移的绝对主力。它基于带错误学习的格密码(Module-LWE),密钥和密文都很小,性能也快。我在做TLS握手协议替换时,首选就是Kyber。

核心参数(NIST Level 1 安全强度):

  • 公钥大小:800 字节
  • 密文大小:768 字节
  • 共享密钥:32 字节

为什么选它?你想想看,Kyber的密钥和密文加起来才1.5KB左右,跟传统RSA-2048的256字节公钥比确实大了点,但跟其他PQC方案比,它已经算很苗条了。我建议在带宽敏感的场景(比如物联网、移动端),优先考虑Kyber。

我的经验: 在嵌入式设备上移植Kyber时,要注意它的多项式乘法实现。用NTT(数论变换)优化后,性能可以提升3-5倍。我曾经在ARM Cortex-M4上跑过,一次密钥封装大概只需要2ms。

4.1.2 数字签名:CRYSTALS-Dilithium、FALCON、SPHINCS+

签名算法这边,NIST选了三个,各有各的脾气。

算法 基础 签名大小 公钥大小 特点
Dilithium 格(Module-LWE/LWR) 2.4 KB (Level 2) 1.3 KB 均衡,实现简单
FALCON 格(NTRU) 0.6 KB (Level 1) 0.9 KB 签名极小,实现复杂
SPHINCS+ 哈希(无状态) 8 KB (Level 1) 0.03 KB 保守安全,签名大

Dilithium 是我个人最常用的签名算法。它实现起来相对简单,性能也不错。我在替换X.509证书签名时,基本都用它。嗯,这里要注意:Dilithium的签名大小在2-3KB,比ECDSA的64字节大不少,但还在可接受范围内。

FALCON 的特点是签名极小,只有几百字节。但它的实现非常复杂,需要浮点运算,对嵌入式设备不太友好。我记得有一次在FPGA上移植FALCON,光是调试那个FFT就花了两周。所以,除非你对签名大小有极致要求(比如区块链交易),否则我建议优先用Dilithium。

SPHINCS+ 是保守派的选择。它不依赖任何新的数学难题,只靠哈希函数的安全性。说白了,就算量子计算机把格密码破了,SPHINCS+依然安全。但代价是签名很大(8KB以上),速度也慢。我一般只在长期存档或根证书签名这种场景下用它。

避坑指南: 我曾经在一个项目中,为了追求“绝对安全”,所有地方都用了SPHINCS+。结果上线后发现,每次签名都要几十毫秒,网络传输也变慢了。后来我们改成了“Dilithium为主,SPHINCS+为辅”的策略,才解决了问题。选型时一定要权衡性能和安全性。

4.2 候选算法:还在路上的选手

除了上面四个,NIST还在评估其他算法,主要是为了丰富算法生态。目前有几个方向值得关注。

4.2.1 密钥封装候选

  • BIKE:基于编码的密码,密钥和密文都比较大,但安全性研究很扎实。
  • HQC:也是基于编码的,结构比BIKE简单一些。
  • Classic McEliece:老牌编码密码,公钥巨大(几百KB),但安全性极高。

我个人觉得,Classic McEliece虽然公钥大,但在某些特定场景(比如密钥分发中心)还是有价值的。不过,日常迁移还是先盯着Kyber吧。

4.2.2 数字签名候选

  • FALCON 已经入选,但NIST还在考虑它的变体。
  • SQIsign:基于同源密码,签名和密钥都非常小,但计算很慢。这个算法很有潜力,但离实用还有距离。

4.3 知识体系:算法选型决策树

下面这张图是我自己总结的选型思路,帮你快速定位该用哪个算法。

PQC算法选型决策树 PQC算法选型 密钥封装 (KEM) 数字签名 Kyber (首选) BIKE / HQC (候选) Dilithium (通用) FALCON (小签名) SPHINCS+ (保守) SQIsign (候选) 选型建议: 1. 通用场景:Kyber (KEM) + Dilithium (签名) 2. 带宽敏感:Kyber + FALCON 3. 长期安全:Kyber + SPHINCS+

4.4 我的选型建议

说了这么多,总结一下我的个人习惯:

  1. 密钥封装:无脑选Kyber。 它性能好,密钥小,生态也最成熟。除非你有特殊需求(比如要抗量子+抗信道攻击),否则别折腾。
  2. 数字签名:默认Dilithium。 如果签名大小是瓶颈,再考虑FALCON。如果对安全性有执念,用SPHINCS+做备份。
  3. 关注候选算法。 特别是Classic McEliece和SQIsign,它们可能在特定领域(比如区块链、长周期证书)成为黑马。

最后提醒一句: 迁移不是一蹴而就的。我建议先做混合模式(传统算法+PQC算法),等生态成熟了再完全切过去。这样即使某个PQC算法出了问题,你还有退路。