一句话版本
用一串真随机、和消息一样长、只用一次的密钥,把消息逐位异或(或逐字母相加),得到的密文对任何人(包括拥有无限算力的人)都毫无信息。 原因是:在群里加上一个均匀随机的元素,结果仍是均匀随机的。香农在 1949 年证明了这一点,也证明了代价:密钥至少要和消息一样长。
全文分三层:
- 通俗理解:为什么"什么都可能"等于"什么都不知道"
- 实际用处:华盛顿–莫斯科热线、Venona 计划,以及现代加密为什么不用它
- 数学原理:完美保密的定义与证明、密钥长度下界、两次一密的崩溃,附手算例子
第一层:通俗理解
1.1 加法加密
把字母换成数字(A=0, B=1, …, Z=25),明文每个字母加上对应位置的密钥字母,模 26:
| H | E | L | L | O | |
|---|---|---|---|---|---|
| 明文 | 7 | 4 | 11 | 11 | 14 |
| 密钥 X M C K L | 23 | 12 | 2 | 10 | 11 |
| 和 mod 26 | 4 | 16 | 13 | 21 | 25 |
| 密文 | E | Q | N | V | Z |
解密就是减回去。电脑上通常用二进制,"加"就是异或(XOR)。
1.2 为什么破解不了
拿到密文 EQNVZ 的人,可以尝试任何一个 5 字母的密钥:
- 密钥 XMCKL → 明文 HELLO
- 密钥 TQURI → 明文 LATER
- 密钥 RCRVB → 明文 NOWAY
每个 5 字母的单词都对应恰好一个密钥。密钥是完全随机选的,所以每种明文都同样可能。攻击者算力再强也没用:问题不是"算不出来",而是"答案根本不确定"。
1.3 三个条件缺一不可
- 真随机:不能是伪随机数,否则攻击者可以去破解生成器;
- 和消息一样长:密钥不能循环使用;
- 只用一次:用两次就会崩溃(见 2.2 和 3.4 节)。
第二层:实际用处
2.1 真实使用
- 1917 年:AT&T 的 Vernam 发明了电传打字机上的异或加密;随后 Mauborgne 提出密钥必须随机且只用一次。
- 冷战热线:1963 年古巴导弹危机后建立的华盛顿–莫斯科热线,早期就用一次一密的纸带加密。
- 间谍密码本:特工随身携带印满随机数字的小本子,用一页撕一页("one-time pad"这个名字就是这么来的)。
2.2 Venona 计划:用了两次就完了
二战期间,苏联因为战时生产压力,重复印制了一部分密码本页。美国陆军的 Venona 计划(1943–1980)利用这些重复使用的密钥,破译了数千条苏联情报电报,揭露了曼哈顿计划中的间谍(如 Klaus Fuchs、Rosenberg 夫妇)。
2.3 为什么现代加密不用它
| 问题 | 说明 |
|---|---|
| 密钥太长 | 加密 1 GB 视频需要 1 GB 真随机密钥,而且要事先安全地送到对方手上 |
| 密钥分发 | 如果有办法安全送出 1 GB 密钥,那为什么不直接送消息? |
| 只保密,不防篡改 | 攻击者把密文某位翻转,明文对应位也被翻转(可延展性),而且不会被发现 |
所以现实中用流密码(ChaCha20、AES-CTR):用一把短密钥生成"看起来随机"的长密钥流,再异或。安全性从"信息论安全"降为"计算安全",换来了实用性。参见《LFSR与流密码》。
量子密钥分发(QKD)
QKD 的卖点就是"用物理定律安全地分发长密钥",再配合一次一密做到信息论安全。但它需要专用光纤或卫星,距离和速率都有限。
第三层:数学原理
3.1 完美保密的定义
香农的定义:对任意明文分布、任意明文 和密文 ,
看到密文前后,你对明文的判断完全没变。等价地,密文的分布与明文无关。
3.2 证明:群里的平移
设消息、密钥、密文都在一个有限群 里(比如 或 ),密钥 在 上均匀随机,与 独立,。
对任意 ,恰好有一个密钥 使 。因此
与 无关。由贝叶斯公式即得完美保密。
用抽象代数的话说:对每个固定的 ,平移 是 到自身的双射,均匀分布在双射下仍是均匀分布。
这个证明对任何有限群都成立,Shamir秘密分享的" 份毫无信息"本质上是同一个论证。
3.3 密钥至少和消息一样长
香农还证明:完美保密要求密钥空间 。
理由:固定一个可能出现的密文 。如果密钥比明文少,那么用所有密钥去解 ,最多得到 个不同明文,于是某个明文 永远不可能对应 ,即 。
所以"短密钥 + 完美保密"是不可能的,这是信息论层面的定理,不是工程上还没做到。
3.4 手算例子:两次一密
同一个密钥加密两条消息
密钥 。
- ,
- ,
攻击者把两个密文异或:
密钥被消掉了(因为 )。攻击者得到两条明文的异或,对自然语言来说,这几乎等于直接读到了明文:猜测其中一条里的常见词("the"、"天气"),另一条对应位置就自动解出来,这叫 crib dragging。Venona 计划就是这么做的。(已用 Python 验算。)
总结
| 层次 | 要点 |
|---|---|
| 直觉 | 每种明文都有一个密钥对应,所以"什么都可能" |
| 代数 | 群中加上均匀随机元素,结果仍均匀随机 |
| 代价 | 密钥 消息长度(香农定理);只能用一次 |
| 现实 | 用流密码换取实用性;两次一密曾导致 Venona 破译 |