Enigma密码机是二战德军使用的密码机,是密码系统中出色的设计。
文章图片
构件:
- 5个rotor(转子/齿轮):编号I、II、III、IV、V,每次选其中3个使用。每个rotor上均存在着26个字母到自身的一一映射表,且各不相同。
- Plugboard(接线板):内含26个接线柱,表示26个字母。将某两个字母连起即可实现这两个字母的相互转化(即按A出B,按B出A);
- reflector(反射板):将26字母两两配对,实现配对的两个字母的相互转化。
开始时输入A
- plugboard(假定接线板设置为:A-B,C-D)
char plug[27] =
“BADCEFGHIJKLMNOPQRSTUVWXYZ”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 A -> B
- rotor I
char rotor[27] =
“EKMFLGDQVZNTOWYHXUSPAIBRCJ”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 B -> K
- rotor II
char rotor[27] =
“AJDKSIRUXBLHWTMCQGZNPYFVOE”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 K -> L
- rotor III
char rotor[27] =
“BDFHJLCPRTXVZNYEIWGAKMUSQO”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 L -> V
- reflector
char reflector[27]=
“YRUHQSLDPXNGOKMIEBFZCWVJAT";
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 V -> W
- rotor III
char rotor[27]=
“BDFHJLCPRTXVZNYEIWGAKMUSQO”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 W -> R
- rotor II
char rotor[27]=
“AJDKSIRUXBLHWTMCQGZNPYFVOE”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 R -> G
- rotor I
char rotor[27]=
“EKMFLGDQVZNTOWYHXUSPAIBRCJ”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 G -> F
- plugboard
char plug[27]=
“BADCEFGHIJKLMNOPQRSTUVWXYZ”;
/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
即 F -> F
经过上述 4+1+4 = 9 步,A转成W再转成F,F就是A的密文。
可以尝试把F当作明文重新9步走一遍,最后出来的一定是A。即明文到密文和密文到明文是完全对称的。
实际 【密码学|Crypto-Enigma密码机原理】实际的Enigma密码机/Enigma模拟器中,应注意:
- 在9步中,数据是从图中“右到左再左到右”传递的,因此去时第一个碰到的rotor在右,第三个碰到的rotor在左;回时第一个碰到的rotor在左,第三个碰到的rotor在右。
- Enigma是先转动rotor再进行映射,即 Δ 值的计算应该用转动之后的KeyMessage值计算。
上例的9步过程中,假设3个rotor的ring setting设为AAA,则如果需要让Δ =0 ,应该将MessageKey设成01 01 26即AAZ,再敲键。(这样,当敲键时,MessageKey将先变为AAA,并得到Δ = 0,就有了如上的9步过程)附 1、剩余两个rotor的映射表如下:
因此可以看出,发完第一个字母A之后,再发的第二个字母的Δ值一定与第一个不同,依次类推每一个字母的Δ均不同,由此实现了不同位置的相同字母的密文字母不同(多表密码)(直至发到第26^3个字母,规律重新开始)
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=Q4、Ring Setting
现在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)
Ring setting是rotor内部的状态,在rotor转动时不会变化
MessageKey是rotor外部的状态(最外侧露出的值),会随每一次按键而变化
事实上在一个值,在传入rotor但进行映射之前,以及,在映射结束但传出rotor之前,需要分别加、减一个Δ值。其中Δ=MessageKey-RingSetting.
设I号齿轮的 RingSetting = B, MessageKey = D, 则 Δ = MessageKey - RingSetting = ‘D’ - ‘B’ = 2.非常值得说明的是,例如刚才的9步过程
假定输入A,则A进入I号齿轮时,需要先加上Δ变成 A + 2 = C, 再映射C -> M,M - 2 = K。因此I号齿轮输出K.
5、初始状态的互通
通信双方的必须在同样的初始MessageKey下,才能完成如上对称加密、解密操作。那么初始状态如何保证相同?
发送方随机想出3个齿轮的外部状态(MessageKey)为: ABC,以明文的形式把ABC发送给对方。
再拿出今天要用到密钥即真正用来加密的齿轮初始状态为:ZJU
在当前齿轮初始状态为ABC的情况下,连续按下ZJU得到ZJU的密文Z’ J’ U’ 并发送给对方。
对方在齿轮初始状态为ABC的情况下,输入Z’ J’ U’ 可以解出ZJU
接下去双方都把齿轮的初始状态设为ZJU,然后就可以开始正式通讯。
推荐阅读
- 恩格玛密码机的工作原理
- 历史上的今天|【历史上的今天】2 月 23 日(英格玛密码机申请专利;戴尔电脑创始人出生;Mellanox 收购 EZchip)
- 密码学 14 CryptoJS
- 错误注入攻击总结(Fault Injection Attack)
- 密码学 13 数字签名算法
- 密码学 12 AES和RSA 的结合
- 密码学 10 非对称加密算法
- 区块链|Zcash:工作原理
- 区块链|比特币钱包安全