Python Enigma副本未产生预期结果

Python Enigma副本未产生预期结果,python,encryption,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 AAA

在维基百科和其他专门的资料中读了一些之后,我试图用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.
如果我尝试使用找到的转子和反射器配置对
aaaaaaa
进行加密,我会得到加密文本
EVRDW
,而不是预期的
BDZGO

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


我认为您忘记了在将字符传递到下一个环(下面的步骤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)

将A传递给该环,转化为E,之后转子和环旋转

After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
After one rotation
Pos:          ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

Rotor pos:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
              ||||||||||||||||||||||||||
              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: BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              KMFLGDQVZNTOWYHXUSPAIBRCJE

Rotor pos:    BCDEFGHIJKLMNOPQRSTUVWXYZA
              ||||||||||||||||||||||||||
              ABCDEFGHIJKLMNOPQRSTUVWXYZ
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

转子设置上的一个词

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

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

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

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


    长时间的解释,希望它帮助更多,伤害和你得到解决的问题

    嗯,我真的不明白处于“B-02”或“A-01”位置意味着什么,你能再进一步发展一下吗?好了,现在更清楚了。我遵循了你写的,如果设置为B,转子I将A编码为K,但它仍然不同于维基百科的例子,有三个转子、反射器和其他东西,我不知道为什么。我想我仍然缺少正确编程转子旋转所需的东西