后量子密码概念
后量子密码概念
本文适合
已经理解 RSA基本概念、ECC基础 和 格密码与LLL入门 的学习者。学完你能:说明后量子密码解决什么问题,区分 KEM、签名和混合迁移,并在 CTF 题中判断是参数、实现、采样还是协议组合出了问题
一句话判断
题目出现 ML-KEM、Kyber、ML-DSA、Dilithium、Falcon、SPHINCS+、LWE、NTRU、KEM、抗量子迁移或“量子计算能否破解 RSA/ECC”时,就进入后量子密码语境。
后量子密码不是量子通信。它是在普通计算机上运行、希望能抵抗未来大规模量子计算机攻击的密码算法。
题目中常见信号
算法和标准名称:
ML-KEM / Kyber
ML-DSA / Dilithium
SLH-DSA / SPHINCS+
Falcon
NTRU
LWE / Ring-LWE / Module-LWE
KEM / encaps / decaps题目材料:
public key
ciphertext
shared secret
signature
seed
noise sampler
polynomial ring
mod qCTF 中更常见的不是完整破解标准算法,而是:
- 参数被故意调小。
- 随机数或噪声采样错误。
- 解封装失败分支泄露信息。
- 序列化/反序列化边界错误。
- 混合协议把传统部分和后量子部分组合错。
核心概念
为什么 RSA 和 ECC 会受影响
RSA 依赖大整数分解困难,ECC 依赖椭圆曲线离散对数困难。足够强的量子计算机可以用 Shor 算法高效解决这些问题,因此长期安全性会受到威胁。
对称密码和哈希也会受 Grover 算法影响,但通常可以通过增加密钥长度或输出长度缓解。
KEM 不是直接加密
KEM 是 Key Encapsulation Mechanism,用来建立共享密钥。典型流程:
公钥 pk
-> Encaps(pk) 得到 ciphertext ct 和 shared_secret ss
-> Decaps(sk, ct) 恢复 ss
-> ss 进入 KDF / AEAD不要把 KEM 当作“直接加密任意长消息”。真实协议里通常是 KEM 建立密钥,再用对称加密保护数据。
签名和 KEM 是两类任务
签名解决身份和完整性问题:
Sign(sk, message) -> signature
Verify(pk, message, signature) -> True / FalseKEM 解决密钥建立问题。题目里如果混淆这两者,常常是协议分析点。
NIST 标准化现状
截至 2026 年,NIST 已发布的首批后量子密码 FIPS 标准包括:
- FIPS 203:ML-KEM,用于密钥封装。
- FIPS 204:ML-DSA,用于数字签名。
- FIPS 205:SLH-DSA,用于无状态哈希签名。
CTF 入门阶段不需要背完整参数,但要知道这些名称分别服务什么安全目标。
最小分析流程
1. 先判断题目层级
把题目归到一类:
优先看什么:KEM、签名、量子威胁、混合迁移
优先看什么:参数大小、模数、维度、噪声范围
优先看什么:随机数、采样、压缩、序列化、错误处理
优先看什么:身份绑定、KDF、传统算法和 PQC 组合
2. 检查参数是否玩具化
标准算法的真实参数通常不会被 CTF 直接暴力破解。看到很小的 n、q、多项式维度或噪声范围,先记录:
print(n, q, eta, len(samples))如果维度很小,可能回到 格攻击案例专题 或 格密码与LLL入门。
3. 检查随机数和采样
后量子实现高度依赖随机采样。重点看:
- seed 是否复用。
- 噪声是否过小或恒定。
- rejection sampling 是否写错。
- 哈希到随机流是否漏了上下文。
4. 检查解封装和验证分支
KEM 解封装失败时不应泄露真实 secret 或分支差异。CTF 题可能通过错误消息、时间、返回值泄露信息。
5. 检查协议组合
混合密钥交换常见写法:
ECDH_secret || PQC_secret -> KDF -> session_key如果协议只使用其中一个 secret,或者 KDF 没绑定算法、身份、会话,就可能被降级或替换。
最小验证示例
验证 KEM 是否被当成加密函数误用
如果代码形如:
ct, ss = encaps(pk)
ciphertext = xor(message, ss)验证点:
assert len(ss) < len(message) or "KDF/stream expansion exists"没有 KDF 或 AEAD,直接循环 XOR ss 可能导致重复密钥流,回到 XOR基础 的分析方式。
验证 seed 复用
如果多次封装共享 seed:
seeds = [record.seed for record in records]
print(len(seeds), len(set(seeds)))输出如果类似:
20 1说明所有样本使用同一个 seed。下一步要检查噪声、多项式或共享密钥是否可预测。
常见利用 / 解题路线
路线总览:
路线一:玩具 LWE / NTRU 参数
适合:
- 维度很小。
- 噪声范围很小。
- 样本数量足够。
步骤:
- 写出线性关系和误差范围。
- 判断是直接线性代数、爆破小噪声,还是 LLL。
- 恢复 secret 或消息。
- 回代所有样本验证。
路线二:采样错误
适合:
- 随机数固定。
- 噪声分布异常。
- seed 可预测。
步骤:
- 收集多个输出。
- 检查重复 seed、重复 ciphertext、重复噪声痕迹。
- 用差分消掉随机项。
- 恢复 secret 或 shared secret。
路线三:解封装失败泄露
适合:
- 服务端返回不同错误。
- oracle 能多次查询。
- 错误分支把 secret、hash 或状态泄露出来。
步骤:
- 构造合法和非法 ciphertext。
- 记录返回差异。
- 判断差异是否与 secret bit、校验值或解码状态相关。
- 逐步恢复目标信息。
路线四:混合协议降级
适合:
- 同时出现 ECDH 和 PQC。
- 协商算法可控。
- KDF 输入没有绑定算法和身份。
步骤:
- 画出消息流。
- 标出哪些字段被签名或 MAC 覆盖。
- 尝试替换算法字段或某一侧 public key。
- 看双方是否仍派生同一弱密钥。
常见失败原因
- 把后量子密码等同于量子通信:题目大多仍是普通代码和普通数据。
- 看到格就只会 LLL:有些题是实现错误、协议错误或采样错误。
- 混淆 KEM 和公钥加密:KEM 产出共享密钥,不负责加密长消息。
- 忽略失败分支:decaps 返回错误、默认 secret、日志信息都可能是漏洞。
- 只看算法名不看参数:标准名可能被题目换成玩具参数。
- 忽略混合协议绑定:传统部分和 PQC 部分必须一起进入 KDF 并绑定上下文。
迷你案例
题目给一个“PQC 混合通信”脚本:
ecdhe_secret = ECDH(a, B)
pqc_secret = decaps(sk, ct)
session_key = sha256(ecdhe_secret).digest()页面说明“我们已经接入抗量子 KEM”。但代码里 pqc_secret 没有进入 session_key。
分析步骤:
- 识别这是混合迁移协议。
- 检查 KDF 输入,发现只用了 ECDH。
- 结论:后量子部分没有实际提供保护。
- 如果 ECDH 还使用弱曲线、固定私钥或可控公钥,就按传统协议题继续攻击。
WP 里要写清楚:
不是 ML-KEM 本身被破解。
漏洞是协议组合错误:PQC secret 没有进入 KDF。这类题最重要的是分清“算法安全性”和“使用方式安全性”。