PGP本身就是一個數(shù)據(jù)安全產(chǎn)品,它會有什么安全性問題呢?PGP的作者PhilZimmermann在PGP文檔中說到:“沒有哪個數(shù)據(jù)安全系統(tǒng)是牢不可破的。”PGP也不例外。我們研究它的安全漏洞就是為了讓用戶知道哪些事會降低PGP的安全性,以及如何避免它們。下面是這些漏洞:
口令或私匙的泄密、公匙被篡改、你刪除的文件被人恢復(fù)、病毒和特洛伊木馬、物理安全受到侵犯(物理安全指計算機等物理資源的安全)、電磁泄露、暴露在多用戶系統(tǒng)中、網(wǎng)絡(luò)數(shù)據(jù)流分析,甚至?xí)锌赡鼙恢苯訌拿艽a學(xué)分析的角度被解密(這當(dāng)然是可能性最小的了)。
我們先分別看看PGP加密體系的四個關(guān)鍵部分的安全性問題。PGP是個雜合算法,所謂“雜合”體現(xiàn)在它包含:一個對稱加密算法(IDEA)、一個非對稱加密算法(RSA)、一個單向散列算法(MD5)以及一個隨機數(shù)產(chǎn)生器(從用戶擊鍵頻率產(chǎn)生偽隨機數(shù)序列的種子)。每種算法都是PGP不可分割的組成部分,對它們各有不同的攻擊方式。
◎IDEA的安全性問題
IDEA是PGP密文實際上的加密算法,對于采用直接攻擊法的解密者來說,IDEA是PGP密文的第一道防線。
關(guān)于IDEA的原理請參見《PGP簡介》,在這里我主要談?wù)勁c安全性有關(guān)的部分。IDEA,一種由Lai和Massey在1992年完成的對64bit大小的數(shù)據(jù)塊的傳統(tǒng)加密算法。IDEA是InternationalDataEncryptionAlgorithm的縮寫。它基于“相異代數(shù)群上的混合運算”設(shè)計思想,它比DES在軟件實現(xiàn)上快得多,和DES一樣,它也支持“反饋加密(CFB)”和“鏈?zhǔn)郊用埽–BC)”兩種模式,在PGP中采用IDEA的64-bitsCFB模式。
IDEA比同時代的算法象:FEAL,REDOC-II,LOKI,Snefru和Khafre都要堅固,而且最近的證據(jù)表明即使是在DES上取得巨大成功的Biham和Shamir的微分密碼分析法對IDEA也無能為力。Biham和Shamir曾對IDEA的弱點作過專門分析,但他們沒有成功。直到目前沒有任何關(guān)于IDEA的密碼學(xué)分析攻擊法的成果發(fā)表,據(jù)目前我接觸到的文檔中談到無論是NSA還是hacker們都還沒有辦法對IDEA進行密碼學(xué)分析,因此對IDEA的攻擊方法就只有“直接攻擊”或者說是“密匙窮舉”一種了。
那么對IDEA的直接攻擊難度如何呢?我們知道IDEA的密匙空間(密匙長度)是128位,用十進制表示所有可能的密匙個數(shù)將是一個天文數(shù)字:
340,282,366,920,938,463,463,374,607,431,768,211,456.
為了試探出一個特定的密匙,平均要試探一半上面的可能性。即使你用了十億臺每秒鐘能夠試探十億個密匙的計算機,所需的時間也比目前所知的宇宙的年齡要長,而即使是在當(dāng)代制造每秒試探十億個密匙的計算機還是不可能的。因此對IDEA進行明文攻擊也是不可能的,更何況從PGP的原理看一個IDEA的密匙失密只會泄露一次加密的信息,對用戶最重要的密匙——RSA密匙對的保密性沒有什么影響。
那么看來IDEA是沒有什么問題了,因為你既不能從算法中找到漏洞又沒法明文攻擊實際上呢?漏洞還是有的,大家知道Netscape的安全性風(fēng)波吧,就是因為忽視了密匙隨機生成的問題,Netscape的隨機密匙生成算法生成的密匙很有“規(guī)律”,而且遠遠沒有均布到整個密匙空間去,所以盡管Netscape的美國版采用128bits的密匙,還是被用很小的機時代價破掉了。那么PGP是不是也有這個毛病呢?我將在下面談到隨機數(shù)生成時再詳細說,這里提到它是為了說明PGP各個部分之間的依存關(guān)系。
當(dāng)有人發(fā)現(xiàn)PGP實際上不是一種“純粹的”RSA加密算法時,他們擔(dān)心由于加密鏈中IDEA的弱點而被攻破。實際上這是由于一種誤解:他們認為公匙加密生來就比傳統(tǒng)加密安全得多。實際上密碼分析專家計算過,窮舉128-bitIDEA密匙和分解3100-bitRSA密匙的工作量相當(dāng),而實際上1024-bit的RSA密匙已被認為是機密級的,而且1024-bit的純粹RSA加密要比128-bit的IDEA加密要慢4000多倍。RSA的長處在于它的易用性而不是它的堅固性,相反加密鏈的弱點不在IDEA上而是在RSA上。當(dāng)然這只是相對而言,我們馬上會看到RSA對直接攻擊的抵御也是足夠強的。
隨便提一句,在PGP的未來版本中將提供密匙長度為112-bit的TripleDES加密算法作為用戶選項。56-bit的標(biāo)準(zhǔn)DES密匙已經(jīng)被證明是可以攻破的。
◎RSA的安全性問題
先看看RSA的基本原理,我們知道RSA的保密性基于一個數(shù)學(xué)假設(shè):對一個很大的合數(shù)進行質(zhì)因數(shù)分解是不可能的。RSA用到的是兩個非常大的質(zhì)數(shù)的乘積,用目前的計算機水平是無法分解的。但是這說明不了什么,沒有“證明”RSA的安全性。這既不說明分解這個大數(shù)是攻擊RSA唯一的(或者說是最佳的)途徑,也不能證明這種分解真的那么困難。RSA有可能存在一些密碼學(xué)方面的缺陷,隨著數(shù)論的發(fā)展也許會找到一種耗時以多項式方式增長的分解算法。不過目前這還只是展望,甚至連發(fā)展的方向都還沒有找到。有三種事物的發(fā)展會威脅到RSA的安全性:分解技術(shù)、計算機能力的提高和計算機造價的降低。
特別是第一條對RSA的威脅最大,因為只要大數(shù)分解的問題不解決,做乘法總是比分解因數(shù)快得多,計算機能力強大了盡可以加長密匙來防御,因為那時加密也會快得多的。
RSA的密匙生成步驟可以分為七步:
-找到兩個大質(zhì)數(shù)p,q
-做乘法n=p*q
-選擇一個數(shù)e,滿足en,而且缺省的
e值為17,如果不行再用19,23等等。
●RSA的計時攻擊法
這是一種另辟蹊徑的方法。是由PaulKocher發(fā)表的。大家可以發(fā)現(xiàn),RSA的基本運算是乘方取模,這種運算的特點是耗費時間精確取決于乘方次數(shù)。這樣如果A能夠監(jiān)視到RSA解密的過程,并對它計時,他就能算出d來。細節(jié)我就不復(fù)述了。我想說的是如何抵御它。Rivest說,最簡單的方法就是使RSA在基本運算上花費均等的時間,而與操作數(shù)無關(guān)。其次在加密前對數(shù)據(jù)做一個變換(花費恒定時間),在解密端做逆變換,這樣總時間就不再依賴于操作數(shù)了。
至于PGP根本不用擔(dān)心計時攻擊,因為PGP采用了中國余數(shù)理論的方法加速了運算,同時也使耗時與操作數(shù)無關(guān)。同時計時攻擊對攻擊者資源的要求太高,實時監(jiān)視加密過程不是任何人都可能做到的。在這里提出這種攻擊是因為:雖然它目前還不實用,但從理論上是一個嶄新的思路,值得注意。
●其他對RSA的攻擊法
還有一些對RSA的攻擊,象公共模數(shù)攻擊。它是指幾個用戶公用一個模數(shù)n,各自有自己的e和d,在幾個用戶之間公用n會使攻擊者能夠不用分解n而恢復(fù)明文。但是PGP是不會在用戶之間公用模數(shù)的。
最后談?wù)凴SA密匙長度的問題,多長的密匙是安全的。專家指出,任何預(yù)言都是不理智的,就目前的計算機水平用1024-bits的密匙是安全的,2048-bits是絕對安全的。但是他們并不指望這個局面延續(xù)到下世紀(jì),他們只是指出:如果RSA象有些人說的那樣脆弱,就不可能從1977年一直保持到現(xiàn)在還沒有被攻破。
◎MD5的安全性問題
MD5是一種在PGP中被用來單向變換用戶口令和對信息簽名的單向散列算法。
一種單向散列的強度體現(xiàn)在它能把任意的輸入隨機化到什么程度并且能產(chǎn)生唯一的輸出。對單向散列的直接攻擊可以分為普通直接攻擊和“生日”攻擊。
●對MD5的普通直接攻擊
所謂直接攻擊又叫野蠻攻擊。攻擊者為了找到一份和原始明文m散列結(jié)果相同的明文m',就是H(m)=H(m')。普通直接攻擊,顧名思義就是窮舉可能的明文去產(chǎn)生一個和H(m)相同的散列結(jié)果。對MD5來說散列結(jié)果為128-bits,就是說如果攻擊者有一臺
每秒嘗試1,000,000,000條明文的機器需要算約10^22年,同時興許會同時發(fā)現(xiàn)m本身:))。
●對MD5的生日攻擊
生日攻擊實際上只是為了找到兩條能產(chǎn)生同樣散列結(jié)果的明文。記得那個有名的概率生日問題嗎?在N個人中至少有兩個人生日相同的概率是多少?所謂生日攻擊實際上只是用概率來指導(dǎo)散列沖突的發(fā)現(xiàn),對于MD5來說如果嘗試2^64條明文,那么它們之間至少有一對發(fā)生沖突的概率就是50%。僅此而已,對當(dāng)今的科技能力來說,它也是不可能的。一臺上面談到的機器平均需要運行585年才能找到一對,而且并不能馬上變成實際的攻擊成果。因為碼長和速度的關(guān)系,對crypt(3)的生日攻擊就成功得多。
●其他對MD5的攻擊
微分攻擊被證明對MD5的一次循環(huán)是有效的,但對全部4次循環(huán)無效。(微分攻擊是通過比較分析有特定區(qū)別的明文在通過加密后的變化傳播情況來攻擊加密體系的。)
有一種成功的MD5攻擊,不過它是對MD5代碼本身做了手腳,是一種crack而不是hack更算不上cryptanalysis了。而且如果你做了PGP發(fā)行包的簽名校驗,是容易發(fā)現(xiàn)代碼被替換過了的。
●口令長度和信息論
根據(jù)傳統(tǒng)信息論,英語的每個8-bits字母的信息熵為1.3bits。如果口令足夠長,MD5的結(jié)果就會足夠隨機。對128-bits的MD5輸出來說,一個長達98個字符的口令將給出一個隨機的密匙。
(8/1.3)*(128/8)=98.46chars
可是誰會用一個象下面這樣長的口令呢?
12345678901234567890123456789012345678901235678901234567890
1234567890123456789012345678
1.3bits的信息熵來自于英語語法的規(guī)律性這個事實,字母出現(xiàn)概率的不等造成了熵的減小。如果26個拉丁字母出現(xiàn)的概率均等,信息熵將會增至
log(26)/log(2)=4.7bits
這樣一個隨機密匙所需口令長度就減為27.23chars了,如果再加上大小寫和幾個符號還可以減少。關(guān)于選擇口令的問題可以參考任何關(guān)于安全性的書籍,它們都適用,上面是關(guān)于PGP本身特色的部分。
◎隨機數(shù)的安全性問題
PGP使用兩個偽隨機數(shù)發(fā)生器(PRNG),一個是ANSIX9.17發(fā)生器,另一個是從用戶擊鍵的時間和序列中計算熵值從而引入隨機性。ANSIX9.17PRNG使用IDEA而不是3DES來產(chǎn)生隨機數(shù)種子。Randseed.bin文件最初是利用用戶擊鍵信息產(chǎn)生的,每次加密前后都會引入新的隨機數(shù),而且隨機數(shù)種子本身也是加密存放的。
●ANSIX9.17PRNG
官方發(fā)布的ANSIX9.17標(biāo)準(zhǔn)使用的是TripleDES作為內(nèi)核,這個很容易改用IDEA實現(xiàn)。X9.17需要randseed.bin中的24bytes的隨機數(shù),PGP把其他384bytes用來存放其他信息。X19.7工作過程大致如下:
E()=IDEA加密函數(shù),使用一個可復(fù)用的密匙(使用明文產(chǎn)生)。
T=從randseed.bin文件中來的時間
V=初始化向量
R=生成的隨機密匙(用來加密一次PGP明文)
R=E[E(T)XORV]
下一次的初始化向量計算如下:
V=E[E(T)XORR]
●用戶擊鍵引入隨機性
這是真正的隨機數(shù),沒有什么好說的,只是盡量使擊鍵無規(guī)則就行。輸入的熵越大輸出的隨機數(shù)的熵就越大。
●X9.17用MD5進行預(yù)洗
所謂“洗”就是指象洗牌一樣把數(shù)據(jù)打亂,加密前叫預(yù)洗,加密后為下一次加密的準(zhǔn)備叫后洗。PGP的日常隨機數(shù)產(chǎn)生器X19.7是用明文的MD5值來預(yù)洗的,它基于攻擊者不知道明文這樣一個假設(shè)。如果攻擊者知道明文他就沒有太大必要去攻擊了,當(dāng)然也有這種可能,不過這只是會削弱一點PRNG的隨機性罷了。下面我們將看到還有后洗操作。
●randseed.bin的后洗操作
后洗操作被認為是更安全的。更多的隨機字節(jié)被用來重新初始化randseed.bin文件,它們被用當(dāng)前的隨機臨時PGP密匙來加密。同樣如果攻擊者知道這個密匙,他就不用攻擊randseed.bin文件,相反他更關(guān)心randseed.bin文件當(dāng)前的狀態(tài),因為可能從中獲得下次加密的部分信息。因此對randseed.bin文件的保護和公匙環(huán)及私匙環(huán)文件同樣重要。當(dāng)然,如果不是密碼專家這些文件都給他也沒事。