PGP的安全問題分析
來源:互聯網
上載者:User
關鍵字
安全
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可是誰會用一個象下面這樣長的口令呢? 1234567890123456789012345678901234567890123567890123456789012345678901234567890123456781.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檔的保護和公匙環及私匙環檔同樣重要。 當然,如果不是密碼專家這些檔都給他也沒事。 給力(0票)動心(0票)廢話(0票)專業(0票)標題党(0票)路過(0票) 原文:PGP的安全問題分析 返回網路安全首頁