“先看仅有少量已知明文的情况,明文W E T T E R第一个字母W被加密成E,它的加密过程是:首先经过插线板进行了一次替换(记作函数p1),然后经过三个转子(记作r),又经过反射器返回并再次经过一次插线板(p2),写成W->(p1)->r->(p2)->E。”
“我们知道两次经过插线板仅仅是最简单的两两字母替换,可以用如下的方法进行推测插线板的设置:假设W与A连接W-A,则W->(p1)=A,然后A通过三个转子加密。由于转子的内部连接结构是已知的,就可合理选择一个转子状态,假设A通过转子后输出L,即A->r=L, 这样得L->(p2)=E,就可推断出在插线板L和E连接L-E。”
宋鸿飞刷刷刷在黑板上推演,俞大维聚精会神地看着,头脑在飞速运转。
“这样,通过这个已知明文按照同样的方式继续推断,可以发现插线板的其他设置,K-Q、X-B、T-G、W-J,到这里就发现有问题了,我们首先已假设W-A,W不可能同时连接两个字母A和J,这就能证明W-A的设定是错误的。然后,继续推断W-B、W-C、W-D,如此迭代,推断完26种可能,嗯当然没有连接也是一种可能。。”
“如果所有可能都是错的,就意味着转子的设置是错误的,就需要拨动一下转子,再次尝试另一个设置,并重复上面的推断过程。”
俞大维惊叹道:“真是一个绝妙的方法!这样一来,就只需尝试26次插线板连接!转子的设置总共有十万种可能,虽然还是很大的工作量,但也是可以完成的了!”
宋鸿飞道:“是的,破解过程原理就是如此!不过这样需要很长的时间,还有更聪明的方法。其一,当我们发现得出了一个错误的结果比如W-A和W-J,这就意味着与之相关的推测得到的连接都是错误的,往下就无需再检查这些连接了,这样能排除大量待检组合。”
俞大维点点头,道:“对,这样用时就大大减少了!”
宋鸿飞又笑笑道:“但是这样也还都是手工进行重复工作,我们应该把它交给机器!”
宋鸿飞接着在黑板画出原理图,进行推演:“我们可以设计出一种这样的机器:把上面做的推测如W-A通过电路的方式实现,电路会自动进行推测,当进行到W-J,这意味着推测错误。电路可快捷地找到W-A中所有的推测可能,也就是所有错误结果。然后,再依次推测另一组转子设置。十万级别的数量,对于电路来说不算什么问题。”
“就是一个不断排除错误选项的过程,最后剩下的就是没有引发错误的设置方式,只需要采用人工检查的方式,看看得到的结果是否正确。”
俞大维道:“把最繁杂重复的大量工作交给机器,效率就大大提高了!”
宋鸿飞又道:“如果得到了更多的类似这种已知明文,密码专家们称之为‘Crib’(小抄)。当能构成一条字母环时,对于机器来说还有更绝妙的方法。”
俞大维大感兴趣,道:“小抄?这名字倒是够贴切的。”
宋鸿飞推演道:“还是用W E T T E R来举例,如果推测出下面这样构成环的小抄:
明文 W E T T E R
密文 E R K M G W
在这个对印关系中,明文W第一次被加密成E,转子转动一位后E被加密成R,转子转动五位之后R又被加密成W。记作:W->(r1)->E->( r2)->R->( r6)->W ,
观察W -> E这个步骤,它经过插线板和转子的过程就是W->p1->r->(p2)->E。W首先被插线板替换成了另外一个字母,记为t1,接着t1进入三个转子又被替换成了t2,最后t2又再次经过插线板被替换成了E,整个过程记作:W->(p)->t1->r->t2->(p)->E。
在W-E-R-W这个字母环中,可以等效于W、E、R三个字母经过三台密码机首尾串联,及以上一台机器得到的输出作为下一台机器的输入进行加密得到的结果,分别记为:W-E、E-R、R-W。
则整个过程为:
W->(p)->t1->r(1)->t2->(p) ->E
->E->(p)->t3->r(2)->t4->(p) ->R
->R->(p)->t5->r(6)->t6->(p) ->W
因为插线板的设置在整个加密过程中是不变的,t2经过第一台机器插线板得出E,接着E又经过第二台插线板得出t3,可见t2=t3,同理t4=t5,t1=t6,这个插线板的过程就可以相互抵消掉了。这样,这个过程就简化为:
W->(p)->t1->r(1)->t2
->r(2)->t4
->r(6)->t6->(p)->W
那么现在只要输入t1,然后试着让v1先后通过三台恩格玛机的转子r(1)、r(2)、r(6)得到一个输出结果t6,并检查是否t1=t6。如果不相等,那么说明当前转子设置是错误的。如果相等,则说明密码机的设置可能是正确的,再通过人工对明文和密文进行检查就可。”
“插线板的输出t1无非就是26种可能性而已,甚至可以通过制造多组这样的几台串联机器,同时输入26个字母进行测试。”宋鸿飞缓缓地道。