📑 本页目录(点开跳转)
03 · 一次一密与完美保密
⏱ 22 分钟 | ⭐ 唯一数学上完美的加密
🎯 一句话
有一种加密方案,即使攻击者有无限算力也永远破不了 —— 这是可以严格证明的。 它简单到用一行就能写完。而它几乎没人用。 这两件事都很重要。
🔐 一、方案本身:异或
对照
密钥 K:和消息【一样长】的随机比特串
加密: C = M ⊕ K
解密: M = C ⊕ K
(⊕ 是异或:相同为 0,不同为 1)
为什么解密能work:
对照
C ⊕ K = (M ⊕ K) ⊕ K = M ⊕ (K ⊕ K) = M ⊕ 0 = M ✅
↑ 任何数异或自己 = 0
| 加密 / 位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| M | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
| K | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
| C = M ⊕ K | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
| 解密 / 位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| C | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
| K | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
| M = C ⊕ K ✅ | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
🏆 二、完美保密:它到底"完美"在哪
定义(Shannon):对任意明文 m 和任意密文 c, $$\Pr[M = m \mid C = c] = \Pr[M = m]$$
💡 人话翻译:
看到密文之后,你对明文的了解,和看到之前【一模一样】。 密文没有提供任何信息。
💡 一个能立刻感受到的例子
关键信息
- 假设消息是 2 bit,攻击者截获了密文 C = 11
- 他能推出什么?
- 如果 M = 00,那 K 必须是 11 可能,K 是随机的
- 如果 M = 01,那 K 必须是 10 也可能
- 如果 M = 10,那 K 必须是 01 也可能
- 如果 M = 11,那 K 必须是 00 也可能
- ⭐ 每一种明文都【恰好对应一个】同样可能的密钥
- → 四种明文的可能性完全相等
- → 密文什么也没告诉他
📐 严格证明(三行,想看再点)
对任意 m、c,满足 $C = M \oplus K$ 的密钥唯一:$k = m \oplus c$。
由于 K 均匀随机且独立于 M:
$$\Pr[C = c \mid M = m] = \Pr[K = m\oplus c] = 2^{-n}$$
这个值与 m 无关。代入贝叶斯公式:
$$\Pr[M=m\mid C=c] = \frac{\Pr[C=c\mid M=m]\Pr[M=m]}{\Pr[C=c]} = \frac{2^{-n}\Pr[M=m]}{2^{-n}} = \Pr[M=m]$$
∎
💡 证明的核心就一句:每个 (m, c) 对都恰好对应唯一一个等概率的密钥。
🔑 注意这个保证有多强:它不依赖任何计算假设。 攻击者有量子计算机、有一万年时间,都没有用 —— 信息根本不在密文里,不是"算不出来",是"不存在"。
💀 三、三个致命的限制
① 密钥必须和消息一样长
📐 Shannon 定理:这是数学上的下界(想看再点)
若一个方案满足完美保密,则密钥空间必须 ≥ 明文空间(即 $|\mathcal{K}| \ge |\mathcal{M}|$)。
反证:设 $|\mathcal{K}| < |\mathcal{M}|$。固定一个密文 c, 考虑集合 $S = \{ \text{Dec}_k(c) : k \in \mathcal{K} \}$,则 $|S| \le |\mathcal{K}| < |\mathcal{M}|$。
于是存在明文 $m^* \notin S$,即 $\Pr[M = m^* \mid C = c] = 0$。 但只要 $\Pr[M = m^*] > 0$,就违反了完美保密。∎
因果链
② 密钥只能用一次
这是本章最重要的一条,也是整个密码学里最常被违反的规则。
因果链
拿到 M₁ ⊕ M₂ 能干什么 —— crib dragging:
关键信息
- 自然语言有巨大冗余。攻击者猜一段常见文字(crib),
- 比如 " the ",把它在 M₁⊕M₂ 上逐位置滑动:
- 在每个位置 i 计算: (M₁⊕M₂)[i:] ⊕ " the "
- 如果猜错 → 得到一串乱码
- 如果猜对 → 得到【另一条消息在那个位置的真实文字】⭐
- 比如冒出 "ing t"
- → 然后用新得到的片段当作新的 crib,继续滑
- → 像填字游戏一样,两条消息【互相解开对方】
💥 真实事故: - 苏联 VENONA 计划(1940s):苏联情报机构复用了一次性密码本, 美国因此破译了数千份电报,暴露了大批间谍。 - 微软 PPTP(MS-CHAPv2)、WEP 无线加密:都因 IV/密钥流重用被打穿。 - 2017 年多个"加密聊天 App":用固定 nonce,等于密钥复用。
③ 不提供完整性
信息关系
🔑 一个重要的认知:「完美保密」不等于「完美安全」。 Shannon 的定理只覆盖机密性。
🌉 四、这个困境怎么破 → 整个现代密码学
因果链
信息关系
| 一次一密 | 现代对称加密 | |
|---|---|---|
| 安全强度 | 信息论安全(无限算力也没用) | 计算安全(多项式时间攻击者破不了) |
| 密钥长度 | = 消息长度 | 128/256 bit,固定 |
| 依赖假设 | 无 | 存在安全的 PRG / 分组密码 |
| 实用性 | ❌ 几乎不可用 | ✅ 到处都是 |
🔑 这个妥协是整个现代密码学的起点。 从"绝对安全但不可用",换到"在合理假设下安全且好用"。 🔗 第 4 章就讲这个 G 该满足什么条件。
💡 那 OTP 今天还有用吗
有,但场景极窄:
| 场景 | 为什么 |
|---|---|
| 外交/军事的红色电话 | 可以用外交邮袋提前运送密钥本,消息量小 |
| 量子密钥分发(QKD)的下游 | QKD 负责分发密钥,OTP 负责加密 |
| 需要长期保密的极敏感数据 | 抗"先收集,等以后再解密"(第 23 章)⭐ |
🔗 和站内其他章的关系
| 相关的地方 | 和这一章的关系 |
|---|---|
| 第 1 章:加密不提供完整性 | OTP 也不例外,"完美保密"≠"完美安全" |
| 第 2 章:维吉尼亚被 Kasiski 破 | 那是"密钥太短且重复"的极端版;OTP 是它的极限 |
| 后面的流密码 | 就是"用 PRG 模拟 OTP" |
| 后面的 nonce 铁律 | 本质就是"别把 OTP 的密钥用两次" ⭐ |
| 机器学习基础 04 · 决策树:怎么切一刀 | 那里的信息熵 / 信息增益就是完美保密用的同一把尺子:完美保密 = 密文对明文的信息增益恰好为 0 ⭐ |
| 数学原理 · 没有免费的午餐 | 同一种"必须先付代价"的定理形状:那边想要泛化就得先交出归纳偏置,这边想要完美保密就得先交出和消息一样长的密钥 |
✅ 检查点
- OTP 的加解密公式是什么?为什么解密能work?
- 完美保密的定义是什么?用人话说一遍。
- 为什么说这个保证"不依赖任何计算假设"?
- Shannon 定理说密钥至少要多长?这导致了什么根本困境?
- 密钥复用会泄露什么?攻击者拿到它之后怎么做?
- OTP 提供完整性吗?"完美保密"和"完美安全"的区别?
- 现代密码学是通过放弃什么、换来了什么?
👀 答案
- C = M ⊕ K,M = C ⊕ K。因为 (M⊕K)⊕K = M⊕(K⊕K) = M⊕0 = M——任何数异或自己等于 0。
- Pr[M=m | C=c] = Pr[M=m]。人话:看到密文之后你对明文的了解,和看到之前一模一样,密文没提供任何信息。
- 因为信息根本不在密文里——每个 (m,c) 对都恰好对应唯一一个等概率的密钥,所有明文的可能性完全相等。不是"算不出来",是"不存在"。攻击者有量子计算机也没用。
- 密钥空间 ≥ 明文空间,即密钥至少和消息一样长。困境:要安全传 1GB 数据得先安全传 1GB 密钥——但如果你已经有能安全传 1GB 的信道,为什么不直接传数据?
- C₁⊕C₂ = M₁⊕M₂(密钥被消掉了)。攻击者用 crib dragging:猜一段常见文字在异或结果上滑动,猜对时会冒出另一条消息的真实文字,再拿它当新 crib 继续滑,两条消息互相解开对方。
- 不提供。攻击者仍能翻转任意 bit(C'=C⊕Δ → 解密得 M⊕Δ)。"完美保密"只覆盖机密性这一个目标。
- 放弃对抗无限算力(信息论安全),换来只需短密钥——用 PRG 把 128 bit 种子拉长成任意长的伪随机流。代价是引入了计算假设。
🛑 可以停在这里
⚡ 走神救援
先记住这几件事
- 一次一密要求等长、真随机、独立且只用一次的密钥。
- 复用密钥会泄露两条明文之间的关系,破坏原有保密保证。
- 完美保密不等于完整性;现代方案用计算安全换取可管理的密钥长度。
下一节 👉 04-伪随机.md