mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
3515 字
10 分钟
后量子密码学
2026-04-20

RSA-2048 在经典计算机上需要 300 万亿年才能破解,在量子计算机上只需要几小时。Shor 算法把大数分解从指数时间降到多项式时间——RSA 和 ECC 的安全基础直接崩塌。更紧迫的是”先收集,后解密”攻击:攻击者现在截获你的 TLS 流量,等量子计算机成熟后再解密。如果你保护的数据需要保密 10 年以上,这个威胁已经迫在眉睫。NIST 在 2024 年正式标准化了后量子密码算法——迁移不是未来的事,是现在的事。

一、量子计算威胁#

1.1 Shor 算法:非对称加密的终结者#

1994 年,Peter Shor 提出了一个量子算法,可以在多项式时间内分解大整数和计算离散对数。这意味着 RSA 和 ECC 的安全基础——大数分解困难和椭圆曲线离散对数困难——在量子计算机面前不再成立:

算法经典计算量子计算(Shor)影响
RSA2^n(指数级)n³(多项式级)RSA 被破解
ECC2^nECC 被破解
DH2^nDH 被破解
AES2^n2^(n/2)(Grover)密钥长度需翻倍
graph TB QC["量子计算机"] --> SHOR["Shor 算法"] SHOR --> RSA_BROKEN["RSA 破解<br/>因子分解变简单"] SHOR --> ECC_BROKEN["ECC 破解<br/>离散对数变简单"] SHOR --> DH_BROKEN["DH 破解<br/>密钥交换不安全"] QC --> GROVER["Grover 算法"] GROVER --> AES_WEAKEN["AES 密钥长度需翻倍<br/>AES-128→AES-256"] style SHOR fill:#ffcdd2,stroke:#c62828 style GROVER fill:#fff3e0,stroke:#e65100

Shor 算法的核心思想是用量子傅里叶变换(QFT)找到函数的周期,然后用经典算法从周期推导出因子。具体来说,要分解 N = p × q:

  1. 随机选 a < N,计算 gcd(a, N)
  2. 用量子傅里叶变换找 f(x) = a^x mod N 的周期 r
  3. 如果 r 是偶数,则 gcd(a^(r/2) - 1, N) 可能是 p 或 q

经典计算机执行步骤 2 需要指数时间,量子计算机只需要 O(n³)。

1.2 Grover 算法:对称加密的削弱者#

Grover 算法可以将无序搜索问题从 O(N) 加速到 O(√N)。对于密码学,这意味着暴力搜索密钥的空间减半:

AES-128:经典暴力搜索 2^128 次 → Grover 搜索 2^64 次
AES-256:经典暴力搜索 2^256 次 → Grover 搜索 2^128 次
结论:AES-256 在量子时代仍然安全(2^128 次搜索不可行)
AES-128 需要升级到 AES-256
Note

对称加密的量子威胁远小于非对称加密——只需要将密钥长度翻倍即可。真正的危机在于 RSA 和 ECC,它们需要被全新的算法替代。

1.3 “先收集,后解密”威胁#

威胁说明
先收集后解密攻击者现在截获加密数据,等量子计算机成熟后解密
影响范围长期机密数据(国家安全、医疗记录、商业机密)
时间窗口量子计算机可能在 10-15 年内成熟
已知案例2023 年多个 APT 组织被观察到大量收集加密流量
timeline title "先收集后解密"攻击时间线 2024 : 攻击者截获 TLS 流量(ECDH 密钥交换) : 数据加密存储,暂时无法解密 2029 : 量子计算机发展,但仍不够大 2034 : 容错量子计算机成熟 : 用 Shor 算法破解 ECDH : 解密 10 年前截获的数据
Warning

后量子迁移不是”量子计算机出现后再做”——由于”先收集后解密”威胁,现在截获的数据在未来可能被解密。对于需要长期保密的数据,必须现在就开始使用后量子密码。

1.4 量子计算机发展现状#

指标当前状态破解 RSA-2048 需要预计时间
逻辑量子比特~1000~40005-10 年
容错量子比特~100~2000 万(含纠错)15-20 年
纠错码实验阶段Surface Code10-15 年
量子体积IBM 1000+远超当前不确定

破解 RSA-2048 大约需要 4000 个逻辑量子比特,但考虑纠错开销后需要约 2000 万个物理量子比特。IBM 预计 2029 年达到 10 万量子比特,但距离 2000 万仍有数量级差距。不过,技术突破可能加速这一进程。

二、格密码学基础#

2.1 什么是格(Lattice)#

# 格的简单示例:二维格
# 格 = 基向量的所有整数线性组合
import numpy as np
# 两个基向量
b1 = np.array([2, 1]) # 基向量 1
b2 = np.array([1, 3]) # 基向量 2
# 生成格点
lattice_points = []
for i in range(-3, 4):
for j in range(-3, 4):
point = i * b1 + j * b2
lattice_points.append(point)
# 格上的困难问题:给定目标点,找最近的格点
# 这就是 CVP (Closest Vector Problem) ——Kyber 的安全基础
target = np.array([3.7, 2.3])
# 暴力搜索在低维可行,但在 1000+ 维不可行
# 使用 liboqs 的 Kyber 密钥封装
# 安装
pip install liboqs-python
# 运行 Kyber768 密钥封装
python3 -c "
import oqs
with oqs.KeyEncapsulation('Kyber768') as kem:
pk = kem.generate_keypair()
ct, ss_enc = kem.encap_secret(pk)
ss_dec = kem.decap_secret(ct)
assert ss_enc == ss_dec
print(f'Shared secret: {ss_enc.hex()[:32]}...')
print(f'Ciphertext size: {len(ct)} bytes')
print(f'Public key size: {len(pk)} bytes')
"

格是 n 维空间中规则排列的点的集合。直观理解:在二维平面上,给定两个不共线的向量 v₁ 和 v₂,所有形如 a·v₁ + b·v₂(a, b 为整数)的点构成一个格。

二维格示例:
· · · ·
· · · ·
· · · ·
· · · ·
每个点都是基向量的整数线性组合

2.2 格上的困难问题#

格密码的安全性基于以下问题的计算困难性:

问题描述用于
最短向量问题(SVP)在格中找到最短的非零向量安全性基础
最近向量问题(CVP)给定一个点,找到格中最近的向量安全性基础
带误差学习(LWE)从带噪声的线性方程组中恢复密钥Kyber/Dilithium 的直接基础
模 LWE(Module-LWE)LWE 在环上的推广Kyber/Dilithium 实际使用

2.3 LWE 问题直觉#

LWE(Learning With Errors)是格密码的核心假设。想象一个线性方程组,但每个方程的右边都加了一个小的随机误差:

标准线性方程组(无误差): 带误差的线性方程组(LWE):
4x + 3y = 17 4x + 3y ≈ 17 + e₁
2x + 5y = 19 2x + 5y ≈ 19 + e₂
7x + 1y = 23 7x + 1y ≈ 23 + e₃
解法:高斯消元法 解法:?没有已知的高效经典算法
量子计算机也无法有效解决

没有误差时,高斯消元法可以轻松求解。加入小误差后,方程组变得”模糊”——没有已知的高效算法(经典或量子)能从带误差的方程组中恢复原始密钥。

三、NIST PQC 标准#

3.1 标准化历程#

timeline title NIST 后量子密码标准化历程 2016 : NIST 发布 PQC 标准化征集 2017 : 82 个算法提交 2019 : 第二轮筛选至 26 个 2020 : 第三轮筛选至 7 个决赛 + 8 个备选 2022 : 选出 Kyber/Dilithium/SPHINCS+ 2024 : FIPS 203/204/205 正式发布

3.2 三个标准#

标准算法用途数学基础替代
FIPS 203ML-KEM (Kyber)密钥封装Module-LWEECDH
FIPS 204ML-DSA (Dilithium)数字签名Module-LWE + Module-SISRSA/ECDSA
FIPS 205SLH-DSA (SPHINCS+)数字签名哈希函数备用签名

3.3 ML-KEM(Kyber)详解#

Kyber 是基于 Module-LWE 的密钥封装机制(KEM),用于替代 TLS 中的 ECDH 密钥交换:

# 使用 liboqs-python 测试 Kyber
from oqs import KeyEncapsulation
# 密钥生成
kem = KeyEncapsulation("Kyber768")
public_key = kem.generate_keypair()
# 封装(替代 ECDH 密钥交换)
ciphertext, shared_secret_enc = kem.encap_secret(public_key)
# 解封装
shared_secret_dec = kem.decap_secret(ciphertext)
assert shared_secret_enc == shared_secret_dec
参数集安全等级公钥大小密文大小共享密钥对应传统方案
Kyber512NIST Level 1800B768B32BAES-128
Kyber768NIST Level 31184B1088B32BAES-192
Kyber1024NIST Level 51568B1568B32BAES-256

与 ECDH(P-256 公钥 64B)相比,Kyber 的公钥和密文都大得多。这是后量子密码的普遍代价——更大的密钥和密文。

3.3.1 Kyber 算法概要#

Kyber 的内部构造基于 Module-LWE,核心步骤如下:

密钥生成:
1. 生成随机矩阵 A(n×n,每个元素是模 q 的多项式)
2. 生成秘密向量 s 和误差向量 e(小系数多项式)
3. 计算 t = A·s + e(模 q)
4. 公钥 = (A, t),私钥 = s
封装(Encapsulate):
1. 生成随机消息 m
2. 计算哈希 H(m) 作为共享密钥的种子
3. 生成小向量 r, e₁, e₂
4. 计算 u = Aᵀ·r + e₁, v = tᵀ·r + e₂ + Encode(m)
5. 密文 = (u, v)
解封装(Decapsulate):
1. 计算 m' = Decode(v - sᵀ·u) // 误差在 Decode 中被消除
2. 重新封装验证,防止解密失败攻击
3. 共享密钥 = KDF(m' || H(ciphertext))

Kyber 的核心运算是多项式环上的矩阵-向量乘法,使用数论变换(NTT)加速——类似于 FFT 在有限域上的变体。Compress/Uncompress 步骤将多项式系数从模 q 量化到更小的模,这是 LWE 误差的来源,也是安全性的根基。

3.4 ML-DSA(Dilithium)详解#

Dilithium 是基于 Module-LWE + Module-SIS 的数字签名方案:

# 使用 liboqs-python 测试 Dilithium
from oqs import Signature
# 密钥生成
signer = Signature("Dilithium3")
public_key = signer.generate_keypair()
# 签名
message = b"Hello, post-quantum world!"
signature = signer.sign(message)
# 验证
verifier = Signature("Dilithium3")
is_valid = verifier.verify(message, signature, public_key)
assert is_valid
参数集安全等级公钥大小签名大小对应传统方案
Dilithium2Level 21312B2420BRSA-2048
Dilithium3Level 31952B3293BECDSA-P-256
Dilithium5Level 52592B4595BECDSA-P-384

与 ECDSA-P-256(公钥 64B,签名 64B)相比,Dilithium 的公钥和签名都大了约 20-50 倍。

3.5 SLH-DSA(SPHINCS+)详解#

SPHINCS+ 是基于哈希的签名方案,安全性只依赖哈希函数的抗碰撞性——不依赖格假设:

维度DilithiumSPHINCS+
数学基础格密码哈希函数
签名大小~3KB~8-30KB
安全假设Module-LWE + Module-SIS仅哈希抗碰撞
速度
推荐主要签名方案备用签名方案
Tip

SPHINCS+ 的价值在于”保守安全”——如果未来发现格问题比预期容易,SPHINCS+ 仍然安全(只要哈希函数安全)。建议将 Dilithium 作为主要签名方案,SPHINCS+ 作为代码签名等高安全场景的备用。

3.6 密钥大小对比#

算法公钥大小签名/密文大小用途
RSA-2048256B256B(签名)传统
ECDSA-P-25664B64B(签名)传统
Ed2551932B64B(签名)传统
Kyber7681184B1088B(密文)PQC 密钥交换
Dilithium31952B3293B(签名)PQC 签名
SPHINCS+-128s32B7856B(签名)PQC 备用签名

后量子密码的密钥和签名普遍比传统方案大 10-50 倍,这是量子安全需要付出的带宽和存储代价。

四、混合方案与迁移#

4.1 为什么需要混合方案?#

在过渡期,同时使用传统算法和后量子算法是唯一安全的选择:

# 混合密钥交换:ECDH + Kyber
from cryptography.hazmat.primitives.asymmetric import ec
from oqs import KeyEncapsulation
import hashlib
# 1. 传统 ECDH 密钥交换
ecdh_private = ec.generate_private_key(ec.SECP256R1())
ecdh_shared = ecdh_private.exchange(ec.ECDH(), peer_ecdh_public)
# 2. 后量子 Kyber 密钥封装
kem = KeyEncapsulation("Kyber768")
kyber_ciphertext, kyber_shared = kem.encap_secret(peer_kyber_pk)
# 3. 混合共享密钥 = KDF(ECDH共享 || Kyber共享)
hybrid_shared = hashlib.sha256(ecdh_shared + kyber_shared).digest()
flowchart LR subgraph 传统["传统密钥交换"] ECDH["ECDH<br/>P-256"] end subgraph 后量子["后量子密钥交换"] KYBER["Kyber768<br/>ML-KEM"] end ECDH -->|"共享密钥 1"| KDF["KDF<br/>SHA-256"] KYBER -->|"共享密钥 2"| KDF KDF --> HYBRID["混合共享密钥<br/>32 字节"] style ECDH fill:#e3f2fd,stroke:#1565c0 style KYBER fill:#e8f5e9,stroke:#2e7d32 style HYBRID fill:#fff3e0,stroke:#e65100
方案经典安全量子安全说明
纯传统当前默认
纯后量子(新算法可能有问题)未来目标
混合过渡期推荐

混合方案的安全性是”与”关系——攻击者必须同时破解传统算法和后量子算法才能获得共享密钥。

4.2 TLS 1.3 中的 PQC 混合密钥交换#

Chrome 和 Firefox 已经开始支持 TLS 1.3 的 PQC 混合密钥交换:

TLS 1.3 PQC 混合密码套件:
X25519Kyber768Draft00 — Chrome 116+ 默认启用
X25519MLKEM768 — FIPS 203 发布后的标准名称
握手流程:
1. ClientHello 包含 X25519 + Kyber768 的公钥
2. ServerHello 返回 X25519 + Kyber768 的公钥
3. 两个密钥交换的共享密钥通过 KDF 混合
4. 即使 Kyber 被破解,X25519 仍然保护连接
5. 即使 X25519 被量子破解,Kyber 仍然保护连接

4.3 密码学敏捷性(Crypto-Agility)#

密码学敏捷性是后量子迁移的基础能力——系统必须能够快速替换密码算法:

敏捷性维度说明实现方式
算法可替换不硬编码算法名称配置驱动,支持算法列表
密钥格式可扩展支持更大的密钥通用密钥存储接口
协议可协商运行时协商算法TLS 密码套件协商
降级可控制防止降级攻击最低安全级别策略
// Go: 密码学敏捷性设计示例
type CryptoSuite struct {
KEM string // "X25519", "Kyber768", "X25519Kyber768"
Sign string // "ECDSA-P256", "Dilithium3", "ECDSA-Dilithium"
Symmetric string // "AES-256-GCM"
MinLevel int // 最低安全等级(1-5)
}
var SupportedSuites = []CryptoSuite{
{KEM: "X25519Kyber768", Sign: "ECDSA-Dilithium3", Symmetric: "AES-256-GCM", MinLevel: 3},
{KEM: "Kyber768", Sign: "Dilithium3", Symmetric: "AES-256-GCM", MinLevel: 3},
{KEM: "X25519", Sign: "ECDSA-P256", Symmetric: "AES-256-GCM", MinLevel: 1},
}

4.4 迁移路径#

阶段时间行动风险
评估现在盘点所有使用 RSA/ECC 的系统
测试2024-2025在测试环境部署 PQC
混合部署2025-2027生产环境启用混合模式中(性能/兼容性)
纯 PQC2028+根据成熟度逐步移除传统算法高(新算法未经长期检验)
Tip

后量子迁移的关键是”现在开始准备”——1)盘点密码学资产;2)建立密码学敏捷性;3)测试 PQC 实现;4)规划混合部署。不要等到量子计算机出现才开始。

五、性能影响与优化#

5.1 PQC 性能对比#

操作ECDSA-P-256Dilithium3倍数
密钥生成~0.1ms~0.2ms2x
签名~0.5ms~0.3ms0.6x
验证~1ms~0.1ms0.1x
公钥大小64B1952B30x
签名大小64B3293B51x
操作X25519Kyber768倍数
密钥生成~0.05ms~0.1ms2x
封装/交换~0.1ms~0.15ms1.5x
解封装~0.1ms~0.15ms1.5x
公钥大小32B1184B37x
密文大小32B1088B34x

PQC 的计算开销并不大(通常 2-10 倍),但密钥和密文大小显著增加,这会影响网络传输和存储。

5.2 优化策略#

策略说明效果
混合模式仅在需要时启用 PQC减少不必要的开销
证书压缩压缩更大的 PQC 证书减少传输量
缓存密钥缓存 Kyber 密钥对减少密钥生成开销
硬件加速未来的 PQC 加速指令类似 AES-NI 的加速

六、PQC 对协议的影响#

6.1 TLS 握手大小#

PQC 密钥比传统密钥大得多,直接影响 TLS 握手的网络开销:

算法组合ClientHello 增量总握手大小影响
ECDH (传统)0~300 字节基准
ECDH + Kyber768+1,216 字节~1,500 字节可能触发 MTU 分片
ECDH + Kyber1024+1,568 字节~1,900 字节几乎必然分片
Note

SIKE(超奇异同源密钥交换)曾是 NIST PQC 第四轮候选算法,但在 2022 年被经典计算机在 1 小时内破解。这个教训说明:密码学算法的安全性需要经过充分的同行评审,新算法在标准化之前不应投入生产使用。

6.2 代码签名与 X.509 证书#

PQC 签名密钥的巨大尺寸对 PKI 体系冲击显著:

签名算法公钥大小签名大小证书链总大小
ECDSA P-25664 字节64 字节~1 KB
Dilithium31,952 字节3,293 字节~15 KB
SPHINCS+-256f64 字节29,792 字节~90 KB

证书链从 1KB 膨胀到 15-90KB,对 TLS 握手、OCSP 响应、证书存储都有显著影响。

6.3 混合 X.509 证书(RFC 9180)#

混合证书在同一个 X.509 证书中同时包含传统算法和 PQC 算法的公钥和签名:

flowchart LR TRAD["传统签名<br/>ECDSA/EdDSA"] --> CERT["混合 X.509 证书"] PQC["PQC 签名<br/>Dilithium/SPHINCS+"] --> CERT CERT --> VERIFY["验证时<br/>两种签名都须通过"] style CERT fill:#fff9c4,stroke:#f9a825

6.4 OpenSSL PQC 实践#

# 使用 oqs-provider 编译的 OpenSSL 配置混合 TLS
# 1. 安装 liboqs 和 oqs-provider
git clone https://github.com/open-quantum-safe/liboqs.git
cd liboqs && mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. && make -j$(nproc) && sudo make install
# 2. 生成混合密钥对(Kyber768 + X25519)
openssl req -x509 -new -nodes \
-newkey "kyber768:x25519" \
-keyout hybrid-key.pem -out hybrid-cert.pem \
-days 365 -subj "/CN=hybrid-test"
# 3. 启动混合 TLS 服务器
openssl s_server -cert hybrid-cert.pem -key hybrid-key.pem \
-accept 4433 -www -groups "kyber768:x25519"
Warning

后量子算法的密钥和签名尺寸远大于传统算法:Kyber768 公钥 1184 字节(对比 X25519 的 32 字节),Dilithium3 签名 3293 字节(对比 Ed25519 的 64 字节)。TLS 握手消息变大可能触发 TCP 分片,增加握手延迟。

# 使用 liboqs + OpenSSL 3.x 生成 PQC 密钥对
openssl req -new -newkey kyber768 -keyout kyber.key -out kyber.csr
# 生成混合证书(ECDH + Kyber)
openssl req -new -newkey ec:p-256 -keyout hybrid.key \
-addkey kyber768 -out hybrid.csr
# 查看混合证书
openssl x509 -in hybrid.crt -text -noout

6.5 侧信道抵抗#

格密码方案(Kyber/Dilithium)的实现需要抵抗侧信道攻击:

攻击类型防御方法说明
时序攻击常数时间实现NTT 变换必须与密钥无关
功耗分析掩码(Masking)将密钥拆分为多个随机份额
故障注入冗余计算重复关键运算并比较结果

Kyber 的 NTT(数论变换)是侧信道攻击的主要目标——如果 NTT 的执行时间依赖于密钥系数,攻击者可以通过计时推断密钥信息。生产级实现必须使用常数时间 NTT。

七、总结#

上一章剖析了同态加密与隐私计算。

维度关键要点
量子威胁Shor 破解 RSA/ECC(多项式时间),Grover 削弱 AES(密钥翻倍即可)
紧迫性”先收集后解密”威胁,长期机密数据需立即保护
格密码基于 LWE/Module-LWE 困难问题,量子计算机无法有效解决
NIST PQCKyber(密钥封装)、Dilithium(签名)、SPHINCS+(备用签名)
密钥大小PQC 密钥比传统大 10-50 倍,这是量子安全的代价
混合方案ECDH+Kyber、ECDSA+Dilithium,过渡期推荐
密码学敏捷性算法可替换、密钥格式可扩展、协议可协商
迁移路径评估→测试→混合→纯 PQC,现在开始准备
协议影响TLS 握手增大 1-2KB,X.509 证书膨胀 10-90 倍
侧信道格密码实现需常数时间 NTT、掩码、冗余计算
Warning

后量子迁移不是未来的事——“先收集后解密”攻击正在发生。如果你的数据需要保密超过 5 年,现在就应该使用混合方案(ECDH+Kyber)加密。


参考#

  • RFC 9180 — FrodoKEM Learning With Error Key Exchange

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

后量子密码学
https://blog.souloss.com/posts/cryptography/post-quantum-cryptography/
作者
Souloss
发布于
2026-04-20
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时