花卷
上期我们讲到,文艺复兴时期,意大利一位著名的不务正业的建筑师阿尔伯蒂,居然在15世纪就设计出了一种划时代的“密码盘”,就连之后两百年出现的密码学家跟他相比都显得黯然失色了。上期我们还演示了如何用阿尔伯蒂的密码盘来进行加密和解密,那么接下来的问题就是,这种密码盘到底先进在哪里,又有什么弱点呢?
密钥轮换的秘密
阿尔伯蒂的密码盘到底先进在哪里呢?让我们先回忆一下之前加密过的内容。之前我们把“TI AMO, TU MI AMI”这句话加密成了“Bivg&yCqiztezt”,而要把这段密文进行解密,需要具备两个条件:一个是和加密者一模一样的密码盘,二是加密者设定的基准字母(在这个例子中是k)。为了让大家看得更清楚一些,我们把原文和明文做成一张对应表:
1. 原文: T I A M O T U M I A M I
2. 密文: B i v g & y C q i z t e z t
这里要提醒一下,密文中的两个大写字母(B和C)代表密码盘的位置设定,所以它们不对应原文中的任何字母。我们之前讲过,传统的单表密码最大的弱点就是原文的字母和密文的字母之间存在“一对一”或者“一对多”的确定的对应关系,利用这种关系,破译者就可以使出频率分析大法,抽丝剥茧般地干掉你的密码。那么,这种确定的对应关系,在阿尔伯蒂的密码中是不是真的被消除了呢?别着急,我们一步一步地来分析。
首先,原文中一些重复出现的字母,比如T和A各出现了2次,I和M各出现了3次。拿T为例,我们可以看出,兩个T都分别被加密成了不同的字母(i和q),其他几个字母的情况也差不多,这说明阿尔伯蒂的密码至少摆脱了“一 一对应”的关系。
这里你可能要问了,单表密码通过“一字多码”的方法,也能做到这一点啊?这话在理,但我们前面也讲过,一字多码只能实现“一对多”的对应关系,也就是说,一个原文字母能对应多个不同的密文字母,但一个密文字母还是只能对应一个确定的原文字母。我们来看看阿尔伯蒂的密码,密文中也有一些重复出现的字母,比如i就出现了2次,但是你看出来了没,这两个i对应的原文字母却是不同的(T和U),这才是阿尔伯蒂密码盘的精髓(画重点!)。
如果破译者不知道密码盘的结构和用法,仅凭频率分析的话是肯定要抓瞎的,因为一旦打破了确定的对应关系,就意味着所有字母的频率都被混合在了一起,搅成了一锅粥,很难各归各位,整体上也就无法体现固有的频率分布规律了。阿尔伯蒂的密码盘之所以能够实现这一点,靠的其实就是“密钥轮换”。换句话说,每次遇到大写字母时,都要改变密码盘中内圈和外圈的位置关系,也就意味着每次遇到大写字母都会“换”一张新的密码表——这也正是“多表置换密码”(Polyalphabetic substitution cipher)这个名字的由来。
密码盘的弱点
由以上看来,阿尔伯蒂的密码盘确实是该得个科技进步一等奖,不过,这玩意儿真的完全干翻了频率分析吗?真的就无懈可击了吗?答案就算我不说你也知道,肯定没那么好的事儿,下面我们来找找这个密码盘的弱点吧。其实,这个密码盘的最大弱点就是密码盘本身。还记得我们之前说的吗——这种密码要确保安全,有一个很重要的前提,即“破译者不知道密码盘的结构和用法”。换句话说,如果我知道了这个密码盘是如何轮换密钥的,那破译它也就不难了吧?
现在我们假设破译者手里也有一个密码盘,这个密码盘有可能是和加密者手上的一模一样,也有可能不是一模一样。如果是一模一样的,那事情就简单了,因为只要知道了加密者用的基准字母,那破译者和解密者不就拥有完全一样的信息了嘛。现在的问题是,怎么才能知道基准字母呢?这也不难,因为内圈和外圈的位置组合只有24种可能性,一个一个试呗!
当然,上面这种情况好像有点太理想化了,你可以投诉破译者“作弊”。那么假设破译者手上的密码盘和加密者手上的不一样,也就是内外圈字母的排列顺序都不一样,但是破译者知道密码盘是怎么用的,这样的条件下,破译者要怎么玩呢?如果破译者知道密码盘的用法,那么他肯定知道大写字母代表密钥轮换,而在同一个轮换周期之中,这个密码盘也就相当于一个简单的单表密码。拿我们那个例子来说,C后面的密文都属于同一个轮换周期,里面的原文字母和密文字母也就都是简单的一对一关系,你看这段原文里面有两个字母I,加密之后的密文也就变成了两个一样的字母t。而且,如果两段密文前面的大写字母相同,也就意味着它们所用的置换表(内外圈位置关系)也相同,如果把整篇密文按照所用的置换表做个分组,那么对于其中的每一组我们都可以用频率分析来搞定,因为它们都只是简单的、一对一的单表置换而已,随便找一个略懂频率分析的菜鸟都能秒杀之。
多表密码的进化
其实,阿尔伯蒂在他的专著里描述了两种密码盘的用法,我们之前演示的只是其中一种。这种用法有个明显的弱点,那就是把密钥轮换摆在了明处,因为代表密钥轮换的是大写字母,破译者一眼就能看出来它们跟别的字母不一样,这不是此地无银三百两嘛。阿尔伯蒂描述的另一种用法似乎解决了这个问题,在这种用法当中,轮换密钥的标记也是用密文字母(小写字母)来表示——还记得密码盘的外圈上有4个数字对吧?如果解密者发现某个密文字母解密之后是1~4其中的某个数字,那么就代表在对接下来的密文进行解密之前,需要先按照数字来进行密钥轮换。
第二种用法看起来比第一种要靠谱一点吗?其实也未必,在第一种用法中,我们总共可以搭配出24种不同的置换表,但在第二种用法中,置换表的种类被迫缩减到了4种,这样一来,对频率分布的掩盖效果就差了很多。更何况,那几个数字本来的设计是为了搭配密码字典来用的,如果把它们征用了做密钥轮换,那也就相当于把字典这个用法给腰斩了。
讲到这里大家应该已经看出来了,阿尔伯蒂是个密码学天才,这一点没毛病,他设计的密码盘可以算是多表置换密码的老祖宗,对后世的密码影响也是相当大。然而,密码盘的弱点也同样非常明显,它的弱点可以概括成下面这两方面。
第一个弱点是它的密钥轮换频率太低。想想看,在什么时候进行密钥轮换是加密者人工选择的,实际使用中往往是一句话一换,甚至是几句话一换。尽管从整体上来看,频率分布确实被打乱了,但其实每一个轮换周期中连续的文字都是用同一张置换表来加密的,这就很容易被那些眼尖的破译者抓住小辫子。
第二个弱点是它的安全性极大地依赖于密码盘的结构不被破译者知道。我们之前分析过了,一旦破译者知道了密码盘的结构和用法,那么这种密码的安全性就会大大降低,甚至可以说,安全性完全不如设计得稍微像样一点的单表置换密码。这种弱点,现代密码学里还给它专门起了一个名字,叫做“隐匿式安全”(Security through obscurity),意思就是说通过隐匿密码方案上的一些细节(比如这个密码盘的结构)来确保安全性。
毋庸置疑,这必须是个反面教材,隐匿式安全那是彻头彻尾的自欺欺人、掩耳盗铃—— 一个密码方案,就不应该有什么藏着掖着的,哪怕我把所有的技术细节都公开给你看,你照样破解不了我的密码,这才是货真价实的安全呐!上面这句话,其实是密码学中一条非常重要的原则,它还有个名字叫做“柯克霍夫原则”(Kerckhoffss principle),而且伟大的信息学宗师克劳德·香农(Claude Shannon)也曾经说过一句名言:“敌人了解系统”,意思就是说,在设计一个系统时应当假设敌人有能力完全了解该系统的全部细节。实际上,我们现在用的最主流的那些密码算法,比如AES、RSA之类的,都遵循柯克霍夫原则。也就是说,它们的所有细节,无论是设计原理还是源代码,全都是公开的,你想看就能看(只要你能看得懂),但这丝毫不会影响它们的安全性——只要你不知道密钥,要破解这些密码依然是极其困难的。
上面这两个弱点,不务正业的阿尔伯蒂到最后也都没能解决,估计是忙着盖楼没空管这摊子事儿吧。那么后人有没有解决这两个问题,设计出更先进的多表置换密码呢?答案当然是肯定的,只不过事情得一步一步来,问题也得一个一个解决。
1508年,有一位名叫约翰尼斯·特里特米乌斯(Johannes Trithemius)的德国人写了一部叫Polygraphia的著作,这个词现在的意思已经变了,那个时候的意思类似于“多重密码”(poly-代表“多”,-graphia代表“记录”)。这个特里特米乌斯挺有意思的,他是个修道士,经常写一些神秘兮兮的书,比如讲占星术啦、通灵啦什么的。除此之外,他还负责编纂过一部编年史,但是这货的业务水平实在不咋地,写个历史书居然也能开脑洞,各种胡编乱造夹带私货,都快把历史写成小说了。
除了上面说的这本Polygraphia,他在更早的1499年还写过另外一本更奇葩的书叫做Stegnographia。如果你看过本专栏之前的连载,肯定对这个词有点印象,它就是我们讲希波战争的时候提到的“隐写术”(Stegnography)嘛——没错,而且更重要的是,这个词还就是特里特米乌斯在这本书里“首创”的。为啥说这本书奇葩呢?因为这本书的内容看起来都是讲魔法和通灵的,但其实里面另有玄机,在他去世100年之后,这本书才正式印刷出版,其中给出了一部分解密用的“密钥”,用这些密钥解密之后,人们才恍然大悟——原来这本书是讲隐写术和密码术的!
那么,这本Polygraphia又是讲啥的呢?特里特米乌斯在这本书里面介绍了一种新的多表置换密码,还给它起了个名字叫“方表”(Tabula recta)。方表方表,顾名思义,就是一张方形的表呗,这有什么稀奇的呢?其实,特里特米乌斯的方表在多表密碼的发展史上具有非常重要的意义,因为它是最著名的一种多表密码——“维热纳尔方表”的原型,而围绕维热纳尔方表,还曾上演过一场精彩的攻防战。
(特里特米乌斯的方表到底是什么样的呢?它解决了阿尔伯蒂密码盘的哪些问题呢?关于维热纳尔方表的攻防战又是怎么一回事?我们下期继续讲。)