第17章 谈谈密码学的数学原理

以下内容学习、摘录自《数学之美》


密码学的历史大致可以追溯到两千年前,相传古罗马名将恺撒( Julius Caesar)为了防止敌方截获情报,用密码传送情报。恺撒的做法很简单,就是对二十几个罗马字母建立一张对应表,如下所示:

明码:A B C D ...
密码:B E A F ...

这样,如果不知道密码本,即使截获一段信息也看不懂,比如收到一个消息是 ABKTBP,在敌人看来是毫无意义的字,通过密码本破解出来就是 CAESAR一词,即恺撒的名字。

当然,学过信息论的人都知道,只要多截获一些情报(即使是加密的),统计一下字母的频率,就可以破解出这种密码。柯南·道尔( Sir ArthurIgnatius Conan Doyle)在他的《福尔摩斯探案集》中“跳舞的小人”案中介绍过这种小技巧。人们渐渐意识到,对于一种好的编码方法,破译者应该无法从密码中统计出明码的规律。

从恺撒大帝时代到20世纪初这段很长的时间里,密码的设计者们基本上依靠经验在非常缓慢地改进加密技术,而没有自觉的应用数学原理。稍有经验的编码者会把常用的词对应成多个密码,使得破译者很难统计出任何规律。比如,如果将汉语中的“是”一词对应于唯一一个编码0543,那么破译者就会发现0543出现的特别多。但如果将它对应成0543、0373、2947等10个密码,每次随机选用一个,每个密码出现的次数就不会太多,而且破译者也无从知道这些密码其实对应一个字。这里面已经包含着朴素的概率论的原理。

好的密码必须做到根据已知的明文和密文的对应推断不出新的密文内容。从数学的角度上讲,加密的过程可以看作是一个函数的运算F,解密的过程是反函数的运算。明码是自变量,密码是函数值。好的(加密)函数不应该通过几个自变量和函数值就能推出函数。这一点在第二次世界大战前做得很不好。历史上有很多在这方面设计得不周到的密码的例子。比如在第二次世界大战中,日本军方的密码设计就很成问题。美军破获了日本很多密码。在中途岛海战前,美军截获的日军密电经常出现AF这样一个地名,应该是太平洋的某个岛屿,但是美军无从知道是哪个。于是,美军就逐个发布与自己控制的岛屿有关的假新闻。当发出“中途岛供水系统坏了”这条假新闻后,美军从截获的日军情报中又看到含有AF的电文(日军情报内容是AF供水出了问题),于是断定中途岛就是AF。事实证明判断正确,美军在那里成功地伏击了日本联合舰队。

在第二次世界大战中,很多顶尖的科学家包括提出信息论的香农都在为美军情报部门工作,而信息论实际上就是情报学的直接产物。香农提出的信息论为密码学的发展带来了新气象。根据信息论,密码的最高境界是敌方在截获密码后,对我方的所知没有任何增加,用信息论的专业术语讲,就是信息量没有增加。一般来讲,当密码之间分布均匀并且统计独立时,提供的信息最少。均匀分布使得敌方无从统计,而统计独立可保证敌人即使知道了加密算法,并且看到一段密码和明码后,也无法破译另一段密码

虽然公开密钥下面有许多不同的具体加密方法,比如早期的RSA算法(1977年,由三个发明者李维斯特 Rivest、沙米尔 Shamir和阿德尔曼 Adleman名字的首字母命名)、 Rabin算法(1979年,以发明者 Rabin的名字命名)和后来的 El Gamal算法(1984年,以发明者 El Gamal的名字命名、椭圆曲线算法( Elliptic curve,1985年由尼尔·库伯利兹 Neal Koblitz和维克托·米勒 Victor Miller提出),它们的基本原理非常一致,且并不复杂。这些算法都有如下共同点:
1.它们都有两个完全不同的样式,一个用于加密,一个用于解密。
2.这两个看上去无关的钥匙,在数学上是关联的。

我们不妨用相对简单的RSA算法来说明公开密钥的原理:
1.找两个很大的素数(质数)P和Q,越大越好,比如100位长的然后计算它们的乘积
    N=P×Q
    M=(P-1)×(Q-1)
2.找一个和M互素的整数E,也就是说M和E除了1以外没有公约数
3.找一个整数D,使得E×D除以M余1,即E× D mod M=1。

现在,一个先进的且最常用的密码系统就设计好了,其中E是公钥,谁都可以用来加密,公开密钥一词就来源于此,D是私钥用于解密,一定要自己保存好。联系公钥和密钥的乘积N是公开的,即使敌人知道了也没关系。

现在,用下面的公式对X加密,得到密码Y
X^E mod N=Y

好了,现在没有密钥D,神仙也无法从Y中恢复X。如果知道D,根据费尔马小定理,则只要按下面的公式就可以轻而易举地从Y中得到X:
Y^D mod N=X

费尔马小定理有两种等价的描述
描述一:P是一个质数,对于任何整数N,如果N、P互素,那么N^(P-1) ≡ 1(mod P)
描述二:P是一个质数,对于任何整数N ≡ N(mod P)

公开密钥的好处有
1.简单,就是一些乘除而已。
2.可靠。公开密钥方法保证产生的密文是统计独立而分布均匀的。也就是说,不论给出多少份明文和对应的密文,也无法根据已知的明文和密文的对应来破译下一份密文。更重要的是N、E可以公开给任何人加密用,但是只有掌握密钥D的人才可以解密,即使加密者自己也是无法解密的。这样,即使加密者被抓住叛变了,整套密码系统仍然是安全的。(而恺撒大帝的加密方法,只要有一个知道密码本的人泄密,整个密码系统就公开了。
3.灵活,可以产生很多的公开密钥E和私钥D的组合给不同的加密者。

最后让我们看看破解这种密码的难度。首先要声明,世界上没有永远破不了的密码,关键是它能有多长时间的有效期。要破解公开密钥的加密方式,至今的研究结果表明最彻底的办法还是对大数N进行因数分解,即通过N反过来找到P和Q,这样密码就被破解了。而找P和Q目前只有一个笨办法,就是用计算机把所有可能的数字试一遍。这实际上是在拼计算机的速度,这也就是为什么P和Q都需要非常大。一种加密方法只要保证50年内计算机破解不了也就可以满意了。

不管怎么样,我们今天用的所谓最可靠的加密方法,背后的数学原理其实就这么简单,一点也不神秘。无论是RSA算法、 Rabin算法还是后来的 El Gamal算法,无非是找几个大素数做一些乘除和乘方运算。但就是靠这么简单的数学原理,保证了二战后的密码几乎无法被破解。冷战时期美苏双方都投入了前所未有的精力去获得对方的情报,但是没有发生过因密码被破解而泄密的重大事件。

点击这里可以查看《数学之美》的其它学习笔记。

你可能感兴趣的:(第17章 谈谈密码学的数学原理)