密码学|Crypto-Enigma密码机原理

Enigma密码机是二战德军使用的密码机,是密码系统中出色的设计。
密码学|Crypto-Enigma密码机原理
文章图片

构件:

  • 5个rotor(转子/齿轮):编号I、II、III、IV、V,每次选其中3个使用。每个rotor上均存在着26个字母到自身的一一映射表,且各不相同。
  • Plugboard(接线板):内含26个接线柱,表示26个字母。将某两个字母连起即可实现这两个字母的相互转化(即按A出B,按B出A);
  • reflector(反射板):将26字母两两配对,实现配对的两个字母的相互转化。
加密过程: 加密过程要经过5个元件:(以明文A为例,假设Δ=0)
开始时输入A
  1. plugboard(假定接线板设置为:A-B,C-D)
    char plug[27] =
    “BADCEFGHIJKLMNOPQRSTUVWXYZ”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 A -> B

  2. rotor I
    char rotor[27] =
    “EKMFLGDQVZNTOWYHXUSPAIBRCJ”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 B -> K

  3. rotor II
    char rotor[27] =
    “AJDKSIRUXBLHWTMCQGZNPYFVOE”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 K -> L

  4. rotor III
    char rotor[27] =
    “BDFHJLCPRTXVZNYEIWGAKMUSQO”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 L -> V

  5. reflector
    char reflector[27]=
    “YRUHQSLDPXNGOKMIEBFZCWVJAT";
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 V -> W

经过上述5步,A转成W,按逆向路径经过3个齿轮时要反查表,把W进一步转化成密文:
  1. rotor III
    char rotor[27]=
    “BDFHJLCPRTXVZNYEIWGAKMUSQO”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 W -> R

  2. rotor II
    char rotor[27]=
    “AJDKSIRUXBLHWTMCQGZNPYFVOE”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 R -> G

  3. rotor I
    char rotor[27]=
    “EKMFLGDQVZNTOWYHXUSPAIBRCJ”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 G -> F

  4. plugboard
    char plug[27]=
    “BADCEFGHIJKLMNOPQRSTUVWXYZ”;
    /ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    即 F -> F

(plugboard和reflector映射表查表可以正向查,也可以反向查,结果一样)
经过上述 4+1+4 = 9 步,A转成W再转成F,F就是A的密文。
可以尝试把F当作明文重新9步走一遍,最后出来的一定是A。即明文到密文和密文到明文是完全对称的。
实际 【密码学|Crypto-Enigma密码机原理】实际的Enigma密码机/Enigma模拟器中,应注意:
  1. 在9步中,数据是从图中“右到左再左到右”传递的,因此去时第一个碰到的rotor在右,第三个碰到的rotor在左;回时第一个碰到的rotor在左,第三个碰到的rotor在右。
  2. Enigma是先转动rotor再进行映射,即 Δ 值的计算应该用转动之后的KeyMessage值计算。
上例的9步过程中,假设3个rotor的ring setting设为AAA,则如果需要让Δ =0 ,应该将MessageKey设成01 01 26即AAZ,再敲键。(这样,当敲键时,MessageKey将先变为AAA,并得到Δ = 0,就有了如上的9步过程)
因此可以看出,发完第一个字母A之后,再发的第二个字母的Δ值一定与第一个不同,依次类推每一个字母的Δ均不同,由此实现了不同位置的相同字母的密文字母不同(多表密码)(直至发到第26^3个字母,规律重新开始)
附 1、剩余两个rotor的映射表如下:
IV rotor:
ESOVPZJAYQUIRHXLNFTGKDCMWB
ABCDEFGHIJKLMNOPQRSTUVWXYZ
V rotor:
VZBRGITYUPSDNHLXAWMJQOFECK
ABCDEFGHIJKLMNOPQRSTUVWXYZ
2、5个rotor的使下一个rotor发生跳转的字母未必是Z,即未必是“满Z进一”
当 rotor I、II、III、IV、V 为Q、E、V、J、Z时,若再键入字符,则下一个rotor会转动一格。(当然,这个rotor也会转动一格,分别变为R、F、W、K、A)(5个rotor的QEVJZ称为“使进位字母”,又敲键能使下一个rotor转动)
3、Double stepping
由Enigma的机械结构决定,中间的rotor有两种情况会转动:
(1) 右边的rotor在自身的“使进位字母”,又敲键,右边的使中间的转动
(2) 中间的rotor在自身的“使进位字母”,又敲键,中间的反常转动(不论右边在什么位置)(反常机制,只有中间的rotor具有)
假定III=1=A, II=4=D, I=17=Q
现在I旋转,从Q变成R,一定会带动II旋转: III=1=A, II=5=E, I=18=R
此时再旋转I的话,I本来是不应该带动II转的(因为当前I不在Q这个位置),但是II还会立即再转。
(同时II正常带动III旋转: III=2=B, II=6=F, I=19=S)
4、Ring Setting
Ring setting是rotor内部的状态,在rotor转动时不会变化
MessageKey是rotor外部的状态(最外侧露出的值),会随每一次按键而变化
事实上在一个值,在传入rotor但进行映射之前,以及,在映射结束但传出rotor之前,需要分别加、减一个Δ值。其中Δ=MessageKey-RingSetting.
设I号齿轮的 RingSetting = B, MessageKey = D, 则 Δ = MessageKey - RingSetting = ‘D’ - ‘B’ = 2.
假定输入A,则A进入I号齿轮时,需要先加上Δ变成 A + 2 = C, 再映射C -> M,M - 2 = K。因此I号齿轮输出K.
非常值得说明的是,例如刚才的9步过程
5、初始状态的互通
通信双方的必须在同样的初始MessageKey下,才能完成如上对称加密、解密操作。那么初始状态如何保证相同?
发送方随机想出3个齿轮的外部状态(MessageKey)为: ABC,以明文的形式把ABC发送给对方。
再拿出今天要用到密钥即真正用来加密的齿轮初始状态为:ZJU
在当前齿轮初始状态为ABC的情况下,连续按下ZJU得到ZJU的密文Z’ J’ U’ 并发送给对方。
对方在齿轮初始状态为ABC的情况下,输入Z’ J’ U’ 可以解出ZJU
接下去双方都把齿轮的初始状态设为ZJU,然后就可以开始正式通讯。

    推荐阅读