Enigma 副本未产生预期结果

ran*_*alt 5 python encryption

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

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.
Run Code Online (Sandbox Code Playgroud)

如果我尝试AAAAA使用我在此列表中找到的转子和反射器配置进行加密,我会得到加密文本EVRDWBDZGO这与预期相反。

由于文本正在加密并且可以正确解密,我相信错误出在文本解释(或我对它们的理解)的某个地方,但我找不到我的代码不遵循 Enigma 机器操作的地方。

代码链接

Joh*_*han 5

我认为您在将字符传递到下一个环之前忘记了从环设置转换为转子位置,下面的第 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
Run Code Online (Sandbox Code Playgroud)

几个例子

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

Starting position
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

将 A 传递给该环会转换为 E,此后转子和环会旋转

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

所以下一个 A 变成了 J

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

Starting position
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    ZABCDEFGHIJKLMNOPQRSTUVWXY
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

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

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

所以下一个 A 变成了 E

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

Starting position
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

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

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    CDEFGHIJKLMNOPQRSTUVWXYZAB
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

所以第二个 A 产生一个转子输出 I

关于转子设置的一句话

为确保正确的加密/解密,您需要在每个转子上进行 2 项设置

  1. 转子偏移
  2. 戒指设置

转子偏移只是整个转子在开始时的旋转方式(小窗口中显示的字母是什么)。因此,A 位置表示转子有字母 A 显示,B 位置表示 B 等。这些在解码/编码期间会自动更改,但在启动时需要正确,否则会产生垃圾

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

令我困惑的是所有职位。我认为它们是外部的和内部的。每个转子有两个外部(输入和输出),它们永远不会改变位置。然后每个转子有两个内部位置,一个由转子偏移控制,另一个由转子设置控制,这些在设备设置时更改,并且在编码/解码过程中作为正常操作的一部分更改转子偏移(转子旋转)

很长的解释,希望它对你的伤害有所帮助,并希望你能解决问题。