你的密码安全吗?
作者: 差评君
如果在你的脑海想一个五位数,那么该如何悄无声息地把这个数传递给我呢?来做个简单的游戏:假设你想的数字是66666或者12345,等等,请将它与“幸运数字”2359相乘,只取结果的后五位数告诉我,我就能知道你所想的数字是什么。准备好了吗?将你得到的后五位数再乘以“终极数字”12039,结果的后五位就是你所想的数字。这个数字游戏看起来像个魔术,当然它还有个更牛的出处——现代密码学,甚至你的银行卡、邮件、聊天软件也和它有着千丝万缕的联系。
天才数学家的密码学构想
克劳德·艾尔伍德·香农在1949年发表的《保密系统的通信理论》一文中,将密码学划分为古典密码和现代密码。因为现代密码学的理论听起来太过疯狂,所以竟被无视了30多年。比如现代密码学中的“柯克霍夫原则”指的是:密码系统应该被所有人知道加密方式是什么;再比如“弗纳姆加密法”:用一次密码换一次。这些理论,乍一听谁受得了。但如果你知道古典密码的那些故事,你就能理解这些理论是多么合理了。
在古典密码的时代,密码学的概念是比较模糊的,尽管密码大量被用在军事领域,但加密方式更像是一种艺术行为。虽然维基百科中,古典密码被“总结为”替换式密码或移项式密码又或者两者混合。但要注意,这里是“总结为”而不是“定义为”,这就说明古典密码仍是一个充满想象力的名词,是一种“你懂,我懂,他不懂”的艺术行为。
比如,先秦兵书《六韬》中提到的阴符传说是由姜太公姜子牙发明的,为了快速传递前方战报,而不被敌方知晓,他发明了一种用不同长度的鱼竿来传递战报的方法,这也是我国史料记载中最早的军事密码。再比如,公元前700年,古希腊军队用一种叫作“密码棒”的木棍进行保密通信。其使用方法是:把长带状羊皮纸缠绕在圆木棍上,然后在上面写字,解下羊皮后上面只有杂乱无章的字符,只有再次以同样的方式缠绕到同样粗细的棍子上,才能看出所写的内容。当然除此之外还有很多好玩的古典密码,比如恺撒密码、栅栏密码,等等。
但古典密码存在一个致命的弱点,那就是太“对称”了。这是什么意思?这里“对称”有两层含义,一是古典密码的加密是可逆的,一旦知道怎么加密,很容易就可以反推出怎么解密。比如随便抓个活口,就能知道密码该如何破解;另一层意思则是,不管你如何对“明文”进行替换,总会形成一种“明文”和“密文”的一一对应关系。这也存在一个很大的弊端,那就是语言的使用是有规律性的,比如英文文本“布朗语料库”对3.5万亿份文稿分析后得出的字母和单词使用频率分析报告,换句话说,不管你怎么替换,经过多少次替换,只要被截获的“密文”一多,“明文”总会被频率分析法推测出来。显然古典密码学家们并没有很好地解决这个问题,间接证明了古典密码是有漏洞的。
细看恩尼格玛密码机
我们理解了加密里的对应关系后,就可以来看看,古典密码的巅峰之作——二战时期的恩尼格玛密码机。这台机器在加密时,只要在机器的键盘上输入想要加密的“明文”,而亮起来文字就是被加密好的“密文”。而且“明文”中相同的字母也会被加密成不同“密文”,而且为了防止某个字母加密一圈后出现没变的情况,恩尼格玛机在按下某个键的时候,通过齿轮的机制从物理上直接被切断了,也就是说,根本不可能出现输入a,输出还是a的情况,这样频率分析法也就失效了。另外即便知道其运作原理也是很难破解的。
最初的恩尼格玛机的内部有三排带有“轮纹”的轮盘,每个轮盘上有26个字母,皆可转动。通过计算(26的三次方)我们可以得出,有1.7万多种方式设置轮盘的初始位置。除此之外,为了保险起见它的外侧还附加了一组交换机制,也就是说,如果连通o和e,当按下o,其实相当于是按下了e。假设我们每次任选6对进行交换,根据概率论这里又产生了1000多亿种可能。而后几代的恩尼格玛机,甚至一度将轮盘数量增加到了8个,要逆向推算的运算量更是指数级上升,在没有计算机的时代,想通过逆向穷举的方式破解几乎是天方夜谭。况且当时的恩尼格玛机每天都会更换一次初始方案。这也就说明,当天如果算不出结果,第二天就要推倒重新计算。这给破解又上了一层难度。
但了解二战历史的人都知道,恩尼格玛机最终还是被破解了,甚至不用等到计算机的诞生。计算机之父英国数学家艾伦·图灵破解了恩尼格玛机。没有计算机的他是如何做到的?原来,德国人不管用恩尼格玛机发什么信息,都得来一句礼仪上的德语“heil hitler”。这种“严谨又白给”的操作很快就让图灵拿到很多明密对应的线索,依靠这些线索他和他的同事戈登·韦尔奇曼发明出一种叫作“炸弹机”的解密机,于是硬生生地逆向破解了恩尼格玛机。所以这又一次说明像古典密码一样,知道怎么加密就能知道怎么解密的对称加密方法,从根本上来说是肯定会被破解的,只不过是时间问题罢了。



现代密码学:公钥与私钥
有没有一种加密方式,信息发出者只知道怎么加密不知道怎么解密,而信息接收者既知道怎么加密又知道怎么解密的方法呢?其实,这就是现代密码学的研究方向之一,也就是如何实现非对称加密。非对称加密方式,在古典密码的基础上,引入了密钥的概念,将密钥分为公钥和私钥,公钥用来加密,私钥用来解密。这样即便是把加密方式公开出去,只要私钥仍然安全,这个加密系统就不会被破解。所以现代密码学家们公开加密方式的做法,其实是不会影响到加密系统安全的。
还记得我们文章开头的那个魔术吗?“幸运数字”2359就是一个公钥,任何人都可以用它来加密。理论上,我只需要保护好用来解密的“终极数字”,也就是私钥12039,这个过程就是一个简单的非对称加密。数学原理也很简单,当公钥与私钥相乘时你会发现结果为28400001,意味着五位以内的数与他们两个接连相乘后,相当于乘了00001。
当然这对于应用级非对称加密而言,显然不够安全,想更进一步,要用到数学上一种特殊函数,叫作活板门单向函数,又叫单向陷门函数。这种函数正向计算非常容易,但想反推回去几乎是一件不可能的事情,不过如果知道某些关键信息,反推也会变得非常容易。如非常著名的RSA算法,银行、邮件、聊天软件几乎所有你能想到的涉及数字的领域都在它的保护之下,算得上国民应用级了,它的加密原理使用的就是单项陷门函数。



举个简单的例子方便大家理解这个函数的意义,比如需要加密的“明文”数字是5,公钥是(7,33)。按照加密时只需要按照公钥的数据求幂再求余就可以得到“密文”。那么计算方式就是数字5求7次方再除以33求余,就可以求得“密文”14。如果想按照怎么加密就怎么解密的思路逆推“明文”,第一步反推就会卡住,因为对33求余得14的数有无限多种可能,这也意味着这样无法确定出“明文”到底是什么,但如果持有私钥(3,33)我们只需要按照私钥的数据对“密文”再次求幂再求余,就可以还原出“明文”5。这就实现了加密与解密过程的分离,也就是非对称加密方式。
既然无法反推,那能不能通过公钥算出私钥呢?理论上,量子计算机倒是行。但由于量子需要错误纠正,你操作的量子计算机至少需要数百万个物理量子比特。而目前最先进的量子计算机也仅有数十到数百量子比特的规模。这也意味着未来几十年内暴力破解类似RSA算法中的单向陷门函数基本没戏。
对现在的我们而言,加密算法已经很强大了,但这并不代表着绝对安全。这些强大的加密算法只能保证你银行卡里的钱不被随意篡改。但如果使用者防范意识不够强,在某些网站输入了自己的密码,又或者用同样的用户名和密码注册了很多不同的软件,这些信息都极有可能被黑客拿来进行暴力破解。
回看密码学的历史,人似乎一直都是严谨密码的最大漏洞。正如美国的密码学学者布鲁斯·施奈尔所言:“安全就像链条,取决于它最薄弱的环节。”虽然密码学很枯燥,但我们仍满怀热情,希望更多人知道并意识到,提高警惕保护好自己,这才是现代密码学的终极意义。
(责编:南名俊岳)