3. PQC算法家族概览

好,咱们进入正题。后量子密码(PQC)不是单一算法,而是五个完全不同的数学家族。我经常跟团队说,理解这五大家族的区别,比记住具体参数重要得多。因为迁移路径的选择,本质上就是在这五个家族里做取舍。

这五个家族分别是:基于格的密码、基于哈希的签名、基于编码的密码、多变量密码、同源密码。它们各自依赖的数学难题不同,性能特征也天差地别。

核心观点:NIST 目前主推的是基于格的密码(用于加密/密钥封装)和基于哈希的签名(用于数字签名)。但其他家族在某些场景下仍有不可替代的优势。

下面这张图,是我自己画的一个家族关系概览。你可以看到每个家族的核心数学问题、典型算法和主要应用场景。

PQC 五大家族概览 PQC 五大家族概览 后量子密码 (PQC) 基于格的密码 难题:SVP / LWE 代表:Kyber / Dilithium 基于哈希的签名 难题:Hash 抗碰撞 代表:SPHINCS+ 基于编码的密码 难题:解码问题 代表:Classic McEliece 多变量密码 难题:MQ 问题 代表:Rainbow (已破) 同源密码 难题:同源计算 代表:SIKE (已破) ⚠️ 注意: Rainbow(多变量)和 SIKE(同源)已被攻破,不再推荐用于新系统。 NIST 目前标准化的算法集中在格密码和哈希签名两个家族。

3.1 基于格的密码:当前的主力军

基于格的密码,说白了就是依赖「格」上的数学难题。格是什么?你可以想象成高维空间里一堆有规律的散点。要在这个空间里找到最短的向量,或者解决带误差的线性方程组(LWE问题),量子计算机也没什么好办法。

我个人习惯把格密码看作PQC时代的「RSA」。为什么?因为它功能最全——既能做加密/密钥封装(KEM),又能做数字签名。NIST选中的Kyber(KEM)和Dilithium(签名)都属于这个家族。

实战经验:我在测试Kyber-512时发现,它的密钥生成速度比RSA-2048快了一个数量级。但公钥大小从RSA的256字节涨到了800字节。嗯,带宽成本确实上去了。

格密码的主要优势是性能均衡。密钥和签名尺寸不算最小,但计算速度很快。你想想看,在TLS握手场景里,Kyber的封装和解封装都在微秒级完成,这对用户体验影响很小。

但格密码也有坑。我遇到过的一个问题是实现复杂度。格运算涉及多项式乘法、数论变换(NTT),代码量比ECC大不少。曾经有个团队直接复制了参考实现,没做侧信道防护,结果在功耗分析下泄露了密钥。

避坑指南:格密码的实现必须使用常数时间算法,否则时序攻击就能把你的密钥扒干净。我曾经审计过一个项目,他们用了非恒定时间的NTT实现,FPGA上的时序波动直接暴露了私钥的汉明重量。

3.2 基于哈希的签名:最保守的选择

基于哈希的签名,核心思想很简单:只用哈希函数。不依赖任何数论难题,只依赖哈希函数的抗碰撞性。说白了,只要SHA-256没被攻破,这个签名就是安全的。

NIST选中的是SPHINCS+。它的签名尺寸比较大——典型的签名在8KB到40KB之间。相比之下,Dilithium的签名只有2-3KB。但SPHINCS+有一个无可替代的优点:安全假设最保守。

我记得在给一个政府客户做方案时,对方的安全审计员直接说:「格密码的数学太新,我们信不过。你们能不能只用哈希?」最后我们确实在部分高安全场景里部署了SPHINCS+。

哈希签名的缺点也很明显:

  • 签名尺寸大:不适合带宽受限的环境
  • 签名速度慢:比格签名慢1-2个数量级
  • 有状态 vs 无状态:早期方案(如XMSS)需要维护状态,SPHINCS+是无状态的,但代价是更大的签名

我的建议:如果你的系统对签名尺寸不敏感(比如固件签名、代码签名),哈希签名是「最安全」的选择。它几乎不可能被量子攻击突破,除非哈希函数本身被攻破。

3.3 基于编码的密码:老牌劲旅

基于编码的密码,历史比RSA还早。1978年McEliece就提出了基于Goppa码的加密方案。它的安全基础是一般线性码的解码问题——给你一个加了错误的码字,要恢复原始消息,量子算法也没什么好办法。

Classic McEliece是NIST第四轮仍在评估的候选算法。它的特点是:

  • 公钥巨大:261KB到1MB不等。我第一次看到这个数字时也吓了一跳。
  • 加解密很快:比格密码还快,尤其解密速度很优秀。
  • 安全历史长:40多年没被有效攻破,安全性很扎实。

我在物联网项目里试过Classic McEliece,结果发现公钥根本塞不进MCU的Flash。但如果你做的是静态密钥封装——比如加密一个文件密钥,然后存储起来——公钥大一点倒不是问题。

3.4 多变量密码:曾经的热门,现在的教训

多变量密码基于多元二次方程组(MQ问题)的求解难度。给定一组多元二次方程,要找到一组解——这个问题被证明是NP完全的。

Rainbow是这个家族的代表方案,曾经是NIST签名候选的决赛选手。但2022年,Beullens给出了一个多项式时间的攻击,直接攻破了Rainbow的参数集。嗯,这件事给整个PQC社区敲了警钟。

重要提醒:多变量密码的安全性评估还不够成熟。Rainbow被攻破后,剩下的方案(如GeMSS、LUOV)也受到了质疑。我个人不建议在2024年之后的新系统中使用多变量密码。

多变量密码的优点是签名很短(几十到几百字节),计算也快。但公钥很大(几十KB),而且安全裕度不好把握。你想想看,一个被NIST选入决赛的方案都能被攻破,其他方案你敢用吗?

3.5 同源密码:理论上优雅,现实中脆弱

同源密码是五个家族里最年轻的。它基于超奇异椭圆曲线之间的同源计算。这个数学概念很漂亮——你可以把同源想象成曲线之间的「映射」,而计算这个映射的逆是困难的。

SIKE是这个家族的代表,也是NIST的候选方案之一。它的公钥和密文都很小(几百字节),在带宽敏感场景里很有吸引力。但2022年,Castryck和Decru给出了一个攻击,用经典计算机就攻破了SIKE的密钥交换。

为什么会这样?因为同源密码的数学结构太「精巧」了,精巧到容易找到后门。我曾经跟一个数学教授聊过,他说:「同源密码就像走钢丝,每一步都要精确,稍微偏一点就掉下去了。」

现状:SIKE被攻破后,同源密码家族基本退出了NIST的标准化竞争。但学术界仍在研究更安全的变体。如果你做的是前沿研究,可以关注;如果是工程落地,暂时别碰。

3.6 五大家族对比总结

下面这个表格,是我自己整理的一个对比。你可以快速看到每个家族在关键维度上的表现。

家族 典型算法 公钥大小 签名/密文大小 计算速度 安全成熟度 推荐场景
格密码 Kyber, Dilithium 中等 (0.8-1.5KB) 小 (0.7-2.5KB) 快 高 (NIST标准) 通用加密、TLS、签名
哈希签名 SPHINCS+ 小 (0.032KB) 大 (8-40KB) 慢 极高 (仅依赖Hash) 固件签名、代码签名
编码密码 Classic McEliece 巨大 (261-1024KB) 小 (0.1-0.2KB) 很快 高 (40年历史) 静态密钥封装
多变量密码 Rainbow (已破) 大 (50-100KB) 很小 (0.05-0.1KB) 快 低 (已被攻破) 不推荐
同源密码 SIKE (已破) 小 (0.3-0.5KB) 很小 (0.1-0.2KB) 慢 低 (已被攻破) 不推荐

看完这个表格,你应该能理解为什么NIST最终选择了格密码和哈希签名作为主力。格密码在性能和安全之间取得了最好的平衡,哈希签名则提供了最保守的安全保障。

至于编码密码,虽然公钥大得吓人,但在特定场景(比如长期存档加密)里,它的安全历史是无可替代的。我有个客户做卫星数据存档,他们最终选了Classic McEliece——因为数据要存50年,他们不想赌格密码20年后会不会被攻破。

嗯,这就是PQC五大家族的全貌。每个家族都有自己的脾气和适用场景。做迁移的时候,别想着「一个算法打天下」,而是要根据你的业务场景、性能预算和安全需求,组合使用不同的算法。