3. PQC算法家族概览
好,咱们进入正题。后量子密码(PQC)不是单一算法,而是五个完全不同的数学家族。我经常跟团队说,理解这五大家族的区别,比记住具体参数重要得多。因为迁移路径的选择,本质上就是在这五个家族里做取舍。
这五个家族分别是:基于格的密码、基于哈希的签名、基于编码的密码、多变量密码、同源密码。它们各自依赖的数学难题不同,性能特征也天差地别。
核心观点: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五大家族的全貌。每个家族都有自己的脾气和适用场景。做迁移的时候,别想着「一个算法打天下」,而是要根据你的业务场景、性能预算和安全需求,组合使用不同的算法。