现在就让我们来看一下,在实践中,这Enigma到底又是怎么用的吧。比如某艘U艇的水兵甲,受命与另一艘U艇联系;他的任务,就是把明文CDEF变成密文,并发给那艘U艇。于是他拿出Enigma,开始输入明文的第一个字母C。 这个字母C的信号进入Enigma的转轮组(此处省略一些技术细节,详情请见第五章),开始被转轮们依次加密。设想某种情况下,C被第一个转轮加密为Q,被第二个转轮加密为I,再被第三个转轮加密为F。下一步,它就要进入反射板了。根据前面的介绍,它将在反射板的另一个位置被“反射”回来,F也就再次被变换为新位置的P,然后回到转轮组。 之后,P又被3个转轮依次加密为R、L、Z,从转轮组输出;而最终的字母信号Z,就成为经过“转轮组-反射板-转轮组”这个流程连续加密的最终结果。因此,我们总结一下,这个C变化的全过程就是以下这样的。 这是一个很清晰的加密流向。以上流程的箭头方向都是向右,这就让我们考虑,如果箭头都向左,又会如何?换言之,如果转轮组的位置等设置都不变,只是水兵不再从整个链路的左端输入C,而是直接从链路的右手端输入Z,又会得到什么结果呢? 因为机器设置不变,所以,整个流程是完全可逆的。这就是说,从右手端新输入的Z,必然将连续变成L、R、P、F、E、Q,最终还是将输出C。需要提醒大家注意的是,由于有反射板的存在,导致无论从哪端输入,字母信号都必定沿着“1号转轮、2号转轮、3号转轮、反射板、3号转轮、2号转轮、1号转轮”的顺序,最终得到输出。这也就是说,无论我们从上图的链路左端或右端输入,其实根本都是没有分别的。 而这又意味着什么? 既然整个流程无所谓正向、逆向,如果把C输入,会得到Z的话,那么在机器设置不变的情况下,我们把刚才得到的密文字母Z输入,则必定会被再加密为C。到了这时候,既然C都出来了,那不就意味着对密文字母Z的脱密完全成功了么?所以,让Enigma的报务员去脱密密文,步骤其实非常简单。他什么别的都不用干,只要把机器设置调节好,然后把密文的一个个字母重新挨个敲进Enigma,“再次加密”出来的“新密文”,也就是他需要得到的初始明文了。 原理说清楚了,我们接着把刚才的例子讲完吧。 水兵甲要加密的明文为CDEF,现在刚加密完第一个字母C。下面,他还要继续输入字母D、E、F,同样经过上面的流程,最后也会被分别加密成新的密文字母,比如U、B、N。于是,明文CDEF就被转变为密文ZUBN。至此,整个加密过程已经圆满结束,他已经可以把这份新密文发出了。 在遥远的另一艘U艇里,水兵乙收到了密电并开始脱密。根据我们刚才的原理分析,他现在只要把Enigma的机器设置调整到和水兵甲的一样,然后依次输入密文ZUBN,机器就将自动地把它们“再加密”为CDEF——管它是靠“脱密”还是靠“再加密”得来的,反正现在得到的这个“CDEF”,不正是水兵乙需要的明文么?至此,脱密工作顺利完成,整个密码通信过程大功告成! 只不过,也许大家会奇怪:隔着碧波万里,水兵乙又是怎么知道水兵甲的Enigma设置情况的呢?其实说穿了也很简单:水兵甲告诉水兵乙不就完了嘛——不过这个“告诉”,当然不是对着大海一通狂喊,而是体现在发出的密报上。在当时,水兵甲在加密正文之前,会先把自己机器这时候的设置情况,按特定规则缩写为几个字母,并把这几个字母添加在电文的最前面,构成所谓“报头”的一部分;而为了保证正常识别,这几个字母是完全不加密的赤裸明文——完成了这个工作后,他才正式对明文开始加密。这样一来,水兵乙接到密电后,完全不需要什么密码本,直接就能读出报头的那几个关键字母。然后,水兵乙就可以按这个指示,将自己的机器调整到跟水兵甲的机器完全相同的设置上。之后,他继续不断地输入收到的密文,整份密电也就被顺利地脱密了。 正是这个小小的反射板,将Enigma方便使用的特性发挥到了极致。同一部机器,加密用它,脱密还用它;除了那个反射板之外,整部机器里没有附加任何额外的脱密装置,一切都还是密码编码机本身该有的部件——平心而论,这个“谜”的设计思路,真是优美得要命! 同时,反射板的硬件成本并不高,制造也不怎么复杂,体积还很小,完全可以装入Enigma机槽之内——这就是说,以工程师的眼光来看,的确是个很有可行性的方案。而就软件方面、具体说就是“培训基层报务员”方面的成本来说,优势则更加明显:受训人员甚至完全不需要知道技术原理,也无须额外学习另外的脱密机器使用规程,只要掌握本来就挺简单的Enigma加密操作流程就足够了——这就是说,以商人的眼光来看,也一样是个很具吸引力的方案。所有这一切,都决定了这个又便宜、又漂亮、又方便的主意,必定是极有前途的。 谢尔比乌斯接受了这个建议。由此,Enigma呈现出独特的“无脱密附件”现象,并成为整个Enigma家族的标志性特征。我们都知道Enigma是当之无愧的一代名机,而它要是没点“绝活儿”,又怎么“名”的起来呢——当然了,这个貌不惊人的反射板,正是Enigma的看家绝活! 如上所述,Enigma完成了密码技术方面质的飞跃,但是,谢尔比乌斯依然没有满足。他觉得,在增强Enigma的安全性方面,还是有潜力可挖、有文章可做的。最后,这个“匪夷”又想了一招,一如增设反射板那样简单,但是,也再一次大大地增加了密钥的长度。说穿了,这个办法其实也不复杂,本质上还是前文讲过的单表替代的一种,而且实现方法也非常简单,那就是在机器的外围电路里,再串联一个连接板。在这块连接板上,代表某两个字母的线路可以被互相交换,比如,B和I交换一下。如此一来,进入连接板的信号是CIA,离开连接板时就变成了CBA。 谢尔比乌斯认为,只交换两个字母是不妥当的;他一咬牙,索性交换了6对共12个字母的线路!这道新号令一下,在德文字母表上差不多占了一半的主人公们,马上就开始“一对一”地互相串起门儿来了。而在串门的时候,谢尔比乌斯还特别规定:不是一劳永逸地赖在别人家就成了,而是要定期“乱窜”。换言之,今天C和T互相串门,明天C也许就改为和E互相串了。这就是说,按照为此制定的“串门表”上的规定,昨天CIA会被变成TIA,而今天的CIA就会变成EIA了。如此这般,哪天谁该去谁家,表上列得清清楚楚,到了时候就走,绝没二话的。 经过简单的排列组合计算以后,我们可以知道:通过两两交换6对字母,可以生成100 391 791 500种不同的变化;而每一种变化,实际就对应着一张不同的换字表,或者说是一种不同的密钥——于是,Enigma密钥的总体长度,就此呈现出壮观的暴涨:密钥长度 = 17 576×6×100 391 791 500 = 10 586 916 764 424 000位。 翻译成简体中文,就是一亿零五百八十六万九千一百六十七亿六千四百四十二万四千位! 容我先捋捋舌头——这个翻译真不容易,也真难为我了…… 前文所说,单表替代是很危险、很容易被破解的加密方式。但是——无论什么问题都有个“但是”——它不安全的前提,正是因为它被独自应用。如果它不是被单独使用,而是与其他加密方式糅在一起,再联合对明文进行加密的时候,这个密码编码的体制,当然也就更加安全了。按照我们对Enigma的剖析来看,它的转轮组,功能正是多表替代;而连接板,功能则是单表替代(更严格的说明请见本书第五章)。当这两种不同风格的加密手段联合起来以后,效果真是非常明显:假如我们以密钥长度为安全指标进行考察的话,那么在增加了连接板以后,这个混合密码体制的强度,瞬间就如爆炸般地上升为单纯转轮组加密的一千多亿倍! 更深层的安全,还不仅仅体现在密钥位数的暴涨。如果只是单纯的单表替代,那么无论再怎么增强安全性,只要利用频率分析法,那些精心构造的伪装依然是无可遁形;如果只是单纯的多表替代,那么只要巧用包括卡西斯基试验在内的各种数学工具,一样有可能把它打翻在地。可现在,当两种方法天衣无缝地结合在一起以后,频率分析法首先失灵,卡西斯基试验跟着傻眼;过去无比好用的密码分析手段同时应声作废,再也奈何Enigma不得了——而在那个年代,数学界还真是没有任何一种办法,能够对付得了这种崭新的“单表替代+多表替代”的复合加密体制! 谢尔比乌斯还认为——我都怕他了,他还嫌不够结实——继续追求他的完美设计,看来是不把全世界的数学家都逼疯便绝不罢休:在一些机型上,他又加了一个转轮!而采用了Enigma的德国军方为了更好地保密,也执著地沿着谢尔比乌斯指明的道路,对已经强大得无与伦比的Enigma继续进行着孜孜不倦的改造:——在商用型Enigma的一个附件(输入轮)上,字母排列是按键盘顺序排列的。为防止潜在对手因为买到机器进而了解内部构造,军方采用的军用型Enigma输入轮上字母的排列,就不动声色地改成按字母表顺序排列了。 ——定期改变机器内部设置,也就是转轮的初始设置、转轮的排列顺序和连接板的字母对连接情况。这些设置直接表明了Enigma机器在加密密文时的状态,它就是Enigma的密钥。对于当时的德军来说,这个密钥按规定是要定期更换的,起初是每季度一换,到后来每月一换、每日一换、每8小时一换。 ——使用同一个密钥分别加密多份密文后,可能会导致被截收密文总量超过“临界量”而遭到破译,为此就需要在加密时引入新的变化。按照军方的规定,在拍发任何一份密电之前,报务员首先要按密码本上记录的密钥把机器调整好,然后自己任意选择三个字母,比如ATX。将这个ATX连续输入机器两次,会得到6个密文字母,比如USGJDH;再把它以明文形式抄写在密电的开头,作为报头部分的前6个字母。之后他把转轮组中的3个转轮,依次调整到自己开始选择的A、T、X位置,再开始加密正文。这里的ATX三个字母,主要作用就是指示出目前转轮的位置,被称为“指标组”(indicators)。由于操作员不同,每次加密时选择的指标组也不同,导致相应的Enigma综合设置也各自不同。这样规定以后,即便大家都在同一天使用同一个密钥,但由于指标组总在变化,被截收的“同密钥、同指标组”的密文总量就很难超过临界量而被轻易击破。 现在再让我们来看看接收方的做法吧。首先,报务员要按密码本上记录的密钥,把机器的整体设置调整好;然后将密电报头的6个字母,比如我们刚才提到的USGJDH依次输入Enigma。由于这6个字母只是被密钥加密,因此同样按密钥调整好的接收方机器,也将能够轻松地还原出ATXATX。报务员看了看,ATX重复了两遍而且完全相同,也就确认了发送方报务员确实没有手误。之后,他把自己机器的3个转轮也依次调整到A、T、X位置上,继续输入后面的密文,直到全部脱密。这样一来,每篇电报中只有头6个字母是依据相同的密钥加密而来,而后面正文则是依据五花八门的指标组加密而来——想找规律?先准备吐血吧。 ——转轮组里的转轮虽然还是3个,但是这3个转轮不再是Enigma附带的全部转轮了。原来,德军后来将Enigma的转轮发展为5个,只在用的时候,挑出3个来装入机槽内而已。由于转轮内部的连线规律各自不同,密钥长度也因此再次大大增加——精确地说,转轮的排列方式从以前的6种变成了现在的60种,密钥长度也随之飞跃为从前的10倍。 ——最变态的是海军,他们专用的Enigma完全达到了疯狂的程度:候选轮子从5个增加到7个,后来又增加到8个;每次装入机槽内的转轮个数,开始是3个,后来改进为4个。这还不算,还记得那个镜子——反射板么?海军型Enigma上的反射板经过改造,已经和第4个转轮“黏”在一起,导致了一个令人意外的结果:它居然是能转的……谢尔比乌斯的心血——Enigma,就这样横空出世了! 遗憾的是,谢尔比乌斯本人,并没有见到这么强悍的海军型Enigma。虽然海军作为最识货的大主顾,在Enigma诞生8年之后的1926年,率先以军方的身份采购了他的杰作——但是,还没等到海军一步步地把它升级到那个非理性程度之前,谢尔比乌斯就已经永远地离开了我们大家。 那一天是1929年5月13日,他老人家骑马的时候意外失手撞在墙上,当场牺牲,时年50岁。