從我們的經(jīng)驗(yàn)來(lái)看,某種加密方式,不論它在剛出現(xiàn)時(shí)宣稱有多么牢不可破,隨著時(shí)間的遷移,它總會(huì)暴露出弱點(diǎn),從一個(gè)強(qiáng)大的加密方式變成一個(gè)較弱的加密方式。而如今人們?cè)谑褂媚壳傲餍械募用芊绞綍r(shí),也有這樣的憂慮,擔(dān)心某一天會(huì)有一種捷徑出現(xiàn),使得目前所使用的看似無(wú)懈可擊的加密手段在可控的時(shí)間內(nèi)就被暴力破解。
就算目前所使用的那些還沒有被破解的加密方式,在不斷升級(jí)的CPU時(shí)鐘頻率前提下,暴力破解所需的時(shí)間也越來(lái)越短了。比如幾個(gè)月前需要耗時(shí)一年才能破解的密碼,以現(xiàn)在的計(jì)算速度來(lái)看,可能只需要七八個(gè)月就可以完成了。正因?yàn)橛?jì)算速度越來(lái)越快,使得我們通過(guò)暴力手段破解密碼的時(shí)間大大縮短了。
就算是以難以通過(guò)暴力方式破解為目的構(gòu)建的更復(fù)雜更聰明的加密算法,在未來(lái)某天,也不可避免的會(huì)步那些已經(jīng)被證明不夠安全的加密算法的后塵。這就好像是冷戰(zhàn)時(shí)期的軍備競(jìng)賽,一方想竭力保護(hù)隱私,另一方卻竭力窺探隱私。
在加密算法的發(fā)展過(guò)程中,有很多算法都已經(jīng)被破解或被證明不夠安全,唯有一種加密算法一直存在了93年。這種算法叫做一次性密鑰(one-time pad)。在1917年, Gilbert Vernam開發(fā)了一種叫做Vernam Cipher 的加密方法,使用電傳技術(shù),通過(guò)打有密鑰的紙帶進(jìn)行數(shù)據(jù)加密和解密。結(jié)果便出現(xiàn)了當(dāng)時(shí)最強(qiáng)的對(duì)稱加密技術(shù)。
美國(guó)陸軍上尉Joseph Mauborgne注意到,這是真正隨機(jī)產(chǎn)生的密鑰,不會(huì)有任何重復(fù)的可能,因此Vernam cipher可以做到更強(qiáng)大的效果。于是,基于紙帶密鑰的方法,在一沓紙上印有隨即字母或數(shù)字,作為密鑰的加密算法出現(xiàn)了。相同的一沓紙可以給兩個(gè)人用,每個(gè)頁(yè)面上的每個(gè)字符只能用一次(每張紙上的字符或數(shù)字用完,則銷毀該密碼紙),這種方式可以避免敵人通過(guò)枚舉法暴力破解信息。由于這種分法密鑰流數(shù)據(jù)的技術(shù)是基于可銷毀的紙張的,因此也被認(rèn)為是一次性密鑰。
信息理論之父Claude Shannon曾經(jīng)通過(guò)數(shù)學(xué)方法,證明這種一次性密鑰如果使用得當(dāng),是無(wú)法被破解的,而所謂的使用得當(dāng),是指及時(shí)銷毀所使用的密鑰頁(yè),即使對(duì)方拿到了密碼本的其余部分,也無(wú)法進(jìn)行解密。同樣的理念也可以用于數(shù)字系統(tǒng),但是要確保計(jì)算機(jī)具有足夠的安全措施以及全面的考慮,防止黑客入侵一次性密鑰系統(tǒng)。比如,一些昂貴的數(shù)據(jù)恢復(fù)系統(tǒng)會(huì)將已刪除的文件恢復(fù),其中就有可能恢復(fù)那些一次性的密鑰文件。因此如果使用數(shù)字化的一次性密鑰系統(tǒng),就要確保所刪除的密鑰文件是被徹底刪除,無(wú)法恢復(fù)的。
一次性密鑰加密方式有時(shí)候非常不方便,因此現(xiàn)在很少有人在用這種加密方式。而正是由于這種不便性,我們實(shí)際需要的是一些理論上有些弱的加密方式,比如AES/Rijndael 以及Twofish 。一次密鑰的不方便性在于:
由于一次性密鑰是一種對(duì)稱加密方式,進(jìn)行加密通信的雙方需要擁有完全一樣的密鑰數(shù)據(jù)。而在某些環(huán)境下,這種條件是無(wú)法實(shí)現(xiàn)的,因?yàn)橐胱岆p方都擁有這個(gè)密鑰,就意味著必須有一種足夠安全的方式讓雙方共享或傳遞密鑰數(shù)據(jù),而如果有了這樣的安全環(huán)境,也就不需要再使用一次性密鑰了。而一般來(lái)說(shuō)通過(guò)物理方式傳遞密鑰(比如親手交給對(duì)方)才能實(shí)現(xiàn)一次性密鑰的優(yōu)勢(shì)。
一次性密鑰必須和所加密內(nèi)如一樣長(zhǎng)。這意味著,如果你要對(duì)一個(gè)3GB的文件進(jìn)行加密,就需要有一個(gè)3GB的一次性密鑰。
相同的一次性密鑰只能在兩人間保存,如果超過(guò)兩人知曉這個(gè)密鑰,就不再安全了。比如,如果在多個(gè)人之間傳送不同的信息,并且不能讓接受者獲知其它人所接受的信息內(nèi)容,只用一個(gè)相同的密鑰是完全達(dá)不到加密效果的。相反,如果采用非對(duì)稱的加密方式,我們就只需提供一個(gè)唯一的公鑰給人們,每個(gè)人都通過(guò)自己的私鑰對(duì)數(shù)據(jù)進(jìn)行加密解密,他們彼此之間是無(wú)法獲知對(duì)方所加密的信息內(nèi)容的,除非私鑰被盜取或者通過(guò)日益強(qiáng)大的計(jì)算機(jī)系統(tǒng)經(jīng)過(guò)暴力破解出來(lái)。這是因?yàn)楫?dāng)信息被公鑰加密后,只有相關(guān)的私鑰才可以將其解密。
重復(fù)使用一次性密鑰存在潛在的安全風(fēng)險(xiǎn),因?yàn)樗媾R著已知明文漏洞。Kerckhoffs的理論是,保證一次性密鑰系統(tǒng)安全的前提是保證密鑰安全,但是在米加密信息和明文信息共存的時(shí)候,可以倒推出這個(gè)一次性密鑰。當(dāng)然,如果每一段密鑰都僅使用一次,那么安全性仍然沒有問(wèn)題,因?yàn)榧词?ldquo;敵人”同時(shí)獲取了秘文和明文,并破解出了密鑰,那這段密鑰也是已經(jīng)被遺棄的密鑰,對(duì)于其它信息的破譯毫無(wú)用處。而如果密鑰被重復(fù)利用,那么以獲取的明文信息就可以成為破解新加密信息的一個(gè)重要工具。這就是為什么這種加密系統(tǒng)被稱為“一次性”密鑰系統(tǒng)。
當(dāng)使用過(guò)一次性密鑰后,不能再使用這個(gè)密鑰對(duì)其它要發(fā)送的數(shù)據(jù)進(jìn)行加密。如果通信的雙方分別位于地球的兩端,那么這種通信方式會(huì)讓人抓狂。
另外還有其它一些因素也使得一次性密鑰系統(tǒng)在某些環(huán)境下變得毫無(wú)實(shí)用性。但是這也給了我們一個(gè)理論知識(shí),讓我們能明白那些理論上較弱的密鑰系統(tǒng)為什么還那么重要。
一次性密鑰系統(tǒng)的工作方式很簡(jiǎn)單。它只是簡(jiǎn)單的對(duì)兩組數(shù)據(jù)進(jìn)行運(yùn)算,比如兩個(gè)字母或兩個(gè)數(shù)字,并通過(guò)運(yùn)算得出新的加密數(shù)據(jù)。而這個(gè)運(yùn)算是針對(duì)待加密數(shù)據(jù)中的每一位數(shù)據(jù)的。運(yùn)算過(guò)程很簡(jiǎn)單,一次一位數(shù)據(jù)。比如 XOR運(yùn)算就可以用來(lái)進(jìn)行這樣的加密。我們舉個(gè)最簡(jiǎn)單的例子,使用XOR運(yùn)算對(duì)二進(jìn)制數(shù)列進(jìn)行加密:
首先,你需要一段信息。假設(shè)我們把“short”這個(gè)詞作為信息,它確實(shí)不長(zhǎng)。
接下來(lái)把這段信息轉(zhuǎn)換成二進(jìn)制形式。我們可以使用ASCII編碼來(lái)轉(zhuǎn)換 “short”這個(gè)詞,轉(zhuǎn)換后會(huì)得到下面這一串二進(jìn)制信息:
0111001101101000011011110111001001110100
接下來(lái)你需要一個(gè)和上面二進(jìn)制串長(zhǎng)度完全一致的密鑰。在這個(gè)例子中,我們可以使用下面這串二進(jìn)制字符作為密鑰:
5. 0110010101101010001110010010011101100100
最后,我們將這兩組字符串進(jìn)行XOR 運(yùn)算,基本上就是一個(gè)簡(jiǎn)單的減法。也就是說(shuō),信息中第一個(gè)字符是0,密鑰的第一個(gè)字符也是0,那么0 - 0 = 0。同樣,信息中第二個(gè)字符是1,密鑰的第二個(gè)字符也是1, 1 - 1 = 0。接下來(lái)都是這樣計(jì)算,計(jì)算中除了0外,還可能出現(xiàn)1 或 -1。此時(shí)對(duì)結(jié)果取絕對(duì)值,即不論1還是-1,均作為1。其運(yùn)算過(guò)程和結(jié)果如下:
7. 0111001101101000011011110111001001110100
8. 0110010101101010001110010010011101100100
----------------------------------------
10. 0001011000000010010101100101010100010000
當(dāng)然,由于我們對(duì)結(jié)果的二進(jìn)制串沒有進(jìn)行ASCII轉(zhuǎn)換,因此很難看出它到底被加密成了什么樣子。在電腦上進(jìn)行ASCII編碼很容易,手動(dòng)編碼則很麻煩,而對(duì)于數(shù)字編碼,通過(guò)手動(dòng)編碼還是比較容易的。
一次性密鑰系統(tǒng)的核心算法顯然是相當(dāng)簡(jiǎn)單的。只要圍繞這個(gè)核心算法,設(shè)計(jì)加密軟件的其余部分,并找到合適的密鑰使用方法,那么這個(gè)新的加密軟件就是真正安全的。換句話說(shuō),如果要找一個(gè)絕對(duì)安全有效不可能被破解的加密方式,那么只有使用一次性密鑰系統(tǒng)了,前提是正確的使用它,即密鑰只使用一次。