本文最后更新于 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 相连。

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

我们不知道 1234 分别是什么字母,但他们之间肯定存在联系。

  • [字母 1] --> [转子和反射板] --> [字母 2]

  • [字母 2] --> [转子和反射板] --> [字母 3]

  • [字母 3] --> [转子和反射板] --> [字母 4]

仔细观察就会发现 字母4字母1 都跟 T 相连,因此他们是同一个字母。

现在我们要做的就是对 字母1 进行假设,比如假设 字母1A,它经过转子得到 字母2 再得到 字母3 再得到 字母4

但这里假设的 字母1A字母4Y,两者不相同,说明假设错误。

再假设 字母1B,它经过转子得到 字母2 再得到 字母3 再得到 字母4 刚好为 B ,说明 字母1 的假设可能是对的,字母 TB 相连,如果 字母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 奉入神潭的人绝对想不到,计算机时代的到来,将让一切古典密码都黯然失色。

正如德军最后发出的那段密文,它不仅暗喻了战争的结束,也宣示着一个密码时代的终结。

🧸 参考文献

基本操作 - 可以玩的大学课程

本文基于基本操作发行的《成为一名密码朋克》项目