如果在你的腦海想一個(gè)五位數(shù),那么該如何悄無(wú)聲息地把這個(gè)數(shù)傳遞給我呢?來(lái)做個(gè)簡(jiǎn)單的游戲:假設(shè)你想的數(shù)字是66666或者12345,等等,請(qǐng)將它與“幸運(yùn)數(shù)字”2359相乘,只取結(jié)果的后五位數(shù)告訴我,我就能知道你所想的數(shù)字是什么。準(zhǔn)備好了嗎?將你得到的后五位數(shù)再乘以“終極數(shù)字”12039,結(jié)果的后五位就是你所想的數(shù)字。這個(gè)數(shù)字游戲看起來(lái)像個(gè)魔術(shù),當(dāng)然它還有個(gè)更牛的出處——現(xiàn)代密碼學(xué),甚至你的銀行卡、郵件、聊天軟件也和它有著千絲萬(wàn)縷的聯(lián)系。
克勞德·艾爾伍德·香農(nóng)在1949年發(fā)表的《保密系統(tǒng)的通信理論》一文中,將密碼學(xué)劃分為古典密碼和現(xiàn)代密碼。因?yàn)楝F(xiàn)代密碼學(xué)的理論聽(tīng)起來(lái)太過(guò)瘋狂,所以竟被無(wú)視了30多年。比如現(xiàn)代密碼學(xué)中的“柯克霍夫原則”指的是:密碼系統(tǒng)應(yīng)該被所有人知道加密方式是什么;再比如“弗納姆加密法”:用一次密碼換一次。這些理論,乍一聽(tīng)誰(shuí)受得了。但如果你知道古典密碼的那些故事,你就能理解這些理論是多么合理了。
在古典密碼的時(shí)代,密碼學(xué)的概念是比較模糊的,盡管密碼大量被用在軍事領(lǐng)域,但加密方式更像是一種藝術(shù)行為。雖然維基百科中,古典密碼被“總結(jié)為”替換式密碼或移項(xiàng)式密碼又或者兩者混合。但要注意,這里是“總結(jié)為”而不是“定義為”,這就說(shuō)明古典密碼仍是一個(gè)充滿想象力的名詞,是一種“你懂,我懂,他不懂”的藝術(shù)行為。
比如,先秦兵書(shū)《六韜》中提到的陰符傳說(shuō)是由姜太公姜子牙發(fā)明的,為了快速傳遞前方戰(zhàn)報(bào),而不被敵方知曉,他發(fā)明了一種用不同長(zhǎng)度的魚(yú)竿來(lái)傳遞戰(zhàn)報(bào)的方法,這也是我國(guó)史料記載中最早的軍事密碼。再比如,公元前700年,古希臘軍隊(duì)用一種叫作“密碼棒”的木棍進(jìn)行保密通信。其使用方法是:把長(zhǎng)帶狀羊皮紙纏繞在圓木棍上,然后在上面寫(xiě)字,解下羊皮后上面只有雜亂無(wú)章的字符,只有再次以同樣的方式纏繞到同樣粗細(xì)的棍子上,才能看出所寫(xiě)的內(nèi)容。當(dāng)然除此之外還有很多好玩的古典密碼,比如愷撒密碼、柵欄密碼,等等。
但古典密碼存在一個(gè)致命的弱點(diǎn),那就是太“對(duì)稱”了。這是什么意思?這里“對(duì)稱”有兩層含義,一是古典密碼的加密是可逆的,一旦知道怎么加密,很容易就可以反推出怎么解密。比如隨便抓個(gè)活口,就能知道密碼該如何破解;另一層意思則是,不管你如何對(duì)“明文”進(jìn)行替換,總會(huì)形成一種“明文”和“密文”的一一對(duì)應(yīng)關(guān)系。這也存在一個(gè)很大的弊端,那就是語(yǔ)言的使用是有規(guī)律性的,比如英文文本“布朗語(yǔ)料庫(kù)”對(duì)3.5萬(wàn)億份文稿分析后得出的字母和單詞使用頻率分析報(bào)告,換句話說(shuō),不管你怎么替換,經(jīng)過(guò)多少次替換,只要被截獲的“密文”一多,“明文”總會(huì)被頻率分析法推測(cè)出來(lái)。顯然古典密碼學(xué)家們并沒(méi)有很好地解決這個(gè)問(wèn)題,間接證明了古典密碼是有漏洞的。
我們理解了加密里的對(duì)應(yīng)關(guān)系后,就可以來(lái)看看,古典密碼的巔峰之作——二戰(zhàn)時(shí)期的恩尼格瑪密碼機(jī)。這臺(tái)機(jī)器在加密時(shí),只要在機(jī)器的鍵盤(pán)上輸入想要加密的“明文”,而亮起來(lái)文字就是被加密好的“密文”。而且“明文”中相同的字母也會(huì)被加密成不同“密文”,而且為了防止某個(gè)字母加密一圈后出現(xiàn)沒(méi)變的情況,恩尼格瑪機(jī)在按下某個(gè)鍵的時(shí)候,通過(guò)齒輪的機(jī)制從物理上直接被切斷了,也就是說(shuō),根本不可能出現(xiàn)輸入a,輸出還是a的情況,這樣頻率分析法也就失效了。另外即便知道其運(yùn)作原理也是很難破解的。
最初的恩尼格瑪機(jī)的內(nèi)部有三排帶有“輪紋”的輪盤(pán),每個(gè)輪盤(pán)上有26個(gè)字母,皆可轉(zhuǎn)動(dòng)。通過(guò)計(jì)算(26的三次方)我們可以得出,有1.7萬(wàn)多種方式設(shè)置輪盤(pán)的初始位置。除此之外,為了保險(xiǎn)起見(jiàn)它的外側(cè)還附加了一組交換機(jī)制,也就是說(shuō),如果連通o和e,當(dāng)按下o,其實(shí)相當(dāng)于是按下了e。假設(shè)我們每次任選6對(duì)進(jìn)行交換,根據(jù)概率論這里又產(chǎn)生了1000多億種可能。而后幾代的恩尼格瑪機(jī),甚至一度將輪盤(pán)數(shù)量增加到了8個(gè),要逆向推算的運(yùn)算量更是指數(shù)級(jí)上升,在沒(méi)有計(jì)算機(jī)的時(shí)代,想通過(guò)逆向窮舉的方式破解幾乎是天方夜譚。況且當(dāng)時(shí)的恩尼格瑪機(jī)每天都會(huì)更換一次初始方案。這也就說(shuō)明,當(dāng)天如果算不出結(jié)果,第二天就要推倒重新計(jì)算。這給破解又上了一層難度。
但了解二戰(zhàn)歷史的人都知道,恩尼格瑪機(jī)最終還是被破解了,甚至不用等到計(jì)算機(jī)的誕生。計(jì)算機(jī)之父英國(guó)數(shù)學(xué)家艾倫·圖靈破解了恩尼格瑪機(jī)。沒(méi)有計(jì)算機(jī)的他是如何做到的?原來(lái),德國(guó)人不管用恩尼格瑪機(jī)發(fā)什么信息,都得來(lái)一句禮儀上的德語(yǔ)“heil hitler”。這種“嚴(yán)謹(jǐn)又白給”的操作很快就讓圖靈拿到很多明密對(duì)應(yīng)的線索,依靠這些線索他和他的同事戈登·韋爾奇曼發(fā)明出一種叫作“炸彈機(jī)”的解密機(jī),于是硬生生地逆向破解了恩尼格瑪機(jī)。所以這又一次說(shuō)明像古典密碼一樣,知道怎么加密就能知道怎么解密的對(duì)稱加密方法,從根本上來(lái)說(shuō)是肯定會(huì)被破解的,只不過(guò)是時(shí)間問(wèn)題罷了。
有沒(méi)有一種加密方式,信息發(fā)出者只知道怎么加密不知道怎么解密,而信息接收者既知道怎么加密又知道怎么解密的方法呢?其實(shí),這就是現(xiàn)代密碼學(xué)的研究方向之一,也就是如何實(shí)現(xiàn)非對(duì)稱加密。非對(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ù)嗎?“幸運(yùn)數(shù)字”2359就是一個(gè)公鑰,任何人都可以用它來(lái)加密。理論上,我只需要保護(hù)好用來(lái)解密的“終極數(shù)字”,也就是私鑰12039,這個(gè)過(guò)程就是一個(gè)簡(jiǎn)單的非對(duì)稱加密。數(shù)學(xué)原理也很簡(jiǎn)單,當(dāng)公鑰與私鑰相乘時(shí)你會(huì)發(fā)現(xiàn)結(jié)果為28400001,意味著五位以內(nèi)的數(shù)與他們兩個(gè)接連相乘后,相當(dāng)于乘了00001。
當(dāng)然這對(duì)于應(yīng)用級(jí)非對(duì)稱加密而言,顯然不夠安全,想更進(jìn)一步,要用到數(shù)學(xué)上一種特殊函數(shù),叫作活板門(mén)單向函數(shù),又叫單向陷門(mén)函數(shù)。這種函數(shù)正向計(jì)算非常容易,但想反推回去幾乎是一件不可能的事情,不過(guò)如果知道某些關(guān)鍵信息,反推也會(huì)變得非常容易。如非常著名的RSA算法,銀行、郵件、聊天軟件幾乎所有你能想到的涉及數(shù)字的領(lǐng)域都在它的保護(hù)之下,算得上國(guó)民應(yīng)用級(jí)了,它的加密原理使用的就是單項(xiàng)陷門(mén)函數(shù)。
舉個(gè)簡(jiǎn)單的例子方便大家理解這個(gè)函數(shù)的意義,比如需要加密的“明文”數(shù)字是5,公鑰是(7,33)。按照加密時(shí)只需要按照公鑰的數(shù)據(jù)求冪再求余就可以得到“密文”。那么計(jì)算方式就是數(shù)字5求7次方再除以33求余,就可以求得“密文”14。如果想按照怎么加密就怎么解密的思路逆推“明文”,第一步反推就會(huì)卡住,因?yàn)閷?duì)33求余得14的數(shù)有無(wú)限多種可能,這也意味著這樣無(wú)法確定出“明文”到底是什么,但如果持有私鑰(3,33)我們只需要按照私鑰的數(shù)據(jù)對(duì)“密文”再次求冪再求余,就可以還原出“明文”5。這就實(shí)現(xiàn)了加密與解密過(guò)程的分離,也就是非對(duì)稱加密方式。
既然無(wú)法反推,那能不能通過(guò)公鑰算出私鑰呢?理論上,量子計(jì)算機(jī)倒是行。但由于量子需要錯(cuò)誤糾正,你操作的量子計(jì)算機(jī)至少需要數(shù)百萬(wàn)個(gè)物理量子比特。而目前最先進(jìn)的量子計(jì)算機(jī)也僅有數(shù)十到數(shù)百量子比特的規(guī)模。這也意味著未來(lái)幾十年內(nèi)暴力破解類似RSA算法中的單向陷門(mén)函數(shù)基本沒(méi)戲。
對(duì)現(xiàn)在的我們而言,加密算法已經(jīng)很強(qiáng)大了,但這并不代表著絕對(duì)安全。這些強(qiáng)大的加密算法只能保證你銀行卡里的錢(qián)不被隨意篡改。但如果使用者防范意識(shí)不夠強(qiáng),在某些網(wǎng)站輸入了自己的密碼,又或者用同樣的用戶名和密碼注冊(cè)了很多不同的軟件,這些信息都極有可能被黑客拿來(lái)進(jìn)行暴力破解。
回看密碼學(xué)的歷史,人似乎一直都是嚴(yán)謹(jǐn)密碼的最大漏洞。正如美國(guó)的密碼學(xué)學(xué)者布魯斯·施奈爾所言:“安全就像鏈條,取決于它最薄弱的環(huán)節(jié)?!彪m然密碼學(xué)很枯燥,但我們?nèi)詽M懷熱情,希望更多人知道并意識(shí)到,提高警惕保護(hù)好自己,這才是現(xiàn)代密碼學(xué)的終極意義。
(責(zé)編:南名俊岳)