gpt4 book ai didi

python - Enigma 副本未产生预期结果

转载 作者:太空狗 更新时间:2023-10-30 03:00:34 30 4
gpt4 key购买 nike

在阅读维基百科和其他专用资源后,我正在尝试用 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

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

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

转子设置说明

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

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

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

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

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

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

关于python - Enigma 副本未产生预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28712506/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com