Enigma 副本未产生预期结果

Enigma replica not yielding expected result

我试图在 Python 代码中模仿 WWII Enigma 机器,这是在阅读 Wikipedia 和其他专用资源后进行的。目前,我有一台机器可以对输入文本进行加扰,如果配置被重置,可以将加扰的输出恢复为输入。但问题是代码没有从维基百科上的相同配置产生预期结果:

With the rotors I, II and III (from left to right), wide B-reflector, all ring
settings in A-position, and start position AAA, typing AAAAA will produce the
encoded sequence BDZGO.

如果我尝试使用我发现 on this list 的转子和反射器配置来加密 AAAAA,我会得到密文 EVRDW,而不是预期的 BDZGO .

由于文本正在被加密并且可以正确破译,我认为错误是在文本的解释(或我对它们的理解)中的某个地方,但我找不到我的代码在哪里不遵循操作一台谜机。

Link to the code

我认为您忘记了在将角色传递到下一个环之前从环设置转换为转子位置,下面的第 4 步。在我看来,您只考虑了实际的转子编码并将其传递给下一个环。正确的方法是

1) letter comes in
2) translate letter using rotor setting offset
3) translate offest letter using the internal ring wiring to get encoded letter
4) translate encoded letter using the rotor setting (offset)
5) pass offsetted encoded letter to next ring

几个例子

例如使用转子 I(环设置 A-01,转子位置 A)

Starting position
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ring setting: ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              EKMFLGDQVZNTOWYHXUSPAIBRCJ

Rotor pos:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ

将 A 传递给这个环转换为 E,之后转子和环旋转

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ring setting: BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              KMFLGDQVZNTOWYHXUSPAIBRCJE

Rotor pos:    BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ

所以下一个 A 变成了 J

现在让我们混合环设置,让环设置 B-02(即旋转一步)但在 A 中设置转子位置

Starting position
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ring setting: ZABCDEFGHIJKLMNOPQRSTUVWXY
              ||||||||||||||||||||||||||
              JEKMFLGDQVZNTOWYHXUSPAIBRC

Rotor pos:    ZABCDEFGHIJKLMNOPQRSTUVWXY
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ

所以首先 A 变成 K 然后环旋转

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ring setting: ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              EKMFLGDQVZNTOWYHXUSPAIBRCJ

Rotor pos:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ

所以下一个A变成了E

现在让我们混合转子设置,让环设置 A-01 但转子位置在 B

Starting position
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ring setting: ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              EKMFLGDQVZNTOWYHXUSPAIBRCJ

Rotor pos:    BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ

第一个A然后产生转子输出D,旋转后设置为

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ring setting: BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              KMFLGDQVZNTOWYHXUSPAIBRCJE

Rotor pos:    CDEFGHIJKLMNOPQRSTUVWXYZAB
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ

因此第二个 A 产生转子输出 I

关于转子设置的一句话

为确保正确 encryption/decryption 您需要在每个转子上进行 2 次设置

  1. 转子偏移
  2. 铃声设置

转子偏移就是整个转子在开始时的旋转方式(小window中显示的字母)。因此A位表示转子有字母A表示,B位表示有Bet.c。这些在 decoding/encoding 期间会自动更改,但在启动时需要正确,否则会出现垃圾

另一方面,转子设置改变了相对于外部连接的内部接线。因此,如果它处于 A-01 位置,则从外部 A 连接进入的信号将路由到转子内部 A 连接,然后在内部编码到 E(给定转子 I)并在外部 E 线上传输。如果设置为 B-02,这意味着从外部 A 连接进入的信号被路由到转子内部 Z 连接,因此在内部编码为 J,然后由于设置,此 J 在外部 K 连接上传输(因此下一个转子将看到 K)

让我感到困惑的是所有职位。我认为它们是外部的和内部的。每个转子都有两个外部(输入和输出),它们永远不会改变位置。然后每个转子有两个内部位置,一个由转子偏移控制,另一个由转子设置控制,这些在设备设置时发生变化,转子偏移在 encoding/decoding 过程中作为正常操作的一部分发生变化(转子旋转)

冗长的解释,希望它对您的伤害更大,并希望您能解决问题。