一句话版本
Enigma 每按一个键,就对 26 个字母做一次置换。波兰数学家 Rejewski 发现,把同一天开头几个字母的置换相乘,得到的置换的轮换类型只取决于转子位置,与插线板无关,因为插线板的作用是共轭,而共轭不改变轮换类型。 这让他能先绕开插线板,把天文数字般的密钥空间缩小到可以查表的规模。
全文分三层:
- 通俗理解:Enigma 怎么工作,它的致命弱点
- 实际用处:波兰的破译、图灵的 Bombe,以及对现代密码设计的影响
- 数学原理:置换、轮换分解、共轭,Rejewski 的定理,附手算例子
第一层:通俗理解
1.1 Enigma 是一台"会换表的替换密码机"
最简单的替换密码:把字母表打乱,A→Q、B→W……这很好破,因为字母频率(E 最常见)会暴露它。
Enigma 的改进是:每按一个键,替换表就变一次。
- 转子:每个转子内部是一套固定的接线(一个置换)。每按一次键,最右边的转子转一格,像里程表一样进位。
- 反射器:把电流送回去,再穿过转子一次。
- 插线板:用电线交换 10 对字母,这一步贡献了绝大部分密钥空间。
总密钥数约为 量级。德军认为它牢不可破。
1.2 两个"方便"带来的致命弱点
- 加密和解密是同一个操作。因为反射器的存在,若 A 加密成 G,则 G 也加密成 A。操作员不用切换模式,很方便。
- 没有字母会加密成它自己。这也是反射器造成的。
第二点后来被图灵团队大量利用:如果你猜到某段密文对应的明文(比如天气报告里一定有 "WETTER"),可以把这个词沿着密文滑动,凡是有字母对上自己的位置都可以排除。
1.3 第三个弱点:重复发送
1930 年代,德军每条消息开头把 3 个字母的"消息密钥"连发两遍(共 6 个字母),以防发报错误。这意味着第 1 和第 4 个密文字母来自同一个明文字母,第 2 和第 5、第 3 和第 6 也是。Rejewski 正是从这里切入的。
第二层:实际用处
- 情报(代号 Ultra)对大西洋战役影响巨大。常见的说法是它让战争缩短了两年左右,但这类估计很难精确验证。
- 布莱切利园后来又破译了更复杂的 Lorenz 密码机,为此建造了 Colossus,它是最早的可编程电子计算机之一。
对今天的启示:
| Enigma 的问题 | 现代密码的原则 |
|---|---|
| 安全性依赖机器结构保密 | Kerckhoffs 原则:算法完全公开,只有密钥保密 |
| 重复发送消息密钥 | 协议设计不能泄露明文之间的关系 |
| 字母不会加密成自己 | 密码输出必须和随机数不可区分,任何偏差都是突破口 |
| 固定格式的报文("WETTER") | 必须抵抗已知明文攻击 |
第三层:数学原理
3.1 置换与轮换
26 个字母的所有置换构成对称群 。任何置换都可以唯一地写成不相交轮换的乘积,比如
表示 A→C→F→A,B↔D,E 不动。各轮换长度组成的多重集叫轮换类型,例如上面是"一个 3-轮换、一个 2-轮换……"。
Enigma 的单次加密是一个没有不动点的对合:它由 13 个对换组成,自己乘自己等于恒等。这正是"加解密相同"(对合)和"没有字母加密成自己"(没有长度为 1 的轮换)的代数表述。
3.2 共轭不改变轮换类型
抽象代数里的一个基本事实:对任意 ,
也就是说,共轭只是把轮换里的字母改个名字,轮换的长度一个都不变。所以 和 的轮换类型完全相同。 中两个置换共轭,当且仅当它们轮换类型相同。
手算例子:共轭等于改名
在 中取 , 为 。
按"改名"规则直接写出:
验证一个点:。先 ,再 ,再 。结果是 ,和 一致。
两者的轮换类型都是"一个 3-轮换 + 一个 2-轮换"。
3.3 Rejewski 的观察
设某天第 个位置的加密置换是 ,那么
其中 是插线板(自己是对合,), 是转子加反射器在该位置的置换。
因为消息密钥发了两遍,若某个明文字母 在位置 1 被加密成 ,在位置 4 被加密成 ,那么 ( 是对合,所以先用 从 回到 )把 送到 。收集当天几十条消息的开头,就能把乘积置换 完整写出来,而且不需要知道任何明文。
关键一步:
插线板 只是在外面做了一次共轭。所以 的轮换类型等于 的轮换类型,完全不受插线板影响。
Rejewski 团队于是把转子顺序和起始位置的约 10 万种组合,逐一记录 、、 的轮换类型,做成卡片目录(他们用的是一台叫"cyclometer"的装置)。每天截获消息后算出这三个轮换类型,查目录就能锁定转子设置,再单独解决插线板。
另一个定理
Rejewski 还用到:两个没有不动点的对合的乘积,相同长度的轮换总是成对出现。所以 的轮换类型形如"两个 -轮换、两个 -轮换……",这是检验数据是否抄错的好办法。
总结
| 层次 | 要点 |
|---|---|
| 直觉 | 每按一键换一张替换表;但反射器让"没有字母加密成自己" |
| 代数 | 每次加密是 中无不动点的对合;插线板是共轭 |
| 突破 | 共轭不改变轮换类型,插线板被"消掉",转子设置可查表 |
| 启示 | Kerckhoffs 原则、不重复、输出与随机不可区分 |