现在!在你的脑子里想一个五位数,那么如何悄无声息的把它传递给我呢?
来看一个好法子,假设你想的数字是 66666 或者 12345 等等。
请将它与我的幸运数字 2359 相乘,只取结果的后五位打在公屏,我就能知道你所想的数字是什么。
准备好了么?
接下来就是 debug 的时刻,将你取到的五位数再乘 12039,结果的后五位就是你所想的数字。
看起来像个魔术对吧?其实除了魔术,它还有个更牛的出处 —— 现代密码学,甚至你的银行卡、邮件、聊天软件也和它有着千丝万缕的联系。
所以它和现代密码学有什么关系,它的原理又是什么?为什么要设计成这样呢?
我们来扒一扒不一样的密码学!
天才数学家的现代化密码学构想
聊到密码学,就不得不提起那个男人!克劳德 · 艾尔伍德 · 香农。
他在 1949 年发表的《 保密系统的通信理论 》一书,用数学的方式将密码学划分为古典密码和现代密码。
但因为现代密码学的理论听起来太二了,诞生后竟被晾了三十多年。
比如现代密码学中的柯克霍夫原则讲( Kerckhoffs ):密码系统应该被所有人都知道加密方式是什么。
这一听,不是神经病言论吗?加密方式都让人知道了,还研究个毛啊?
再比如 Vernam 提出的符合香农完善保密的一次一密理论,听起来更神经了,用一次密码换一次谁受得了。
但如果看完古典密码踩过的坑,你就知道这些言论有多合理了!
古典密码
在古典密码的时代,密码学的概念是比较模糊的,尽管大量被用在军事领域,但加密方式更像是一种艺术行为。
反正就一个理念:瞎换乱转,你猜去吧。
这可不是我在开玩笑,期刊论文里就是这么写的。
虽然维基百科中,古典密码被总结为替换式密码或移项式密码又或者两者混合。但要注意,这里是总结为而不是定义为,这就说明古典密码仍是一个充满想象力的名词。
比如对外国人而言,其实中文本身就是个古典密码。
举个例子,what is your name 这句话,我们逐一替换成汉语,再移项就变成了:你的名字是什么。
这不是完美符合古典密码替换移向的要求嘛。
当然这种推理也确实很脑洞大开,但毕竟古典密码本就是在用脑洞创造一种,你懂我懂他不懂的新语言。
比如先秦兵书《 六韬 》中提到的阴符,这是由钓鱼佬姜太公姜子牙发明的,为了快速传递前方战报,而不被敌方知晓,他发明了一种用不同长度的鱼竿来传递战报的方法,这也是我国史料记载中最早的军事密码。
再比如公元前 700 年,古希腊军队用一种叫作 Scytale 的圆木棍来进行保密通信。
其使用方法是:把长带状羊皮纸缠绕在圆木棍上,然后在上面写字;解下羊皮后上面只有杂乱无章的字符,只有再次以同样的方式缠绕到同样粗细的棍子上,才能看出所写的内容。
柯南中的密码棒灵感就来源于此。
当然除此之外还有很多好玩的古典密码,比如凯撒密码,栅栏密码等等。
这里留给万能小伙伴补充,但古典密码存在一个致命的弱点,那就是太对称了。
这是什么意思呢?这个对称有两层含义,一是古典密码的加密是可逆的,一旦知道怎么加密,很容易就可以反推出怎么解密。
所以古人他只是古他不傻啊,随便抓个活口不就知道这密码怎么玩的了吗?
另一个对称的意思则是,不管你如何对明文进行替换,总会形成一种明文和密文的 一一 对应关系,但这也存在一个很大的弊端,那就是语言的使用是有规律性的。
比如这张图表,这是一份来自皮特网对 3.5 万亿份文稿分析后得出的字母和单词使用频率分析报告,也就说明不管你怎么替换,经过多少层替换,只要被截获的密文一多,总会被频率分析法拿捏。
当然虽然问题找出来了,但显然古典密码学家们并没有很好的解决这个问题,甚至间接证明了古典密码是真不行,比如二战时期,古典密码的巅峰之作 -- 恩格码机 ( Enigma )。
在加密时,只要在机器的键盘上输入想要加密的明文( dianzan ),亮起来的就是被加密好的密文。
而且明文中相同的字母也会被加密成了不同密文,这就很好的防止了频率分析法。
另外即便知道其运作原理也是很难破解的。
这是怎么做到的呢?
我们来到恩格玛机的内部,转子装置,在这个装置的右端输入轮上,有 26 个触点,分别链接键盘上的 26 个字母。
装置的中部由同样带有 26 个触点的多个转轮组成,但与输入轮有些区别,在转轮的内部额外多了一些杂乱的交换机制,意味着输入板的字母每经过一个转轮时被替换 1 次。
而在装置的末端有一个叫做反射板的装置,它仍有 26 个触点,这里的触点两两组合组成同游泳比赛一样的折返点。
字母会在这里被再次交换后,仍要重返转轮,再次进行替换,最终才能回到起点。
这样就完成了一次加密流程,可以看出这是多次替换的叠加,但其实恩格玛机还有点睛之笔,在每次按下键盘时,一个特殊的杠杆装置会带动转轮转动一次,并且转轮上有一个特殊的轮纹,当前一个转轮转动一周后,后一个转轮也会转动一次。
这就使得按下每个字母时用到的加密线路都是不一样的,样频率分析法也就失效了。
另外这样的设计,即便是知道其运作原理,逆向破解也是非常困难的。
以最初的恩尼格玛机为例,它的内部有三排刚刚提到的轮纹轮盘,每个轮盘上有 26 个字母,皆可转动,这样来看我们就有一万七千五百多种方式设置轮盘的初始位置。
除此之外,为了保险起见它的外侧还附加了一组交换机制,也就是说如果连通 o 和 e,当按下 o,其实相当于是按下了 e。
假设我们每次任选 6 对进行交换,根据概率论的算法,我们又产生了一千多亿种可能,仅是这些初始位置的方案已经有 1700 万亿种可能了。
后代的恩尼格玛机,甚至一度将轮盘数增加到了 8 个,要逆向推算的运算量更是指数级上升,在没计算机的时代,想通过逆向穷举的方式破解几乎是天方夜谭。
况且当时的恩尼格玛机每天都会更换一次初始方案。
这也就说明,当天如果算不出,第二天就要重新计算。这给暴力破解又上了一层难度。
但了解二战的小伙伴都知道,恩格玛机最终还是被破解了,甚至没等到计算机诞生。
1940 年,计算机之父,英国数学家阿兰·图灵,就破解了恩尼格玛机。
但刚刚不是说没计算机不可能破解嘛?这说法确实没错,但遭不住德国人太轴又太飘啊,不管发啥,都得来一句 heil hitle。
哎,不仅如此,德国人还很喜欢汇报,时不时就要给长官发一句:报告长官,啥事没有!再附一句 heil hitle。
按照礼节那长官也得回一句( Heilhitle )表示啊收到了 ~
照理来说,这屁大点事直接发就好了,不行,至少在德国人那里不行,要保守元首所有的秘密,包括这份愚忠!必须恩格玛一下!
这严谨又白给的操作很快就让图灵拿到很多明密对应的线索,依靠这些线索他和他的同事戈登 · 韦尔奇曼发明出一种叫做 “ 炸弹机 ” 的解密机,真的硬生生逆向破解了恩格玛机。
所以这又一次说明像古典密码这样,知道怎么加密就能知道怎么解密的对称加密方法,从根本上来说是肯定会被破解的,只不过是时间问题罢了。
现代密码学
那有没有一种加密方式,信息发出者只知道怎么加密不知道怎么解密,而信息接受者既知道怎么加密又知道怎么解密的方法呢?
其实这就是现代密码学的研究方向之一,也就是如何实现非对称加密。
这种加密方式,在古典密码的基础上,引入了密钥的概念,将密钥分为公钥和私钥,公钥用来加密,私钥用来解密。
这样即便是把加密方式公开出去,只要私钥仍然安全,这个加密系统就不会被破解。
所以现代密码学家们公开加密方式的做法,其实是不会影响到加密系统的安全的。
还记得我们开头的那个魔术游戏么?2359 就是一个公钥,任何人都可以用它来加密。理论上我只要保护好用来解密的私钥 12039,这就是一个非对称加密。
原理也很简单,当公钥与私钥相乘时你会发现结果为 28400001,意味着五位以内的数与他们两个接连相乘后,相当于乘了 00001。
但这对于应用级非对称加密而言,显然不够安全,想更进一步,要用到数学上一种特殊函数,叫做活板门单向函数,又叫单向陷门函数。
这种函数正向计算非常容易,但想反推回去几乎是一件不可能的事情,不过如果知道某些关键信息,反推也会变得非常容易。
比如非常著名的 RSA 算法,银行,邮件,聊天软件几乎所有你能想到的涉及数字的领域都在它的保护之下,算的上妥妥的应用级了,它的加密原理使用的就是单项陷门函数。
加密时只需要按照公钥的数据求幂再求余,就可以得到密文。
举个简单的例子,比如需要加密的数字是 5,公钥是( 7, 33 ),只需要按照公钥的数据将明文 5 求 7 次方再对 33 求余,可以求得密文 14。
如果想按照怎么加密就怎么解密的思路逆推明文,第一步反推就会卡住,因为对 33 求余得 14 的数有无限多种可能,这也意味着这样无法确定出明文到底是什么。
但如果持有私钥( 3 , 33 )我们只需要按照私钥的数据对密文再次求幂求余,就可以还原出明文 5。这就实现了加密与解密过程的分离。
那既然无法反推,那能不能通过公钥算出私钥呢?
来看看私钥和公钥的制作过程:首先我们选取两个质数,质数的乘积记为 N ,通过欧拉函数φ( n ) = ( p-1 ) * ( q-1 ),计算出函数φ,之后我们选取一个整数 E , E 既要满足 1<e< φ( n ),又要和φ( n )互质,这个 E 就是公钥,私钥则通过计算 E 的模φ ( n ) 乘法逆元求得。
当我们在只知道公钥的情况下,想推算出私钥,必然需要得到最开始的两个质数。
因为这里为了方便大家理解所取质数比较小,而通常情况下,这个质数是非常大的,即便是我们在公钥里可以知道两个质数的乘积,但想通过因式分解逆推出两个质数,按照现有的计算水平至少要算到这篇文章阅读量破千万。
不过理论上量子计算机倒是行,额。。
除非你能在量子计算机上凑齐 4096 个逻辑量子比特来有效运行 Shor 算法,但由于量子需要错误纠正,你操作的量子计算机至少需要数百万个物理量子比特。
额,目前最先进的也仅有数十到数百量子比特的规模。
这也意味着未来几十年内暴力破解类似 RSA 算法中的单向陷门函数基本没戏。
所以,对现在的我们而言,加密算法已经很强大了,但这万万不代表着绝对的安全。
最后
因为这些强大的加密算法只能保证你银行卡里的钱不被随意篡改。
但如果使用者防范意识不够强,在某些网站输入了自己的密码,又或者用同样的用户名和密码注册了很多不同的 app,这些都极有可能被黑客拿来暴力破解。
回看密码学的每个时代,似乎人一直都是严谨密码的最大漏洞。
正如美国的密码学学者布鲁斯 · 施奈尔所言:“ 安全就像链条,它取决于最薄弱的环节。”
在信息安全的世界里,技术可以构建起高墙,而在人类的世界里,富有情感成了安全里最大的漏洞。