我试图用维基百科和其他专用来源阅读一些Python代码中的WWII Enigma机器。目前,我有一台扰乱输入文本的机器,如果重置配置,可以将加扰的输出恢复为输入。但问题是代码没有从维基百科上的相同配置中产生预期的结果:
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.
如果我尝试使用转子和反射器配置对AAAAA
进行加密,我会找到on this list,我会得到加密的文本EVRDW
,而不是预期的BDZGO
。< / p>
由于文本正在被加密并且可以被正确破译,我相信错误是在文本的某个地方&#39;解释(或我对它们的理解),但我无法找到我的代码没有遵循Enigma机器操作的地方。
答案 0 :(得分:4)
我认为您在将角色传递到下一个戒指之前忘记将戒指设置转换为转子位置,下面的步骤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
关于转子设置的一句话
为确保正确的加密/解密,您需要在每个转子上进行2次设置
转子偏移只是整个转子在开始时旋转的方式(小窗口中显示的是什么字母)。因此,A位置表示转子具有字母A,B位置表示B等。这些在解码/编码过程中会自动更改,但在启动时需要正确,否则会出现垃圾
另一方面,转子设置改变内部布线相对于外部连接。因此,如果它处于A-01位置,那么进入外部A连接的信号将被路由到转子内部A连接,然后在内部编码为E(给定转子I)并在外部E线上传输。如果设置为B-02,则意味着外部A连接上的信号被路由到转子内部Z连接并因此在内部编码为J,那么由于设置,此J在外部K连接上被传输(因此,下一个转子会看到K)
令我感到困惑的是所有职位。我认为它们是外在的和内在的。每个转子有两个外部(进出),这些从不改变位置。然后每个转子有两个内部位置,一个由转子偏移控制,另一个由转子设置控制,这些在设备设置时改变,转子偏移在编码/解码过程中作为正常操作的一部分(转子)改变转动)
很长的解释,希望它能帮到更多的伤害,并且让你解决问题。