一个时代的终结(Enigma密码)
本文最后更新于 2025-08-04,文章内容可能已经过时。
1940 年 10 月 14 日,前线一片寂静。这是一场蓄谋已久的战争,德军指挥官下达的这条指令——attack at dawn,引爆了这场战役。
ENIGAM

ENIGAM,二战期间最出色的密码,无数次为德军的情报传递,保驾护航。作为古典密码的集大成者,其破译难度极大,一度让英法两国放弃破译工作。但是好在,也是它加速了德国的覆灭。
结构
德国人的 Enigma 型号非常多,现在你看到的,是德国海军使用的 M3 型号。掀开板子,右侧是电池,左侧有三个转子。

转子里最重要的是这 26 条金属线,线的两端连着不同的字母

一个转子就是一套单表替换密码

三个转子就是三套单表替换密码

输入 A 先变成 E 再变成 Z 再变成 C,但对应关系任然唯一,任然可能会被频率破解。

ENIGMA 的巧妙之处就在于每输入一个字母,转子就转动一格。电流经过三个转子,再经过反射板返回,点亮灯泡,这样连续输入两个相同的字母,就可以被加密为不同的字母,抵消频率分析。

当最右边的转子转满 26 个刻度也就是一圈时,第二个转子才会跟着转动一个刻度,同样第二个转子转满一圈第三个转子转动一刻度。
M3 型号的第一个转子转过某个字母后,第二个转子才转一格,每个转子上会让其左边转子转动一格的字母被称为 Notch。每个转子的 Notch 不同,跟其具体构造有关。
转子的初始位置非常重要,初始位置不同,输入同样的明文,密文就不同,而初始位置可以任意设置。
此外,德军为每个 ENIGMA 配备了额外 5个 转子,每个转子的金属线连接方式都不一样,每次加密就重新选择 3个
-
三个转子的初始位置组合:
26 x 26 x 26 = 17576(种) -
三个转子排列方式:
A_{3}^{5} = 60 (种) -
转子完整初始位置:
17576 x 60 = 1054560(种)
不止有转子,还有接线板。

让它与三个转子相连,才是真正的 ENIGMA。

⚠️ 缺陷:
由于转子的设计缺陷,转到某些字母时,会直接带动相邻转子转动,而不必经过当前转子的 Notch。例如第二个转子的位置如果是 E,那再进行一次加密,第三个转子会直接转动一格,而不必将第二个转子转完一圈。这个设计缺陷,常常让 Enigma 的转子安全性小于理论值。
加密
输入明文,电流经接线板被替换成另一个字母,再流经三个转子,通过反射板返回三个转子,再次经过接线板最终点亮灯泡,获得密文。
接线板上有 26 个字母,一共有 10 根电线,每根电线可以将 任意 两个字母配对。

光是这些接线板的连接方式就有 26!/(6!10!2^10) = 150738274937250(种)
再搭配转子一共就有 1054560 x 150738274937250 = 15896255521782636000(种)
即使是当时的 25亿 人,没人每秒计算 1种 组合,也得进行 200年 。
在前面讲过维吉尼亚密码的破译手段,通过密文的循环来猜测密钥单词的长度,进而拆解为单表替换的频率破解。
在 ENIGMA 这里,你可以理解为轮转的三个转子将密钥单词的长度扩增为 1054560个。

接线板的引入让 ENIGMA 的密钥空间指数级扩增,两者的结合让 ENIGMA 变得牢不可破。
于此同时前线的德国部队,解读密文同样也需要一台 ENIGMA 和这样一个密码本。

密码本规定了每个月每一天的配置,包括转子的顺序和选择、初始位置以及接线板的配置等等。也就是说两台机器的设置要一模一样。
内部结构并不复杂,但知道结构没什么用,即便是已经可以复制出一台 ENIGMA 的波兰和英国的专家,没有密码本依然对破译束手无策。
但即便如此,在战争的最后方,一个名为布莱切利的庄园里,任有近万人在竭尽全力。

破绽
ENIGMA 的庞大密钥空间,主要由转子初始位置及接线板的连接方式决定。在没有获取密码本的情况下,如何确定这两个部件的结构呢,受制于物理结构,ENIGMA 有一个致命的缺陷,而这个缺陷的原因在于反射板,反射板要将输入的电流再反射回去,而电流是不可逆的,它必须沿着另一条路反射回去,这就意味着电流有可能点亮任意一个字母,除了它自己,而这就成为了盟军破解的关键。

盟军发现德军每天发送的密文中,都会出现固定的文本,比如天气信息和希特勒万岁(Heil Gitlet)
将这些每天固定出现的单词,与密文比对,如果出现明文字母相同的情况,就说明这串密文呢不可能跟这个单词对应。

移动单词依次比对,此时明密文完全不同,意味着这串字母有可能就是明文单词的密文。

当时的密码学家通过对上百份的电报比对,得出了一些明确的明密文对,而这些明密文对就是攻破接线板后盾的利矛。
解密
假设我们已经熟悉了这样的明密文对。

ENIGMA 要如何配置才能将 tomorrow 加密成这样一个密文,试遍所有可能?
先试转子,再试接线板的接线,但是这样的组合有 15896255521782636000 种,根本试不完。
观察明密文对,我们会发现这样一种关系 [t] --> [m] --> [r] --> [t]。

我们将这种关系称为字母循环圈。

t 如何加密为 m 的呢?
t 在接线板板上和一个字母相连,我们不知道它是什么,即为 字母1,紧接着 字母1 经过三个转子和反射板输出 字母2,当然我们也不知道 字母2 是什么,但他在接线板上与 M 相连。

m 到 R 到加密过程也是如此,M 与 字母2 相连,字母2 经过转子和反射板输出 字母3,字母3 再与 R 相连,r 到 T 的加密也同理。

我们不知道 1234 分别是什么字母,但他们之间肯定存在联系。
-
[字母 1] --> [转子和反射板] --> [字母 2]
-
[字母 2] --> [转子和反射板] --> [字母 3]
-
[字母 3] --> [转子和反射板] --> [字母 4]
仔细观察就会发现 字母4 和 字母1 都跟 T 相连,因此他们是同一个字母。
现在我们要做的就是对 字母1 进行假设,比如假设 字母1 是 A,它经过转子得到 字母2 再得到 字母3 再得到 字母4。
但这里假设的 字母1 是 A,字母4 是 Y,两者不相同,说明假设错误。

再假设 字母1 是 B,它经过转子得到 字母2 再得到 字母3 再得到 字母4 刚好为 B ,说明 字母1 的假设可能是对的,字母 T 和 B 相连,如果 字母1 和 字母4 一直不同就只能一直试。

但上面的过程有一个问题,假如转子的设置错了呢,也就是说即使 字母1 的假设是正确的,但转子错误 ,也就是正确的字母1 输出了错误 字母2 导致错误的 字母3 然后是错误的 字母4,错误的 字母4 和正确的 字母1 必定不同。

所以我们得先假设转子的初始位置,比如 AAA 再去破解接线板,如果接线板破解失败,再去调整转子的初始位置,再试 [AAB] --> [AAC] --> [AAD]。当然转子的初始位置有 1054560 种组合,所以遍历这个过程肯定会比较久。
要破解接线板的所有情况,我们需要多个循环圈来完成破解,循环圈越多,接线板的验证条件就越多,结果的可信度就越高。
1945 年 5 月 7 日
1945 年 5 月 7 日盟军截获了一段电报,这是德军使用 ENIGMA 发送的最后一条消息。

第二天 1925 年 5 月 8 日就是欧洲胜利日,ENIGMA 的破译是对智力和体力的双重考验。转子的初始位置有 1054560 种,任然让人们一筹莫展。只有等到图灵领导,制作了名为 Bombe 的机器诞生,齿轮的咬合和电流流动昼夜不停,在一次次的试错中,才找到了正确的初始位置。
ENIGMA 成功的地方在于,将落于纸笔和思维游戏的密码,借着机器上升至人力无法驾驭的程度,而最终打败机器的同样也是机器,当然那个年代将 ENIGMA 奉入神潭的人绝对想不到,计算机时代的到来,将让一切古典密码都黯然失色。
正如德军最后发出的那段密文,它不仅暗喻了战争的结束,也宣示着一个密码时代的终结。
🧸 参考文献
本文基于基本操作发行的《成为一名密码朋克》项目