Caloogy 文章
English

Enigma 是怎样被数学家破解的:置换群与共轭

日期
2026 年 10 月 9 日
系列
密码学
阅读
4 分钟
主题
EnigmaPermutation groupConjugationCycle type

一句话版本

Enigma 每按一个键,就对 26 个字母做一次置换。波兰数学家 Rejewski 发现,把同一天开头几个字母的置换相乘,得到的置换的轮换类型只取决于转子位置,与插线板无关,因为插线板的作用是共轭,而共轭不改变轮换类型。 这让他能先绕开插线板,把天文数字般的密钥空间缩小到可以查表的规模。

全文分三层:

  1. 通俗理解:Enigma 怎么工作,它的致命弱点
  2. 实际用处:波兰的破译、图灵的 Bombe,以及对现代密码设计的影响
  3. 数学原理:置换、轮换分解、共轭,Rejewski 的定理,附手算例子

第一层:通俗理解

1.1 Enigma 是一台"会换表的替换密码机"

最简单的替换密码:把字母表打乱,A→Q、B→W……这很好破,因为字母频率(E 最常见)会暴露它。

Enigma 的改进是:每按一个键,替换表就变一次。

键盘

插线板
(交换若干对字母)

三个转子
(每按一次键转动)

反射器

原路穿回转子

插线板

灯板亮起

总密钥数约为 102310^{23} 量级。德军认为它牢不可破。

1.2 两个"方便"带来的致命弱点

  1. 加密和解密是同一个操作。因为反射器的存在,若 A 加密成 G,则 G 也加密成 A。操作员不用切换模式,很方便。
  2. 没有字母会加密成它自己。这也是反射器造成的。

第二点后来被图灵团队大量利用:如果你猜到某段密文对应的明文(比如天气报告里一定有 "WETTER"),可以把这个词沿着密文滑动,凡是有字母对上自己的位置都可以排除。

1.3 第三个弱点:重复发送

1930 年代,德军每条消息开头把 3 个字母的"消息密钥"连发两遍(共 6 个字母),以防发报错误。这意味着第 1 和第 4 个密文字母来自同一个明文字母,第 2 和第 5、第 3 和第 6 也是。Rejewski 正是从这里切入的。


第二层:实际用处

1932波兰的 Rejewski用置换群理论还原转子接线1938波兰制造 Bomba 机器1939开战前,波兰把成果交给英法1940图灵和 Welchman 设计Bombe,在布莱切利园投入使用1941 起破译大西洋 U 艇通信Enigma 破译简史

对今天的启示:

Enigma 的问题 现代密码的原则
安全性依赖机器结构保密 Kerckhoffs 原则:算法完全公开,只有密钥保密
重复发送消息密钥 协议设计不能泄露明文之间的关系
字母不会加密成自己 密码输出必须和随机数不可区分,任何偏差都是突破口
固定格式的报文("WETTER") 必须抵抗已知明文攻击

第三层:数学原理

3.1 置换与轮换

26 个字母的所有置换构成对称群 S26S_{26}。任何置换都可以唯一地写成不相交轮换的乘积,比如

σ=(A C F)(B D)(E)⋯\sigma = (A\ C\ F)(B\ D)(E)\cdots

表示 A→C→F→A,B↔D,E 不动。各轮换长度组成的多重集叫轮换类型,例如上面是"一个 3-轮换、一个 2-轮换……"。

Enigma 的单次加密是一个没有不动点的对合:它由 13 个对换组成,自己乘自己等于恒等。这正是"加解密相同"(对合)和"没有字母加密成自己"(没有长度为 1 的轮换)的代数表述。

3.2 共轭不改变轮换类型

抽象代数里的一个基本事实:对任意 τ∈Sn\tau \in S_n,

τ (a1 a2 ⋯ ak) τ−1=(τ(a1) τ(a2) ⋯ τ(ak)).\tau\, (a_1\ a_2\ \cdots\ a_k)\, \tau^{-1} = \big(\tau(a_1)\ \tau(a_2)\ \cdots\ \tau(a_k)\big).

也就是说,共轭只是把轮换里的字母改个名字,轮换的长度一个都不变。所以 σ\sigma 和 τστ−1\tau\sigma\tau^{-1} 的轮换类型完全相同。SnS_n 中两个置换共轭,当且仅当它们轮换类型相同。

手算例子:共轭等于改名

在 S5S_5 中取 σ=(1 2 3)(4 5)\sigma = (1\ 2\ 3)(4\ 5),τ\tau 为 1↦2, 2↦4, 3↦5, 4↦1, 5↦31\mapsto 2,\ 2\mapsto 4,\ 3\mapsto 5,\ 4\mapsto 1,\ 5\mapsto 3。

按"改名"规则直接写出: τστ−1=(τ(1) τ(2) τ(3))(τ(4) τ(5))=(2 4 5)(1 3).\tau\sigma\tau^{-1} = (\tau(1)\ \tau(2)\ \tau(3))(\tau(4)\ \tau(5)) = (2\ 4\ 5)(1\ 3).

验证一个点:τστ−1(2)\tau\sigma\tau^{-1}(2)。先 τ−1(2)=1\tau^{-1}(2) = 1,再 σ(1)=2\sigma(1) = 2,再 τ(2)=4\tau(2) = 4。结果是 44,和 (2 4 5)(2\ 4\ 5) 一致。

两者的轮换类型都是"一个 3-轮换 + 一个 2-轮换"。

3.3 Rejewski 的观察

设某天第 ii 个位置的加密置换是 EiE_i,那么

Ei=S−1 Ti S,E_i = S^{-1}\, T_i\, S,

其中 SS 是插线板(自己是对合,S−1=SS^{-1} = S),TiT_i 是转子加反射器在该位置的置换。

因为消息密钥发了两遍,若某个明文字母 xx 在位置 1 被加密成 y1y_1,在位置 4 被加密成 y4y_4,那么 E4E1E_4 E_1(E1E_1 是对合,所以先用 E1E_1 从 y1y_1 回到 xx)把 y1y_1 送到 y4y_4。收集当天几十条消息的开头,就能把乘积置换 E4E1E_4 E_1 完整写出来,而且不需要知道任何明文。

关键一步:

E4E1=S−1T4S⋅S−1T1S=S−1 (T4T1) S.E_4 E_1 = S^{-1} T_4 S \cdot S^{-1} T_1 S = S^{-1}\,(T_4 T_1)\,S.

插线板 SS 只是在外面做了一次共轭。所以 E4E1E_4E_1 的轮换类型等于 T4T1T_4T_1 的轮换类型,完全不受插线板影响。

Rejewski 团队于是把转子顺序和起始位置的约 10 万种组合,逐一记录 E4E1E_4E_1、E5E2E_5E_2、E6E3E_6E_3 的轮换类型,做成卡片目录(他们用的是一台叫"cyclometer"的装置)。每天截获消息后算出这三个轮换类型,查目录就能锁定转子设置,再单独解决插线板。

另一个定理

Rejewski 还用到:两个没有不动点的对合的乘积,相同长度的轮换总是成对出现。所以 E4E1E_4E_1 的轮换类型形如"两个 aa-轮换、两个 bb-轮换……",这是检验数据是否抄错的好办法。


总结

层次 要点
直觉 每按一键换一张替换表;但反射器让"没有字母加密成自己"
代数 每次加密是 S26S_{26} 中无不动点的对合;插线板是共轭
突破 共轭不改变轮换类型,插线板被"消掉",转子设置可查表
启示 Kerckhoffs 原则、不重复、输出与随机不可区分