現(xiàn)在!在你的腦子里想一個(gè)五位數(shù),那么如何悄無(wú)聲息的把它傳遞給我呢?
來(lái)看一個(gè)好法子,假設(shè)你想的數(shù)字是 66666 或者 12345 等等。
請(qǐng)將它與我的幸運(yùn)數(shù)字 2359 相乘,只取結(jié)果的后五位打在公屏,我就能知道你所想的數(shù)字是什么。
準(zhǔn)備好了么?
接下來(lái)就是 debug 的時(shí)刻,將你取到的五位數(shù)再乘 12039,結(jié)果的后五位就是你所想的數(shù)字。
看起來(lái)像個(gè)魔術(shù)對(duì)吧?其實(shí)除了魔術(shù),它還有個(gè)更牛的出處 —— 現(xiàn)代密碼學(xué),甚至你的銀行卡、郵件、聊天軟件也和它有著千絲萬(wàn)縷的聯(lián)系。
所以它和現(xiàn)代密碼學(xué)有什么關(guān)系,它的原理又是什么?為什么要設(shè)計(jì)成這樣呢?
我們來(lái)扒一扒不一樣的密碼學(xué)!
天才數(shù)學(xué)家的現(xiàn)代化密碼學(xué)構(gòu)想
聊到密碼學(xué),就不得不提起那個(gè)男人!克勞德 · 艾爾伍德 · 香農(nóng)。
他在 1949 年發(fā)表的《 保密系統(tǒng)的通信理論 》一書,用數(shù)學(xué)的方式將密碼學(xué)劃分為古典密碼和現(xiàn)代密碼。
但因?yàn)楝F(xiàn)代密碼學(xué)的理論聽(tīng)起來(lái)太二了,誕生后竟被晾了三十多年。
比如現(xiàn)代密碼學(xué)中的柯克霍夫原則講( Kerckhoffs ):密碼系統(tǒng)應(yīng)該被所有人都知道加密方式是什么。
這一聽(tīng),不是神經(jīng)病言論嗎?加密方式都讓人知道了,還研究個(gè)毛???
再比如 Vernam 提出的符合香農(nóng)完善保密的一次一密理論,聽(tīng)起來(lái)更神經(jīng)了,用一次密碼換一次誰(shuí)受得了。
但如果看完古典密碼踩過(guò)的坑,你就知道這些言論有多合理了!
古典密碼
在古典密碼的時(shí)代,密碼學(xué)的概念是比較模糊的,盡管大量被用在軍事領(lǐng)域,但加密方式更像是一種藝術(shù)行為。
反正就一個(gè)理念:瞎換亂轉(zhuǎn),你猜去吧。
這可不是我在開(kāi)玩笑,期刊論文里就是這么寫的。
雖然維基百科中,古典密碼被總結(jié)為替換式密碼或移項(xiàng)式密碼又或者兩者混合。但要注意,這里是總結(jié)為而不是定義為,這就說(shuō)明古典密碼仍是一個(gè)充滿想象力的名詞。
比如對(duì)外國(guó)人而言,其實(shí)中文本身就是個(gè)古典密碼。
舉個(gè)例子,what is your name 這句話,我們逐一替換成漢語(yǔ),再移項(xiàng)就變成了:你的名字是什么。
這不是完美符合古典密碼替換移向的要求嘛。
當(dāng)然這種推理也確實(shí)很腦洞大開(kāi),但畢竟古典密碼本就是在用腦洞創(chuàng)造一種,你懂我懂他不懂的新語(yǔ)言。
比如先秦兵書《 六韜 》中提到的陰符,這是由釣魚佬姜太公姜子牙發(fā)明的,為了快速傳遞前方戰(zhàn)報(bào),而不被敵方知曉,他發(fā)明了一種用不同長(zhǎng)度的魚竿來(lái)傳遞戰(zhàn)報(bào)的方法,這也是我國(guó)史料記載中早的軍事密碼。
再比如公元前 700 年,古希臘軍隊(duì)用一種叫作 Scytale 的圓木棍來(lái)進(jìn)行保密通信。
其使用方法是:把長(zhǎng)帶狀羊皮紙纏繞在圓木棍上,然后在上面寫字;解下羊皮后上面只有雜亂無(wú)章的字符,只有再次以同樣的方式纏繞到同樣粗細(xì)的棍子上,才能看出所寫的內(nèi)容。
柯南中的密碼棒靈感就來(lái)源于此。
當(dāng)然除此之外還有很多好玩的古典密碼,比如凱撒密碼,柵欄密碼等等。
這里留給萬(wàn)能小伙伴補(bǔ)充,但古典密碼存在一個(gè)致命的弱點(diǎn),那就是太對(duì)稱了。
這是什么意思呢?這個(gè)對(duì)稱有兩層含義,一是古典密碼的加密是可逆的,一旦知道怎么加密,很容易就可以反推出怎么解密。
所以古人他只是古他不傻啊,隨便抓個(gè)活口不就知道這密碼怎么玩的了嗎?
另一個(gè)對(duì)稱的意思則是,不管你如何對(duì)明文進(jìn)行替換,總會(huì)形成一種明文和密文的 一一 對(duì)應(yīng)關(guān)系,但這也存在一個(gè)很大的弊端,那就是語(yǔ)言的使用是有規(guī)律性的。
比如這張圖表,這是一份來(lái)自皮特網(wǎng)對(duì) 3.5 萬(wàn)億份文稿分析后得出的字母和單詞使用頻率分析報(bào)告,也就說(shuō)明不管你怎么替換,經(jīng)過(guò)多少層替換,只要被截獲的密文一多,總會(huì)被頻率分析法拿捏。
當(dāng)然雖然問(wèn)題找出來(lái)了,但顯然古典密碼學(xué)家們并沒(méi)有很好的解決這個(gè)問(wèn)題,甚至間接證明了古典密碼是真不行,比如二戰(zhàn)時(shí)期,古典密碼的巔峰之作 -- 恩格碼機(jī) ( Enigma )。
在加密時(shí),只要在機(jī)器的鍵盤上輸入想要加密的明文( dianzan ),亮起來(lái)的就是被加密好的密文。
而且明文中相同的字母也會(huì)被加密成了不同密文,這就很好的防止了頻率分析法。
另外即便知道其運(yùn)作原理也是很難破解的。
這是怎么做到的呢?
我們來(lái)到恩格瑪機(jī)的內(nèi)部,轉(zhuǎn)子裝置,在這個(gè)裝置的右端輸入輪上,有 26 個(gè)觸點(diǎn),分別鏈接鍵盤上的 26 個(gè)字母。
裝置的中部由同樣帶有 26 個(gè)觸點(diǎn)的多個(gè)轉(zhuǎn)輪組成,但與輸入輪有些區(qū)別,在轉(zhuǎn)輪的內(nèi)部額外多了一些雜亂的交換機(jī)制,意味著輸入板的字母每經(jīng)過(guò)一個(gè)轉(zhuǎn)輪時(shí)被替換 1 次。
而在裝置的末端有一個(gè)叫做反射板的裝置,它仍有 26 個(gè)觸點(diǎn),這里的觸點(diǎn)兩兩組合組成同游泳比賽一樣的折返點(diǎn)。
字母會(huì)在這里被再次交換后,仍要重返轉(zhuǎn)輪,再次進(jìn)行替換,終才能回到起點(diǎn)。
這樣就完成了一次加密流程,可以看出這是多次替換的疊加,但其實(shí)恩格瑪機(jī)還有點(diǎn)睛之筆,在每次按下鍵盤時(shí),一個(gè)特殊的杠桿裝置會(huì)帶動(dòng)轉(zhuǎn)輪轉(zhuǎn)動(dòng)一次,并且轉(zhuǎn)輪上有一個(gè)特殊的輪紋,當(dāng)前一個(gè)轉(zhuǎn)輪轉(zhuǎn)動(dòng)一周后,后一個(gè)轉(zhuǎn)輪也會(huì)轉(zhuǎn)動(dòng)一次。
這就使得按下每個(gè)字母時(shí)用到的加密線路都是不一樣的,樣頻率分析法也就失效了。
另外這樣的設(shè)計(jì),即便是知道其運(yùn)作原理,逆向破解也是非常困難的。
以初的恩尼格瑪機(jī)為例,它的內(nèi)部有三排剛剛提到的輪紋輪盤,每個(gè)輪盤上有 26 個(gè)字母,皆可轉(zhuǎn)動(dòng),這樣來(lái)看我們就有一萬(wàn)七千五百多種方式設(shè)置輪盤的初始位置。
除此之外,為了保險(xiǎn)起見(jiàn)它的外側(cè)還附加了一組交換機(jī)制,也就是說(shuō)如果連通 o 和 e,當(dāng)按下 o,其實(shí)相當(dāng)于是按下了 e。
假設(shè)我們每次任選 6 對(duì)進(jìn)行交換,根據(jù)概率論的算法,我們又產(chǎn)生了一千多億種可能,僅是這些初始位置的方案已經(jīng)有 1700 萬(wàn)億種可能了。
后代的恩尼格瑪機(jī),甚至一度將輪盤數(shù)增加到了 8 個(gè),要逆向推算的運(yùn)算量更是指數(shù)級(jí)上升,在沒(méi)計(jì)算機(jī)的時(shí)代,想通過(guò)逆向窮舉的方式破解幾乎是天方夜譚。
況且當(dāng)時(shí)的恩尼格瑪機(jī)每天都會(huì)更換一次初始方案。
這也就說(shuō)明,當(dāng)天如果算不出,第二天就要重新計(jì)算。這給暴力破解又上了一層難度。
但了解二戰(zhàn)的小伙伴都知道,恩格瑪機(jī)終還是被破解了,甚至沒(méi)等到計(jì)算機(jī)誕生。
1940 年,計(jì)算機(jī)之父,英國(guó)數(shù)學(xué)家阿蘭·圖靈,就破解了恩尼格瑪機(jī)。
但剛剛不是說(shuō)沒(méi)計(jì)算機(jī)不可能破解嘛?這說(shuō)法確實(shí)沒(méi)錯(cuò),但遭不住德國(guó)人太軸又太飄啊,不管發(fā)啥,都得來(lái)一句 heil hitle。
哎,不僅如此,德國(guó)人還很喜歡匯報(bào),時(shí)不時(shí)就要給長(zhǎng)官發(fā)一句:報(bào)告長(zhǎng)官,啥事沒(méi)有!再附一句 heil hitle。
按照禮節(jié)那長(zhǎng)官也得回一句( Heilhitle )表示啊收到了 ~
照理來(lái)說(shuō),這屁大點(diǎn)事直接發(fā)就好了,不行,至少在德國(guó)人那里不行,要保守元首所有的秘密,包括這份愚忠!必須恩格瑪一下!
這嚴(yán)謹(jǐn)又白給的操作很快就讓圖靈拿到很多明密對(duì)應(yīng)的線索,依靠這些線索他和他的同事戈登 · 韋爾奇曼發(fā)明出一種叫做 “ 炸彈機(jī) ” 的解密機(jī),真的硬生生逆向破解了恩格瑪機(jī)。
所以這又一次說(shuō)明像古典密碼這樣,知道怎么加密就能知道怎么解密的對(duì)稱加密方法,從根本上來(lái)說(shuō)是肯定會(huì)被破解的,只不過(guò)是時(shí)間問(wèn)題罷了。
現(xiàn)代密碼學(xué)
那有沒(méi)有一種加密方式,信息發(fā)出者只知道怎么加密不知道怎么解密,而信息接受者既知道怎么加密又知道怎么解密的方法呢?
其實(shí)這就是現(xiàn)代密碼學(xué)的研究方向之一,也就是如何實(shí)現(xiàn)非對(duì)稱加密。
這種加密方式,在古典密碼的基礎(chǔ)上,引入了密鑰的概念,將密鑰分為公鑰和私鑰,公鑰用來(lái)加密,私鑰用來(lái)解密。
這樣即便是把加密方式公開(kāi)出去,只要私鑰仍然安全,這個(gè)加密系統(tǒng)就不會(huì)被破解。
所以現(xiàn)代密碼學(xué)家們公開(kāi)加密方式的做法,其實(shí)是不會(huì)影響到加密系統(tǒng)的安全的。
還記得我們開(kāi)頭的那個(gè)魔術(shù)游戲么?2359 就是一個(gè)公鑰,任何人都可以用它來(lái)加密。理論上我只要保護(hù)好用來(lái)解密的私鑰 12039,這就是一個(gè)非對(duì)稱加密。
原理也很簡(jiǎn)單,當(dāng)公鑰與私鑰相乘時(shí)你會(huì)發(fā)現(xiàn)結(jié)果為 28400001,意味著五位以內(nèi)的數(shù)與他們兩個(gè)接連相乘后,相當(dāng)于乘了 00001。
但這對(duì)于應(yīng)用級(jí)非對(duì)稱加密而言,顯然不夠安全,想更進(jìn)一步,要用到數(shù)學(xué)上一種特殊函數(shù),叫做活板門單向函數(shù),又叫單向陷門函數(shù)。
這種函數(shù)正向計(jì)算非常容易,但想反推回去幾乎是一件不可能的事情,不過(guò)如果知道某些關(guān)鍵信息,反推也會(huì)變得非常容易。
比如非常著名的 RSA 算法,銀行,郵件,聊天軟件幾乎所有你能想到的涉及數(shù)字的領(lǐng)域都在它的保護(hù)之下,算的上妥妥的應(yīng)用級(jí)了,它的加密原理使用的就是單項(xiàng)陷門函數(shù)。
加密時(shí)只需要按照公鑰的數(shù)據(jù)求冪再求余,就可以得到密文。
舉個(gè)簡(jiǎn)單的例子,比如需要加密的數(shù)字是 5,公鑰是( 7, 33 ),只需要按照公鑰的數(shù)據(jù)將明文 5 求 7 次方再對(duì) 33 求余,可以求得密文 14。
如果想按照怎么加密就怎么解密的思路逆推明文,第一步反推就會(huì)卡住,因?yàn)閷?duì) 33 求余得 14 的數(shù)有無(wú)限多種可能,這也意味著這樣無(wú)法確定出明文到底是什么。
但如果持有私鑰( 3 , 33 )我們只需要按照私鑰的數(shù)據(jù)對(duì)密文再次求冪求余,就可以還原出明文 5。這就實(shí)現(xiàn)了加密與解密過(guò)程的分離。
那既然無(wú)法反推,那能不能通過(guò)公鑰算出私鑰呢?
來(lái)看看私鑰和公鑰的制作過(guò)程:首先我們選取兩個(gè)質(zhì)數(shù),質(zhì)數(shù)的乘積記為 N ,通過(guò)歐拉函數(shù)φ( n ) = ( p-1 ) * ( q-1 ),計(jì)算出函數(shù)φ,之后我們選取一個(gè)整數(shù) E , E 既要滿足 1<e< φ( n ),又要和φ( n )互質(zhì),這個(gè) E 就是公鑰,私鑰則通過(guò)計(jì)算 E 的模φ ( n ) 乘法逆元求得。
當(dāng)我們?cè)谥恢拦€的情況下,想推算出私鑰,必然需要得到開(kāi)始的兩個(gè)質(zhì)數(shù)。
因?yàn)檫@里為了方便大家理解所取質(zhì)數(shù)比較小,而通常情況下,這個(gè)質(zhì)數(shù)是非常大的,即便是我們?cè)诠€里可以知道兩個(gè)質(zhì)數(shù)的乘積,但想通過(guò)因式分解逆推出兩個(gè)質(zhì)數(shù),按照現(xiàn)有的計(jì)算水平至少要算到這篇文章閱讀量破千萬(wàn)。
不過(guò)理論上量子計(jì)算機(jī)倒是行,額。。
除非你能在量子計(jì)算機(jī)上湊齊 4096 個(gè)邏輯量子比特來(lái)有效運(yùn)行 Shor 算法,但由于量子需要錯(cuò)誤糾正,你操作的量子計(jì)算機(jī)至少需要數(shù)百萬(wàn)個(gè)物理量子比特。
額,目前先進(jìn)的也僅有數(shù)十到數(shù)百量子比特的規(guī)模。
這也意味著未來(lái)幾十年內(nèi)暴力破解類似 RSA 算法中的單向陷門函數(shù)基本沒(méi)戲。
所以,對(duì)現(xiàn)在的我們而言,加密算法已經(jīng)很強(qiáng)大了,但這萬(wàn)萬(wàn)不代表著絕對(duì)的安全。
后
因?yàn)檫@些強(qiáng)大的加密算法只能保證你銀行卡里的錢不被隨意篡改。
但如果使用者防范意識(shí)不夠強(qiáng),在某些網(wǎng)站輸入了自己的密碼,又或者用同樣的用戶名和密碼注冊(cè)了很多不同的 app,這些都極有可能被黑客拿來(lái)暴力破解。
回看密碼學(xué)的每個(gè)時(shí)代,似乎人一直都是嚴(yán)謹(jǐn)密碼的大漏洞。
正如美國(guó)的密碼學(xué)學(xué)者布魯斯 · 施奈爾所言:“ 安全就像鏈條,它取決于薄弱的環(huán)節(jié)。”
在信息安全的世界里,技術(shù)可以構(gòu)建起高墻,而在人類的世界里,富有情感成了安全里大的漏洞。
雖然密碼學(xué)很枯燥,但我們?nèi)詽M懷熱情,希望更多人知道,意識(shí)到,提高警惕保護(hù)好自己,這才是現(xiàn)代密碼學(xué)的終門。
本文鏈接:http://morphism.cn/news41135.html奇怪的現(xiàn)代密碼學(xué):好的加密方式 就是公開(kāi)