#14513 – Vtuber, That’s not my neighbour, and some history

昨晚在enn(https://www.youtube.com/@EnnSingsCh)玩That’s not my neighbour的stream里玩得很开心。其中一个环节是解析一段密码,然后回答加密的问题。

当时手边已经打开了攻略,所以已经知道了明文甚至是答案,然而看着enn和cleo(https://www.youtube.com/@AkariCleo)在现场想不到如何使用key来解开原文的时候,我忽然开始了一段短暂但非常有趣的旅程。

问题:

“The key is hide. EQEY QBXM MBIA MWXM XUES MCMS BQIX WUEW AHWY MV?”

1.算法

有4个字母的密钥,有4个字母一节的密文,答案感觉是要呼之欲出了,然而算法在哪儿?

当然在那个时候我已经知道明文了,至少我能记住一小部分,当时就在草稿纸上写了这么一些东西:

clip_image001

在开始做这个图之前,我其实对答案已经有一些预期:

①这是一个游戏,所以算法一定非常简单。

②密钥、密文和明文的形式高度提示一种需要用到加减运算的算法。

③我猜测从字母到数字的转换应该是简单的一一对应,而且很有规律,而不像真正的加密工具那样需要一个专门的转换表(如这个在冷战时期实际使用的对应表:(https://www.ciphermachinesandcryptology.com/en/table.htm))。

于是我首先写出了右边的对应表,然后选择一个字母对进行检测(写在左侧)。当密钥、明文和密文对齐而且将数字写在旁边的时候,答案简直在眼前直接跳出来了。

首先,将字母和数字对应起来。A=1,B=2……Z=26。

然后,将密文字母对应的数字减去密钥对应的数字。当产生负数的时候,将结果加上26。

最后用得出的数字通过对应表得出原文。

不过当我得出这个算法的时候两位已经决定放弃抵抗去直接看攻略了,所以这个计算本身也就失去了意义。

然而这个结果让我想到了一些以前听说过但是真的没有自己动手做过的事。

2.已知明文攻击(Known Plaintext Attack)(https://en.wikipedia.org/wiki/Known-plaintext_attack)

如果没有密钥的话,能不能解出来?

当然我是没办法擦除自己的记忆重头来过了,我也缺乏需要的数学能力,但是能不能试着模拟一下?

首先,还是需要有一些预期,不然需要考虑的事情太多了。

①还是那句话,这是个游戏,别太难。

②这肯定是英文(x,从标点符号看来,还是一个疑问句。

③四个一组。

最后这句话有点扯淡。大概是因为之前看了太多奇怪的书(比如这本:https://en.wikipedia.org/wiki/The_Code_Book)和相关资料的缘故,我觉得这样写的密文不怎么可能是ROT13(https://en.wikipedia.org/wiki/ROT13)那样的简单替换式体系。它更可能是一种手工的算术加密算法,类似Enigma(https://en.wikipedia.org/wiki/Enigma_machine)那样的东西,但是简单到可以用手工处理(比如这种加密方式的最早形式,Vernam Cipher:https://en.wikipedia.org/wiki/Gilbert_Vernam)。

当然了,更可能是因为我有了之前解释算法的时候的经验。

有了这些前设之后,就可以开始实验了。

首先还是建立一个最简单的字母和数字的替换表,A=1,B=2,如此类推,直到Z=26。

然后是选择一些可能会出现在英文问句首部的词语,最好是4个字的(只是因为密文是4个字一组),比如WHAT,WHEN,HAVE,DOES之类。

WHAT=23 8 1 20

WHEN=23 8 5 14

HAVE=8 1 22 5

DOES=4 15 5 19

接着,将密文的片段转换成数字:

EQEY=5 17 5 25

将两组数字对齐,然后逐个用明文减去密文:

WHAT-EQEY=(23 8 1 20)-(5 17 5 25)=18 -9 -4 -5

WHEN-EQEY=(23 8 5 14)-(5 17 5 25)=18 -9 0 -11

HAVE-EQEY=(8 1 22 5)-(5 17 5 25)=-3 -16 17 -20

DOES-EQEY=(4 15 5 19)-(5 17 5 25)=-1 -2 0 -6

这样就得到了4个可能的密钥。至于为什么用减法?因为我有前设经验(x。但是用加法的话,会发现很多数字都会超出1-26的区间,减法虽然会产生很多负数,但是这些负数的绝对值都在1-26之间出现,这样看起来更有可能还原出可用的密钥来(如果密钥本身是字母的话)。

将第二节密文转换成数字:

QBXM=(17 2 24 13)

将4个密钥叠加上去,再转换成字母。如果得数是负数或者0,加26,大于26,减26,这种算法能够让得到的结果回归到1-26的区间内:

(18 -9 -4 -5)+(17 2 24 13)=35 -7 20 8,转换后得到9 19 20 8,ISTH

(18 -9 0 -11)+(17 2 24 13)=35 -7 24 2,转换后得到9 19 24 2,ASXB

(-3 -16 17 -20)+(17 2 24 13)=14 -14 41 -7,转换后得到14 12 15 2,NLOB

(-1 -2 0 -6)+(17 2 24 13)=16 0 24 7,转换后得到16 26 24 7,PZXG

将两段猜测的明文拼合起来,可以发现,用WHAT作为可能明文计算出来的密钥产生出来的第二段明文拼起来是最像人话的:

WHAT ISTH

WHEN ASXB

HAVE NLOB

DOES PZXG

当然了,如果觉得这样还不够说服力的话,完全可以将第三段密文也进行上述同样的运算,再将得出的结果拼合起来再进行评价。因为这个算法的难度不高,慢慢实验总是可以的。

细心的人会发现以这种方法得出的密钥和游戏里提供的密钥(hide=8 9 4 5)不一致,不过这里使用的算法和游戏里的有区别(游戏里是密文减去密钥,这里是密文加上密钥),所以需要的数字会有一些不一样。

3.那这些事情又有什么关系?

确实,真的没什么意义(x,我的算法甚至很可能是错的。

但是我真的没想到会在一个晚上的时间将一个历史上非常重要的事件亲手模拟了一次。

前面提到,Gilbert Vernam发明了这种利用非进位加法进行加密的方式,他发现这种方式尤其适合用在密码机上。

1923年,德国吸取在一战期间密码被破译的教训,使用这个原理的改进版开发了Enigma密码机。

1932年,Marian Rejewski(https://en.wikipedia.org/wiki/Marian_Rejewski)在波兰与其他语言学家、数学家一起,通过对Enigma加密的密文进行大量的统计、语言学和数学分析,基本明确了Enigma的加密算法,而且可以通过对算法的分析将当天使用的密钥恢复出来,这样一整天的加密密文都可以被解密了。

在战争时期,能够破译这些加密的军事指令的意义不言而喻,因此Rejewski在德国入侵波兰的时候迅速被转移到安全的地方,而他破译Enigma的早期工作被交到了英国人手里。

英国情报机关在Bletchley Park(https://en.wikipedia.org/wiki/Bletchley_Park)的密码破译机关最终将Rejewski的部分研究结果和自身基于已知明文攻击得出的一些结论结合起来,完成了对Enigma密码的破译工作。这个工作一部分是得益于德国人写公文的坏习惯:他们总是会在一些固定的地方出现一些固定的词语,这些词语被作为已知的明文用来进行密码分析。

这些研究最终奠定了现代密码学的基础,促进了电子逻辑工具的进步,最终导致了通用计算机的发明和发展。

这是相当有趣的一段历程。