2、后量子密码学基础:格密码、哈希签名、多变量密码等PQC算法家族概览
好,我们进入正题。上一章聊了为什么传统证书吊销流程在量子计算机面前会「裸奔」,这一章我们得把武器库打开看看——后量子密码学(PQC)到底有哪些家底?
说实话,我刚接触PQC时也是一头雾水。什么格、什么多变量、什么哈希签名……听着像数学竞赛题。但干我们这行的,不能等到量子计算机真来了才去翻手册。我习惯把PQC算法分成几大家族,每个家族都有自己的脾气和适用场景。
核心认知:NIST在2024年已经标准化了第一批PQC算法,包括CRYSTALS-Kyber(密钥封装)和CRYSTALS-Dilithium(数字签名)。但证书吊销流程涉及的是签名和哈希,所以我们重点看签名类算法。
2.1 格密码(Lattice-based Cryptography)
格密码是目前最「火」的PQC家族。为什么?因为它的安全证明最扎实,性能也相对均衡。我在参与一个联邦身份认证项目时,就曾用Dilithium替换过RSA签名——嗯,那感觉就像把老式柴油机换成了混动引擎。
格密码的核心思想很简单:在一个高维格空间里,找一个短向量很容易,但给你一个随机向量让你找到离它最近的格点——难。这就是最短向量问题(SVP)和学习带错误问题(LWE)。
| 算法 | 类型 | 签名大小 | 密钥大小 | NIST状态 |
|---|---|---|---|---|
| CRYSTALS-Dilithium | 数字签名 | ~2.4 KB | ~1.3 KB | 已标准化 |
| FALCON | 数字签名 | ~0.6 KB | ~1.2 KB | 已标准化 |
| CRYSTALS-Kyber | 密钥封装 | — | ~1.2 KB | 已标准化 |
你想想看,Dilithium的签名才2.4KB,比RSA-2048的256字节大不少,但比某些多变量方案小得多。在证书吊销场景里,签名大小直接影响CRL(证书吊销列表)的传输效率——这一点我们后面会反复提到。
我的经验:如果你要设计一个全新的PKI系统,我个人建议优先考虑Dilithium。它的实现成熟度最高,社区支持也最好。FALCON签名更小,但实现复杂度高,容易踩坑。
2.2 哈希签名(Hash-based Signatures)
哈希签名家族,说白了就是「用哈希函数造签名」。它不依赖任何数论难题,只依赖哈希函数的抗碰撞性。这意味着什么?意味着只要SHA-256还安全,哈希签名就安全——量子计算机拿它没办法。
我记得第一次看到XMSS(eXtended Merkle Signature Scheme)时,第一反应是:这不就是默克尔树吗?对,就是那个东西。但哈希签名有个致命弱点:有状态。什么意思?你每次签名后必须更新私钥状态,如果状态乱了,整个安全性就崩了。
我曾经在一个嵌入式设备上部署过LMS(Leighton-Micali Signature),结果因为设备意外断电导致状态回滚——嗯,那是一次惨痛的教训。从那以后,我坚持在哈希签名方案里加状态持久化的事务性保护。
避坑指南:哈希签名的「有状态」特性在证书吊销场景里是个大麻烦。CA(证书颁发机构)通常高并发签名,状态管理会成为瓶颈。我个人建议只在OCSP响应器(在线证书状态协议响应器)这种低频签名场景使用哈希签名。
| 算法 | 签名大小 | 私钥大小 | 有无状态 | 适用场景 |
|---|---|---|---|---|
| XMSS | ~2.5 KB | ~0.1 KB | 有状态 | 固件签名、代码签名 |
| LMS | ~1.5 KB | ~0.1 KB | 有状态 | 嵌入式、低功耗设备 |
| SPHINCS+ | ~8 KB | ~0.1 KB | 无状态 | 通用签名(但签名大) |
SPHINCS+是哈希签名家族里的「异类」——它去掉了状态,代价是签名膨胀到8KB以上。在证书吊销场景里,8KB的签名意味着CRL会变得很臃肿。但如果你需要无状态的哈希签名,SPHINCS+是唯一选择。
2.3 多变量密码(Multivariate-based Cryptography)
多变量密码,这个家族有点「老派」。它的安全性基于一个事实:解一组随机生成的多变量二次方程组是NP难的。听起来很硬核,对吧?但实际部署时问题不少。
多变量签名的典型代表是Rainbow(彩虹签名),但NIST在2022年宣布不再标准化Rainbow——因为被攻破了。是的,你没看错,一个PQC决赛选手被攻破了。这件事告诉我们:PQC还很年轻,别盲目信任任何算法。
目前多变量家族里还有GeMSS、LUOV等方案,但它们的密钥尺寸普遍偏大——公钥动辄几十KB甚至上百KB。在证书吊销场景里,这么大的公钥意味着证书本身会变得很重,CRL验证也会变慢。
我的判断:多变量密码在证书吊销流程里不太实用。密钥太大,而且安全性还在「洗牌期」。我个人建议暂时观望,等NIST下一轮标准化结果出来再说。
2.4 其他PQC家族
除了上面三个主流家族,还有几个「小众」方向值得提一下:
- 编码密码(Code-based Cryptography):基于纠错码的困难问题。Classic McEliece是代表,公钥巨大(~1 MB),但加密解密很快。不适合签名,但适合密钥封装。
- 同源密码(Isogeny-based Cryptography):基于椭圆曲线同源图上的困难问题。SIKE曾经是候选,但2022年被攻破。目前还在早期研究阶段。
- 对称密码的量子抵抗:别以为只有公钥密码需要升级。AES-256和SHA-256对量子计算机有天然抵抗力(Grover算法只能把安全强度减半),但密钥长度需要加倍。
2.5 PQC算法家族全景图
下面这张图是我自己整理的PQC算法家族关系。你可以把它当作一个「选型地图」——在证书吊销流程里,我们主要关注签名类算法,但密钥封装和哈希函数也会用到。
2.6 选型建议:证书吊销场景该用谁?
好了,家族介绍完了。你可能会问:这么多方案,我到底该选哪个?
我个人习惯从三个维度来评估:安全性、性能、生态成熟度。在证书吊销流程里,还有第四个维度:状态管理复杂度。
- CA签名(高频):首选Dilithium。性能好,无状态,NIST标准化,社区支持强。FALCON也可以,但实现难度高。
- OCSP响应器(中低频):可以考虑SPHINCS+。虽然签名大,但无状态,安全性最保守。哈希签名(XMSS/LMS)也可以,但要做好状态管理。
- CRL发布(批量签名):Dilithium依然是首选。如果CRL条目特别多,可以考虑用Merkle树聚合签名——这个我们后面会详细讲。
- 嵌入式/物联网设备:LMS或XMSS。签名小,计算快,但必须处理好状态持久化。
重要提醒:不要为了「看起来更安全」而选择非标准化的算法。NIST标准化的算法已经经过多轮密码分析,安全性有保障。我见过一些项目为了「炫技」用了非标算法,结果上线后被攻破——得不偿失。