昨晚看了一部几年前的电影《模仿游戏》,是由霍奇斯写的《图灵传:如谜的解谜者》改编而成,感觉可以推荐一下。
这部电影主要讲述的是英国科学家图灵在二战期间帮助盟军破解德军密码系统的故事,有历史学家认为,破解德军密码系统是二战中盟军的一次重要胜利,可能导致二战提前两年结束,避免了上千万人死亡。凑巧,上一篇文章提到的《黄河青山》中,黄仁宇回忆了一段他在战场上从事情报工作的往事:我们的密码专家秦少校替我制作一套特殊密码,对我说:“任何密码都是折衷的产物,要看使用的时间有多长,使用情况有多频繁。将情报传给敌人?没错,不过事实就是如此。只要你使用无线电通讯,就是在冒险,问题在于值不值得。因此,在你发出信前,再仔细检查一次,想想内容落入敌手的后果。”
"秦少校"几十年前的这番话无疑是到位的,无线电通讯并不安全,所以信息加密显得更为重要。即使对方捕获了你的信息,如果他们没有办法将“YXDCV ZTRUI UZREF GUJCV”这样的密文还原成"明天下午四点发起总攻",还是没用。另外一点是,如果你的加密信息中“频繁”出现重复性的内容,就会出现规律性,而规律性往往是破解的突破口,图灵破解德军加密系统的突破口就是:密报中经常出现的关于天气的内容以及结尾常有的“元首万岁”。
可惜黄仁宇没有进一步透露“秦少校”设计的密码系统有何"特殊"之处,我们没有办法一探究竟。于是,我无处安放的好奇心只能先给到被图灵“攻破”的这套加密系统:德军的Enigma Machine(恩尼格玛机)。上图就是Enigma机,2016年它的拍卖价格高达50万美元,注意,Engima机有很多种变形,有的看起来外观不太一样,但是原理都大同小异,比如下图。凯撒密码
Enigma的加密思路其实非常简单:将一个字母转换为另一个。
这种加密思路可以说由来已久,典型的如古罗马时代的“凯撒密码”,它的加密原理是将字母根据它在字母表的次序向后移动若干个位置。比如,移动位置设为1,那么A就变成B,B就变成C,C就变成D。。如果移动位置设为3,那么A就变成D,B就变成D。。这种加密方法的问题在于:计算量太小,很容易被破解。比如:现在你捕获到敌人的密文:pdwk lv ixq那么你只需要制作一张类似下方的“移位对照表”,把各种移位的对应关系列出来,然后每一种移位都尝试一下,直到找到有意义的文本即可。Enigma的精巧设计
同样是将一个字母换成另外一个,相比“凯撒加密”算法,Enigma的加密算法要强大和精巧的多,早期盟军甚至认为这种加密方法是无法破解的,下面我们详细了解一下。
如上图所示,我把整个机器分成四个区域,并分别进行了命名。操作员每次在“输入区”按下一个字母,在“结果显示区”就会有另外一个字母的灯亮起来,比如说我们按下字母P(黑色按钮),结果是字母Q(白色灯)亮起来,P就需要替换为Q。注意:每一次加密(替换)的是单个字母,你把P换成Q之后,需要把Q先记起来再换下一个字母进行加密。如果你要发送的原文有100个字母,就是重复这个过程100次,最后再将替换过的这100个字母串通过无线电发送出去。那么问题来了,机器是怎么决定按下P以后是输出Q还是W还是其它字母的呢?
机器的当前状态指的是:滚轮的类型、滚轮的当前刻度、插线配对板的连接线。
上面的图片显示机器有三个滚轮,实际上确切的说法是:这台机器有三个滚轮槽,插入了三个滚轮。这台机器总共可能配有五个或者六个滚轮,每一个滚轮槽插入什么滚轮,每个滚轮的刻度不同都会让加密(替换)结果产生变化。
那么,“插线配对板”接线又是什么作用呢?
答案是:配对两个字母进行交换。
比如A和L这两个孔连在一起,意思就是字母A先换成L,L换成A,然后再进入前面提到的“滚轮系统”去加密。
Enigma机最早期是用在商业信息传递上,那时候的机子就没有“插线配对”这个设置,军用Enigma机加入这个功能其实就是为了进一步增加暴力破解的难度。
我们现在知道,加密输出跟机器当前状态有关,而机器当前状态其实就是组件的状态组合。仅滚轮这一个组件,我们可以大概算一下有多少种状态组合。
假如机器有三个滚轮槽,配备五个可插入滚轮,每个滚轮的刻度是26格的话,那么它的组合情况是:
5*4*3*26*26*26=1054560(种)
简单解释一下,槽口1有5个滚轮可以选择,槽口2有4个滚轮可以选择,槽口3有3个滚轮可以选择,然后每一个都是26个刻度。
一百多万种是挺多的,但并非天文数字啊,破解的难点在哪儿呢?回顾一下前面提到的“凯撒加密”算法,当你确定了移位的数字(比如2)之后,一个字母换成另外一个字母是固定的,比如P换成Q就一直是换成Q,不可能换成其它字母。但对Enigma机来说,滚轮会因为“输入区”按下的字母键出现变化,也就是机器的当前状态是一直在变化的。这意味着,同一个字母会因为输入次序的不同会被加密(替换)成不同的字母。比如你连续两次按下字母"P",第一次变成字母"Q",第二次则可能会变成字母"W"。字母的输入顺序如此重要,意味着一个字母都不能出错,所以很可能这样子的机器需要专门的操作员。
新的输入会影响机器的当前状态,而当前状态决定了后续字母对应的输出。这个前提下,当你尝试进行“暴力破解”时,所需要尝试的组合就会是一个20多位数字的天文数字了。(这个数字已经远超一般人的想象力了,我甚至懒得帮你想一个通常有的那种比喻)。
雪上加霜的是,留给暴力破解的时间只有24小时。为什么呢?
因为德军的操作员,每个月都会收到一个“密码本”,里面详细规定了每一天的初始设置(槽口插入什么滚轮,滚轮选择什么刻度,插线配对怎么连接),也就是说,每一天机器初始设置都会不同。根据我的理解,如果一天之内要发送多封电报,每一封电报在加密之前,都需要先把机器“重置”为“密码本”规定的当天的初始设置,这样子接收到密文的那一方才有可能进行解密操作。
紧接着我们会问:收到加密信息的那一方是怎么解密的?答案是:接收到加密信息的这一方,要使用一个完全相同类型的机器,完全相同的初始设置(通过"密码本"知道),然后把密文严格按照顺序输入,得到原文。要回答这个问题,需要了解这个机器详细的机械和电气设计,我对此并不了解,而我的好奇心也止于此步,所以我只能讲一讲我的猜测。
下图是一个示意图,显示的是输入字母Q得到字母U的过程(省去了插线配对的流程,Keyboard=输入区,Lamp Board=结果显示区,Moving Rotors = 滚轮)。我把Q-U之间的连线想象成一条无数个开关组成的通路,通路的一端是字母Q,另外一端是字母U。如果两台机采用相同的初始设置,通过U得到Q这个逆向过程应该不至于太困难。
更深的一点是,当图灵破解了加密算法之后,对这个消息保密变成了一个更重要的问题,因为如果德军知道、识别出自己的加密系统被攻破,就会改换其它的系统甚至故意传播假消息。图灵他们的解决之道是设计出一个基于统计的系统,由这个系统决定对某些消息采取应对措施。
有兴趣看到这里的朋友,一定会对图灵具体是怎么破解Enigma机感兴趣的,哈哈哈,问题是我现在还不知道,先挖个坑,下次,下次应该也许有机会填上。