摘自《数学之美》,作者:吴军
2007年,我看了电视剧《暗算》,很喜欢它的构思和里面的表演。其中有一个故事提到了密码学,故事本身不错,但是有点故弄玄虚。不过有一点是对的,就是当今的密码学是以数学为基础的。(没有看过《暗算》的读者可以看一下网上的介绍,因为后面会多次提到这部电视剧。)
密码学的历史大致可以追溯到两千年前,相传古罗马名将恺撒为了防止敌方截获情报,用密码传送情报。恺撒的做法很简单,就是对二十几个罗马字母建立一张对应表,如下表所示。
这样,如果不知道密码本,即使截获一段信息也看不懂,比如收到一个的消息是ABKTBP,那么在敌人看来是毫无意义的字,通过密码本破解出来就是CAESAR一词,即恺撒的名字。这种编码方法史称恺撒大帝,现在市场上还有这一类的玩具卖,见下图。
当然,学过信息论的人都知道,只要多截获一些情报(即使是加密的),统计一下字母的频率,就可以破解出这种密码。柯南·道尔在他的《福尔摩斯探案集》中“跳舞的小人”的故事里已经介绍了这种小技巧(见下图)。近年来在很多谍报题材的电视剧中,编剧还在经常使用这种蹩脚的密码,比如用菜价(一组数字)传递信息,这些数字对应康熙字典的页码和字的次序。对于学过信息论的人来说,破译这种密码根本不需要密码本,只要多收集几次情报就可以破译出来。
从恺撒大帝到20世纪初很长的时间里,密码的设计者们在非常缓慢地改进技术,因为他们的工作基本上靠经验,没有自觉地应用数学原理(当然当时还没有信息论)。人们渐渐意识到一个好的编码方法会使得解密者无法从密码中统计出明码的统计信息。有经验的编码者会把常用的词对应成多个密码,使得破译者很难统计出任何规律。比如,如果将汉语中的“是”一词对应于唯一一个编码0543,那么破译者就会发现0543出现的特别多。但如果将它对应成0543、373、2947等等10个密码,每次随机地选用一个,每个密码出现的次数就不会太多,而且破译者也无从知道这些密码其实对应一个字。这里面已经包含着朴素的概率论的原理。
好的密码必须做到不能根据已知的明文和密文的对应推断出新的密文的内容。从数学的角度上讲,加密的过程可以看作是一个函数的运算F,解密的过程是反函数的运算。明码是自变量,密码是函数值。好的(加密)函数不应该通过几个自变量和函数值就能推出函数。这一点在第二次世界大战前做得很不好。历史上有很多在这方面设计得不周到的密码的例子。
比如在第二次世界大战中,日本军方的密码设计就很成问题。美军破获了日本很多码。在中途岛海战前,美军截获的日军密电经常出现AF这样一个地名,应该是太平洋的某个岛屿,但是美军无从知道是哪个。于是,美军就逐个发布自己控制的岛屿有关的假新闻。当美军发出“中途岛供水系统坏了”这条假新闻后,从截获的日军情报中又看到含有AF的电文(日军情报内容是AF供水出了问题),美军就断定中途岛就是AF。事实证明判断正确,美军在那里成功地伏击了日本联合舰队。
已故的美国情报专家雅德利二战时曾经在重庆帮助中国政府破解日本的密码。他在重庆的两年里做得最成功的一件事,就是破解了日军和重庆间谍的通信密码,并因此破译了几千份日军和间谍之间通信的电文,从而破获了国民党内奸“独臂海盗”为日军提供重庆气象信息的间谍案。雅德利(及一位中国女子徐贞)的工作,大大减轻了日军对重庆轰炸造成的伤害。雅德利回到美国后写了本书《中国黑室》介绍这段经历,但是该书直到1983年才被获准解密并出版。从书中的内容可以了解到,当时日本在密码设计上有严重的缺陷。日军和重庆间谍约定的密码本就是美国著名作家赛珍珠获得1938年诺贝尔文学奖的《大地》一书。
这本书很容易找到,解密时只要接密码电报的人拿着这本书就能解开密码。密码所在的页数就是一个非常简单的公式:发报日期的月数加上天数,再加上10。比如3月11日发报,密码就在3+11+10=24页。这样的密码设计违背了我们前面介绍的“加密函数不应该通过几个自变量和函数值就能推出函数本身”这个原则,这样的密码,破译一篇密文就可能破译以后全部的密文。
该书中还提到日军对保密的技术原理所知甚少。有一次日本的马尼拉使馆向外发报时,发到一半机器卡死,然后居然就照单重发一遍了事,这种同文密电在密码学上是大忌(和我们现在VPN登录用的安全密钥一样,密码机加密时,每次应该自动转一轮,以防同一密钥重复使用,因此即使是同一电文,两次发送的密文也应该是不一样的)。
另外,日本外交部在更换新一代密码机时,有些距离远的国家的使馆因为新机器到位较晚,他们居然还使用老机器发送。这样就出现新老机器混用的情况,同样的内容美国会收到新老两套密文,由于日本旧的密码很多已被破解,这样会导致新的密码一出台就毫无机密可言。总的来讲,日本在第二次世界大战中情报经常被美国人破译,他们的海军名将山本五十六(他爸爸56岁时生的他,所以起名五十六)地因此丧命'。我们常讲落后是要挨打的,其实不会使用数学也是要挨打的。