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