罗西诺尔家族与伟大密码(二)
2017-04-13花卷
花卷
前情提要
上期我们讲到,在法国朝廷围攻胡格诺派的几次战役中,一个叫安托万·罗西诺尔的年轻人用他的天才帮助朝廷军破译了胡格诺派的一些密信,为战役的胜利立下了不小的功劳,因此被国王路易十三看中,任命他为国王顾问,专门负责破译各种密码。
沉默的孤狼
作为国王的心腹,罗西诺尔的仕途可以说是“一步登天”,让多少人羡慕嫉妒恨呢。但破译密码这种工作天生自带地下党属性,更何况凡是用密码加密过的内容,也都是那些见不得光的事情。而罗西诺尔整天负责破译密码,这些“国家机密”都得从他眼前过,他不想看也得看。
如果一个人知道了太多的机密会怎么样?电视剧里面很多人被干掉的理由都是“你知道的太多了”,看来知道得太多真不是什么好事儿。从史料上来看,罗西诺尔大概算是个聪明人,他懂得玩沉默和低调,据说他从来不跟别人议论自己破译出来的那些机密情报,对外假装自己啥都不知道。你还别说,这一招还真骗过了不少人,据说当时外面的贵族们都猜测,罗西诺尔的那些光辉事迹全是黎塞留首相编出来的,黎塞留把罗西诺尔包装成一个破译高手吓唬人,这样大家就不敢上课没事传小纸条啦,没准罗西诺尔其实没什么真本事,根本不会破译密码。对于这种嚼舌根子的话,罗西诺尔表示笑而不语——呵呵,就算我有本事,也用不着让你们知道。
罗西诺尔就这样躲开了汹涌的政治漩渦,在他的豪宅里一心一意地做他的“开锁匠”。1642年和1643年,首相黎塞留和国王路易十三相继去世,罗西诺尔似乎遇到了一点危机。幸运的是,首相和国王真的十分信任罗西诺尔,他们在临终前交代后事的时候,都提到一定要重用罗西诺尔,因为他是“国家最需要的人才之一”。新国王路易十四(Louis XIV)继位之后,1645年,新任首相儒勒·马扎然(Jules Mazarin)任命罗西诺尔为王室财务总管以及国家顾问,这算是给了他一个正式的国家公务员头衔——不过为啥是财务总管呢?因为当时财务部门也是负责管档案的啦。
密码大改造
罗西诺尔上任之后,除了发挥他专业的破译才能帮助国王破译各种密信之外,还有一项重要的任务,那就是把自家的密码体系搞得更牛一些。想想看,罗西诺尔破译过那么多密码,他肯定对那些密码的弱点了如指掌。罗西诺尔把法国自家用的密码整理了一遍,发现这些跟当初胡格诺派用的那些玩意儿也都差不多啊,破译起来其实也不难啊!好家伙,原来咱们自己用的密码这么弱,还让不让人家有秘密了!别人犯过的错自己可不能再犯了,于是罗西诺尔开始亲自操刀,准备把自己家的密码升级一下。
我们在玛丽女王的故事中已经盘点过,当时欧洲主要使用的密码系统叫做Nomenclator,这个词没有什么统一的中文译法,我们暂且就管它叫“密码表”好了。当时欧洲常见的密码表,其结构大体上由两部分组成,其中之一是一套单表置换密码——简单说,就是定义了一套字母的替换规则,比如A替换成P,B替换成G,替换的对象也不仅限于字母,像玛丽女王的密码表就是将字母替换成特定的符号。单表置换密码有它的天敌,那就是阿拉伯人发明的频率分析法。这是因为从一篇文章的整体来看,每个字母的出现频率都遵循一定的特征,而单表置换的过程并没有改变这一频率特征,有经验的破译者可以通过频率分析,像玩填字游戏一样一个字母一个字母地破译出来。后来,为了进一步提高强度,密码学家又对单表密码做了一些升级,比如加入干扰码(空码)、一个字母对应多个置换码(Homophonic Cipher)等,不过这些手段并不能从根本上抵御频率分析。
密码表的另一个部分是一个字典,对于一些常用的单词,比如说国名、人名、数字、月份等等,给它们分别弄一个特定的编码来代替,比如30代表法国、31代表英国。这样做有什么好处呢?一来,这些单词出现的频率很高,用编码可以缩短密信的长度,负责加密的人也可以省点事,毕竟查个编码比一个字母一个字母拼要快多了;二来,越是重复出现的单词,越容易成为破译者的线索,如果用单表置换密码直接拼写这些单词的话,破译了这些单词也就等于帮助破译了整个密码的其他一些部分,因此用特定编码替代这些常用词也有助于隐藏高频字母组合的特征,让密码更难被破译。
像罗西诺尔这样的大牛,频率分析什么的早就滚瓜烂熟了,所以他肯定知道单表置换密码是不靠谱的,而字典相对来说就更靠谱一些。于是,罗西诺尔提出了一条重要的方针,那就是应该扩大字典的单词量,从而尽量减少用字母置换拼写的机会。如果一篇文章中所有的词都能用编码来替代,那么针对单个字母的频率分析不就完全不管用了吗?不过,现实当然没有那么完美,对于任何一种欧洲语言,要想覆盖常用的语境,需要的单词数量都不会少。比如说,现在美国高中生的英文词汇量大概是1万个左右,作为一个密码字典,几千个单词总要有的吧。单词数量越多,字典就越厚,编写和传播起来也就越来越不方便,而且目标太大也容易被敌人给偷了去,这些都是字典的弊病——但无论如何,在安全性上,字典确实比单表置换要强多了。
另一套索引
话说回来,字典作为密码表的一部分,并不是罗西诺尔发明的,他只是强调字典更安全,所以应该放在主要地位而已。不过,罗西诺尔还发现,常见的密码表中的字典还存在一个弱点,那就是单词的排列顺序。我们身边也有很多字典,随便翻开一本就会发现,里面的单词都是按照字母顺序排列的,这当然是为了用的时候好查。不过密码表中的字典跟一般的字典还有一点不一样,那就是一套字典有两种用法——加密的时候得根据单词查编码,解密的时候得根据编码反查单词。那么怎样才能“一箭双雕”呢?最省事的办法当然是单词按字母排,对应的编码按数字从小到大排,比如说abandon→0001、ability→0002、able→0003……这样一来,无论是正着查还是反着查都很方便,而当时流行的大部分字典也都是这样做的。
问题是,这样的排列有什么弱点呢?聪明如你一定也发现了吧,那就是编码的顺序和单词的顺序是相关的!比如说,如果我知道2040代表fast,2250代表for,当我遇到一个没见过的编码,比如2100,我就可以推测出,这个单词肯定是以字母f开头的,而且位于fast和for之间,再根据上下文的意思,猜出这个词就容易多了——换句话说,破译者可以通过这一线索缩小未知单词的猜测范围,这还不算弱点吗?
那么,这个弱点有没有办法解决呢?嗯,当然有。不知道大家还记不记得《新华字典》是怎么查的,一般的汉语字典都是按照拼音顺序排列的,但同时还会提供另一套索引,可以根据部首和笔画来查字。同样地,如果要打破密码字典中单词顺序和编码顺序的相关性,就必须把编码改成随机排列,但这样一来通过编码反查单词就会很困难。为了解决这个问题,只要再提供另一套按照编码查单词的索引不就行了吗?
这个主意靠谱,事实上,罗西诺尔也是这么想的。不过密码字典跟我们用的《新华字典》不一样,它本身只有一个索引,没有什么释义、例句之类的东西,所以增加一套索引就相当于重写了一套字典,换句话说,字典就变成了原来的两倍厚。不过仔细想想看,这些弊病也只不过是“不方便”而已,毕竟打破了单词顺序和编码顺序的相关性之后,字典的安全性提升了不止一个台阶,牺牲一点方便也是值得的。
不过,随着字典里的单词量越来越多,编写两套索引也变得越来越累人,再加上一套字典不可能用一辈子,也不可能所有人都用同一套字典,于是编写字典的工作量就成倍成倍地增长起来。据说到了17世纪末,密码字典的单词量已经高达2 000到3 000个,这可真不是个小数目。对于这么庞大的字典,编写两套索引不太现实,于是又出现了一种“缩水版”的解决方案——既然不能把顺序完全打乱,那我可以把单词分成若干个“编码组”,在每个组的内部,单词和编码都是按顺序排列的,但组和组之间的顺序是打乱的。举个例子,A开头的单词从800号开始排,B开头的单词从300号开始排,但A或B开头的单词本身则是按顺序排列和编码的。这种“缩水版”方案的安全性实际上低了不少,因此这算是向实用性的一种妥协吧,毕竟在还没有计算机的年代,这种妥协也还是可以理解的。
罗西诺尔发明的这种“两部式”密码表逐步在法国普及开来,不过不知道是不是法国的保密工作做得实在太差,让欧洲其他国家也都偷师了去,于是“扩充字典的单词量”,以及“两部式设计”逐渐传遍了整个欧洲,在长达差不多200年的时间里都成了欧洲密码系统的主流方式。不仅如此,其他国家听说法国居然是找一个破译密码的人来改进自己的密码表,也觉着这主意实在是新鲜。因为那时候人们大多觉得加密者和破译者是一对水火不容的冤家,所以破译者都是当“雇傭兵”来使的,有需要的时候花钱找来干一票而已——殊不知加密和破译的技术本身就是一脉相承的,破译高手自然有能力来设计出更安全的密码。所谓知己知彼,百战不殆,就像现在我们会请电脑黑客来改善网络安全,其实也是一样的道理。
(说了半天,还是没说伟大密码是啥!好吧,我错了,下期一定说……)