安全程序的使用不能保證你的通信就是安全的。就算你在房子前門安裝一個最安全的鎖,小偷仍然可以從開著的窗戶爬進來。同樣,即使使用了PGP,你的計算機也仍可能很脆弱。
有許多有名的對PGP的攻擊;下面的部分就介紹這些攻擊。然而,這些決不是一個完整的清單。將來的攻擊很可能會攻破所有的公鑰加密技術。這份清單只是讓你了解一下保護通信時需要做些什么。
1.蠻力攻擊
對PGP最直接的攻擊是蠻力攻擊使用的密鑰。因為PGP 2.6.2使用的兩個加密算法,所以要看看這兩個算法的安全性。對于公鑰加密技術,PGP使用RSA算法;對于私鑰加密技術,它使用IDEA。
(1)蠻力攻擊RSA密鑰
對于RSA密鑰,已知最好的蠻力攻擊是分解它們。RSA密鑰產生時就使得它們難于分解。而且,分解大的數仍然是一門很新的藝術。
最近,最大的一個被分解的RSA密鑰是RSA-129,它于1994年4月被分解。RSA-129是在設計RSA算法時于1977年創建的原始RSA提問。它是一個129位的十進制RSA密鑰,相當于425位。分解這個數動員了全世界范圍的力量,使用了1600臺計算機,實際耗費時間超過8個月。
它處理了4600MIPS年的數據;1MIPS年是1MIPS的機器一年所能處理的數據量。例如,一個Pentium 100大約是125MIPS(根據Intel)。如果一個Pentium 100機器為解決一個問題一年時間不停地運行,它就貢獻了125MIPS年。按照這種速度,一臺機器要花37年才能破解RSA-129。如果使用100臺機器,只需要4個月就能破譯這個代碼,只是實際項目一半的時間。
當前,PGP 2.6.2 版使用從512到2048位的密鑰。密鑰越大,分解越困難。同時,增加密鑰長度也會增加使用密鑰的時間。從日期來說,據認為一個512位的密鑰能夠給予1年的安全性;訪問100臺Pentium 100機器要花至少一年才能破譯出512位的RSA密鑰。如果這是真的,那么一個1024位的密鑰,若使用今天最新的算法,假設在技術上沒有提高的話,在以后10000年都是安全的。如果技術上有所提高,需要的時間就會少些。然而,看起來技術可能一直在進展。
(2)蠻力攻擊IDEA密鑰
現在還沒聽說有人攻擊IDEA密鑰。最好是嘗試2^128或3.4×10^38個密鑰。由于完成這一測試的困難性,嘗試破譯PGP中用于加密IDEA密鑰的RSA密鑰更容易。據估計破譯IDEA的困難如同分解3000位RSA密鑰的困難相當。
--------------------------------------------------------------------------------
2.私鑰和通過短語
PGP私鑰環的安全性基于兩件事:對私鑰環數據的訪問和對用于加密每個私鑰的通過短語的了解。使用私鑰要擁有這兩部分。然而,這也引起了許多攻擊。
如果PGP用于多用戶系統中,就可能訪問私鑰環。通過緩存文件,網絡窺視或者許多其他的攻擊,可以利用監視網絡或者讀取磁盤得到私鑰環。這樣就只剩下通過短語用來保護私鑰環中的數據了,這就意味著只要獲得通過短語就能攻破PGP的安全。
而且,在一個多用戶系統中,鍵盤和CPU之間的鏈路可能是不安全的。如果有人能夠物理上訪問連接用戶鍵盤和主機的網絡,監視擊鍵是很容易的。例如,用戶可能從一群公共的客戶終端上登錄,這時就可以窺探連接網絡得到通過短語。另外,用戶還可能通過調制解調器拔叫,在這種情況下竊賊就可以監聽鍵盤擊鍵。在任何一種情況下,在一個多用戶的機器
上運行PGP都是不安全的。
當然,運行PGP最安全的方法是在一臺沒有其他人使用而且不連網的個人機上運行;也就是說,一臺膝上型或家庭計算機。用戶必須在安全環境的代價和安全通信的代價之間找到一種平衡。使用PGP的推薦方法是:總是在安全環境下的安全機器上動用,這樣用戶就可以控制整個機器。
最好的安全性關鍵在于鍵盤和CPU之間的連接是安全的。這既可以通過加密來完成,或者更好一點通過直接、無中斷的連接實現。工作站、PC、Mac、膝上型機器都屬于安全的機器。
安全的環境更難于顯示,這里沒有加以探討。
--------------------------------------------------------------------------------
3.對公鑰環的攻擊
由于公鑰環(公有密鑰環)的重要性和對它的依賴性,PGP受到許多針對密鑰環的攻擊。首先,只有當密鑰環改變時才被檢查。當添加新的密鑰或簽名時,PGP驗證它們。然而,它會標記密鑰環中已檢查過的簽名,這樣就不會再去驗證它們。如果有人修改了密鑰環,并且設置了簽名中相應的位,就不會被檢查出來。
對PGP密鑰環的另一種攻擊集中于PGP使用的進程,它對密鑰有效性設置1位。當到達一個密鑰的新簽名時,PGP就使用前面描述過的信任網絡值計算該密鑰的有效位。然后PGP在公有密鑰環中緩存這個有效位。一個攻擊者可能會在密鑰環中修改這位,從而迫使得用戶相信一個無效密鑰是有效的。例如,通過設置這個標志,攻擊者能夠使得用戶相信一個密鑰屬于Alice,盡管沒有足夠的簽名證明這個密鑰的有效性。
也可能發生對PGP公鑰環的另一種攻擊,因為作為介紹人的密鑰信任也緩存在公有密鑰環中。這個值定義密鑰的簽名有多少信任度,因此如果使用帶有無效參數的密鑰簽名就可能使PGP把無效密鑰作為有效密鑰接受。如果一個密鑰被修改為完全受托的介紹人,那么用這個密鑰簽名的任何密鑰都被信任為有效的。因此,一個攻擊者如果用一個修改過的密鑰為另一個密鑰簽名,就會使得用戶相信它是有效的。
公鑰環最大的問題是所有這些位不僅在公鑰環中緩存,而且密鑰環中沒有任何保護。
讀過PGP源代碼而且能夠訪問公鑰環的任何人都可以使用一個二進制文件編輯器修改任何一位,而密鑰環的所有者卻無法注意到這個修改。幸運的是,PGP提供一種方法重新檢查密鑰環中的密鑰。通過聯合使 -kc 和 -km 選項,用戶可告訴PGP執行對整個密鑰環的密鑰維護。
前一個選項告訴PGP檢查密鑰和簽名。PGP會查看整個密鑰環,重新檢查每一個簽名。當檢查了所有簽名之后,PGP將執行一個維護性檢查(-km),重新計算所有密鑰的有效性。
不幸的是,沒有一種辦法能夠完全重新檢查密鑰中的所有信任字節。這是一個漏洞。應當有一個命令告訴PGP忽略所有信任字節,從終極密鑰,即私鑰環中的密鑰,向用戶詢問信任性。
或許PGP將來的版本會改正這個問題。如果一個密鑰被改成是可信任的介紹人,你沒有辦法找到修改之處并改正它。運行密鑰和維護檢查只能恢復密鑰的有效性,但不是信任值。只有對一個密鑰運行PGP -ke才能編輯信任參數,而這不能自動完成。
--------------------------------------------------------------------------------
4.程序的安全性
如果有人能夠訪問PGP程序的二進制文件,他就可以改變它,讓它做他想做的任何事。
如果這個介入者能夠從你的鼻子底下替換你的PGP二進制文件,你對PGP的信任就建立在你對這個人的信任和你實際驗證這個程序的能力上。例如,一個能夠進行這種訪問的攻擊者可能會改變PGP,使得它總是驗證簽名,甚至簽名是無效的。PGP可能被修改,總是向NSA發送所有消息的純文本復制。這些攻擊很難檢測,而且難于對付。PGP需要成為受托代碼基礎的一部分;如果你不信任你的PGP二進制文件,那就不要信任它的輸出。
相信PGP二進制文件最好的辦法就是自己從源代碼建立它。然而,這并不總是可能的。
其他辦法包括在它建立時監視它或者從一個受托的來源得到它。查看二進制文件的大小和日期很有幫助。使用其他受托的程序,像md5sum能有所幫助。但這只是把問題壓到了另一層。如果你不信任PGP程序,就沒有太多做的了。
--------------------------------------------------------------------------------
5.對PGP的其他攻擊
對PGP可能還有其他攻擊,但是這里不做討論。從來沒有證明過PGP使用的加密算法是安全的。PGP所使用的數學雖然被認為是安全的,但是有可能很容易攻破。對RSA的分解攻擊可能得到改進、或者有人可能在IDEA中找到一個漏洞。
要想知道什么安全、什么不安全,對密碼技術所運用的數學知識了解得還不夠。實際上,據知任何事都不是完全安全的,如果有足夠的計算能力,任何形式的密碼技術都可以攻破。
問題是破譯代碼所花費的時間和精力與被保護的數據價值相比是否值得。注意破譯代碼所花費的力量將隨著時間不斷地減少,因為計算機的能力不斷增強,而價格不斷地下降。到現在為止,密碼專家仍然超前于破譯者。