【文章內(nèi)容簡介】
PGP實際采用的方法是對候選奇數(shù)做費馬測試。費馬測試并不能確定它是否質(zhì)數(shù),但通過費馬測試以后的數(shù)不是質(zhì)數(shù)的概率微乎其微。下面是費馬測試的細節(jié): - 待測奇數(shù) n - 在質(zhì)數(shù)集合中依次選取一個質(zhì)數(shù) b ,b = 2,3,5,7...... - 計算 w = b^(n1) % n - 如果對于所有 b ,w都為1,n 很可能是質(zhì)數(shù)。否則 n 一定是合數(shù)。 取前四個質(zhì)數(shù)的測試稱為四階費馬測試,PGP采用的就是它。一階測試誤判的概率是 10^13 ,二階后是 10^26 ,作完四階測試后是 10^52。而且它絕對不會漏掉一個質(zhì)數(shù)。當然將合數(shù)誤判為質(zhì)數(shù)的可能性是存在的,這種能通過費馬測試的合數(shù)被稱為Carmichael 數(shù),象 561,1105,1729 等等。它們很稀少,在 10^9 范圍內(nèi)只有 255 個。 下面是幾種針對RSA有效的攻擊方法,它們實際上對PGP沒有效力,因為它們攻擊的是加密協(xié)議環(huán)節(jié)上的漏洞,而不是RSA本身的。從這些例子可以看到PGP是如何在實現(xiàn)上堵住這些漏洞的?!?選擇密文攻擊 由于RSA密文是通過公開渠道傳播的,攻擊者可以獲取密文。我們假設(shè)攻擊者為A,密文收件人為T,A得到了發(fā)往T的一份密文c,他想不通過分解質(zhì)因數(shù)的方法得到明文。換句話說,他需要 m = c^d 。 為了恢復(fù) m,他找一個隨機數(shù) r , r n,當然他有T的公匙(e,n)。他計算: x=r^e % n (用 T 的公匙加密 r) y=x*c % n (將臨時密文x與c相乘) t=r^1 % n A 知道RSA具有下面的一個特性: 如果 x=r^e % n,那么 r=x^d % n 因此他想辦法讓T對 y 用T自己的私匙簽名(實際上就是把 y 解密了),然后將結(jié)果 u=y^d % n 寄回給A。A只要簡單地計算: m = t*u % n 上面結(jié)論的推導(dǎo)是這樣的: t*u % n = (r^1)*(y^d) amp。 n = (r^1)*(x^d)(c^d) % n = (c^d) % n = m 要防止這種攻擊的辦法就是不要對外來的隨機信息簽名,或者只對信息的MD5特征值簽名。在這里就很容易明白為什么要強調(diào)MD5的單向性了,因為MD5的結(jié)果是不能預(yù)定的,就是說A難以湊出一份剛好能產(chǎn)生 y 這樣的MD5特征值的明文來讓T簽名。● 過小的加密指數(shù) e 看起來,e 是一個小數(shù)并不降低RSA的安全性。從計算速度考慮,e 越小越好??墒?,當明文也是一個很小的數(shù)時就會出現(xiàn)問題。例如我們?nèi)?e=3 ,而且我們的明文 m比 n 的三次方根要小,那么密文 c = m^e % n 就會等于 m^3。這樣只要對密文開三次方就可以得到明文。PGP對這個漏洞的處理是在明文上加上一個隨機數(shù),這樣保證 m n ,而且缺省的e 值為17,如果不行再用19,23 等等。● RSA的計時攻擊法 這是一種另辟蹊徑的方法。是由 Paul Kocher 發(fā)表的。大家可以發(fā)現(xiàn),RSA的基本運算是乘方取模,這種運算的特點是耗費時間精確取決于乘方次數(shù)。這樣如果 A 能夠監(jiān)視到RSA解密的過程,并對它計時,他就能算出d來。細節(jié)我就不復(fù)述了。我想說的是如何抵御它。Rivest說,最簡單的方法就是使RSA在基本運算上花費均等的時間,而與操作數(shù)無關(guān)。其次在加密前對數(shù)據(jù)做一個變換(花費恒定時間),在解密端做逆變換,這樣總時間就不再依賴于操作數(shù)了。至于PGP根本不用擔心計時攻擊,因為PGP采用了中國余數(shù)理論的方法加速了運算,同時也使耗時與操作數(shù)無關(guān)。同時計時攻擊對攻擊者資源的要求太高,實時監(jiān)視加密過程不是任何人都可能做到的。在這里提出這種攻擊是因為:雖然它目前還不實用,但從理論上是一個嶄新的思路,值得注意?!?其他對RSA的攻擊法 還有一些對RSA的攻擊,象公共模數(shù)攻擊。它是指幾個用戶公用一個模數(shù) n ,各自有自己的 e 和 d,在幾個用戶之間公用 n 會使攻擊者能夠不用分解 n 而恢復(fù)明文。但是PGP是不會在用戶之間公用模數(shù)的。最后談?wù)凴SA密匙長度的問題,多長的密匙是安全的。專家指出,任何預(yù)言都是不理智的,就目前的計算機水平用1024bits的密匙是安全的,2048bits是絕對安全的。但是他們并不指望這個局面延續(xù)到下世紀,他們只是指出:如果RSA象有些人說的那樣脆弱,就不可能從1977年一直保持到現(xiàn)在還沒有被攻破。◎ MD5 的安全性問題 MD5是一種在PGP中被用來單向變換用戶口令和對信息簽名的單向散列算法。一種單向散列的強度體現(xiàn)在它能把任意的輸入隨機化到什么程度并且能產(chǎn)生唯一的輸出。對單向散列的直接攻擊可以分為普通直接攻擊和“生日”攻擊。● 對MD5的普通直接攻擊所謂直接攻擊又叫野蠻攻擊。攻擊者為了找到一份和原始明文 m 散列結(jié)果相同的明文 m39。 ,就是 H(m)=H(m39。) 。普通直接攻擊,顧名思義就是窮舉可能的明文去產(chǎn)生一個和 H(m) 相同的散列結(jié)果。對MD5來說散列結(jié)果為128bits,就是說如果攻擊者有一臺每秒嘗試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%。僅此而已,對當今的科技能力來說,它也是不可能的。一臺上面談到的機器平均需要運行585年才能找到一對,而且并不能馬上變成實際的攻擊成果。因為碼長和速度的關(guān)系,對crypt(3)的生日