PGP是一個基于RSA公匙加密體系的郵件加密軟件。可以用它對你的郵件保密以防止非授權者閱讀,它還能對你的郵件加上數字簽名從而使收信人可以確信郵件是你發來的。它讓你可以安全地和你從未見過的人們通訊,事先并不需要任何保密的渠道用來傳遞密匙。它采用了:審慎的密匙管理,一種RSA和傳統加密的雜合算法,用于數字簽名的郵件文摘算法,加密前壓縮等,還有一個良好的人機工程設計。它的功能強大有很快的速度。而且它的源代碼是免費的。
實際上PGP的功能還不止上面說的:;PGP可以用來加密文件,還可以用PGP代替UUencode;生成;RADIX;64;格式(就是MIME;的;BASE;64格式)的編碼文件。
PGP;的創始人是美國的;Phil;Zimmermann。他的創造性在于他把RSA公匙體系的方便和傳統加密體系的高速度結合起來,并且在數字簽名和密匙認證管理機制上有巧妙的設計。因此PGP成為幾乎最流行的公匙加密軟件包。
PGP是一種供大眾使用的加密軟件。加密是為了安全,私密權是一種基本人權。在現代社會里,電子郵件和網絡上的文件傳輸已經成為生活的一部分。郵件的安全問題就日益突出了,大家都知道在Internet上傳輸的數據是不加密的。如果你自己不保護自己的信息,第三者就會輕易獲得你的隱秘。;還有一個問題就是信息認證,如何讓收信人確信郵件沒有被第三者篡改,就需要數字簽名技術。RSA公匙體系的特點使它非常適合用來滿足上述兩個要求:
保密性(Privacy)和認證性(Authentication)。
RSA(Rivest-Shamir-Adleman)算法是一種基于大數不可能質因數分解假設的公匙體系。簡單地說就是找兩個很大的質數,一個公開給世界,一個不告訴任何人。一個稱為“公匙”,另一個叫“私匙”(Public;key;&;Secretkey;or;Private;key)。這兩個密匙是互補的,就是說用公匙加密的密文可以用私匙解密,反過來也一樣。假設甲要寄信給乙,他們互相知道對方的公匙。甲就用乙的公匙加密郵件寄出,乙收到后就可以用自己的私匙解密出甲的原文。由于沒別人知道乙的私匙所以即使是甲本人也無法解密那封信,這就解決了信件保密的問題。另一方面由于每個人都知道乙的公匙,他們都可以給乙發信,那么乙就無法確信是不是甲的來信。認證的問題就出現了,這時候數字簽名就有用了。
在說明數字簽名前先要解釋一下什么是“郵件文摘”(message;digest),單地講就是對一封郵件用某種算法算出一個能體現這封郵件“精華”的數來,一旦郵件有任何改變這個數都會變化,那么這個數加上作者的名字(實際上在作者的密匙里)還有日期等等,就可以作為一個簽名了。確切地說PGP是用一個128位的二進制數作為“郵件文摘”的,用來產生它的算法叫MD5(message;digest;5),MD5的提出者是Ron;Rivest,PGP中使用的代碼是由Colin;Plumb編寫的,MD5本身是公用軟件。所以PGP的法律條款中沒有提到它。MD5是一種單向散列算法,它不像CRC校驗碼,很難找到一份替代的郵件而與原件具有一樣的“精華”。
回到數字簽名上來,甲用自己的私匙將上述的128位的“精華”加密,附加在郵件上,再用乙的公匙將整個郵件加密。這樣這份密文被乙收到以后,乙用自己的私匙將郵件解密,得到甲的原文和簽名,乙的PGP也從原文計算出一個128位的 “精華”來再用甲的公匙解密簽名得到的數比較,如果符合就說明這份郵件確實是甲寄來的。這樣兩個要求都得到了滿足。
PGP還可以只簽名而不加密,這適用于公開發表聲明時,聲明人為了證實自己的身份(在網絡上只能如此了),可以用自己的私匙簽名。這樣就可以讓收件人能確認發信人的身份,也可以防止發信人抵賴自己的聲明。這一點在商業領域有很大的應用前途,它可以防止發信人抵賴和信件被途中篡改。
那么為什么說PGP用的是RSA和傳統加密的雜合算法呢?因為RSA算法計算量極大在速度上不適合加密大量數據,所以PGP實際上用來加密的不是RSA本身,而是采用了一種叫IDEA的傳統加密算法。我先解釋一下什么叫傳統加密,簡單地說就是用一個密匙加密明文,然后用同樣的密匙解密。這種方法的代表是DES(US;Fed eral;DataEncryption;Standard),也就是乘法加密,它的主要缺點就是密匙的傳遞渠道解決不了安全性問題,不適合網絡環境郵件加密需要。
IDEA;是一個有專利的算法,專利持有者是ETH和一個瑞士公司:Ascom-Tech;AG。
非商業用途的IDEA實現不用向他們交納費用。IDEA的加(解)密速度比RSA快得多,所以實際上PGP是用一個隨機生成密匙(每次加密不同)用IDEA算法對明文加密,然后用RSA算法對該密匙加密。這樣收件人同樣是用RSA解密出這個隨機密匙,再用IDEA解密郵件本身。這樣的鏈式加密就做到了既有RSA體系的保密性,又有IDEA算法的快捷性。PGP的創意有一半就在這一點上了,為什么RSA體系70年代就提出來,一直沒有推廣應用呢?速度太慢!那么PGP創意的另一半在哪兒呢?下面我再談PGP的密匙管理。
一個成熟的加密體系必然要有一個成熟的密匙管理機制配套。公匙體制的提出就是為了解決傳統加密體系的密匙分配難保密的缺點。比如網絡hacker們常用的手段之一就是“監聽”,如果密匙是通過網絡傳送就太危險了。舉個例子:NovellNetware;的老版本中,用戶的密碼是以明文在線路中傳輸的,這樣監聽者輕易就獲得了他人的密碼。當然;Netware;4.1;中數據包頭的用戶密碼現在是加密的了。對PGP來說公匙本來就要公開,就沒有防監聽的問題。但公匙的發布中仍然存在安全性問題,例如公匙的被篡改(Public;Key;Tampering),這可能是公匙密碼體系中最大的漏洞,因為大多數新手不能很快發現這一點。你必須確信你拿到的公匙屬于它看上去屬于的那個人。為了把這個問題說清楚,我舉個例子,然后再說如何正確地用PGP堵住這個漏洞。
以你和Alice的通信為例,假設你想給Alice發封信,那你必須有Alice的公匙,你從BBS上下載了Alice的公匙,并用它加密了信件用BBS的Email功能發給了Alice。不幸地,你和Alice都不知道,另一個用戶叫Charlie的用戶潛入BBS,把他自己用Alice的名字生成的密匙對中的公匙替換了Alice的公匙。那你用來發信的公匙就不是Alice的而是Charlie的,一切看來都很正常,因為你拿到的公匙的用戶名是“Alice”。于是Charlie就可以用他手中的私匙來解密你給Alice的信,甚至他還可以用Alice真正的公匙來轉發你給Alice的信,這樣誰都不會起疑心,他如果想改動你給Alice的信也沒問題。更有甚者,他還可以偽造Alice的簽名給你或
其他人發信,因為你們手中的公匙是偽造的,你們會以為真是Alice的來信。
防止這種情況出現的最好辦法是避免讓任何其他人有機會篡改公匙,比如直接從Alice手中得到她的公匙,然而當她在千里之外或無法見到時,這是很困難的。PGP發展了一種公匙介紹機制來解決這個問題。舉例來說:如果你和Alice有一個共同的朋友David,而David知道他手中的Alice的公匙是正確的(關于如何認證公匙,PGP還有一種方法,后面會談到,這里假設David已經和Alice認證過她的公匙)。這樣David可以用他自己的私匙在Alice的公匙上簽名(就是用上面講的簽名方法),表示他擔保這個公匙屬于Alice。當然你需要用David的公匙來校驗他給你的Alice的公匙,同樣David也可以向Alice認證你的公匙,這樣David就成為你和Alice之間的“介紹人”。這樣Alice或David就可以放心地把David簽過字的Alice的公匙上載到BBS上讓你去拿,沒人可能去篡改它而不被你發現,即使是BBS的管理員。 這就是從公共渠道傳遞公匙的安全手段。
有人會問:那你怎么安全地得到David的公匙呢,這不是個先有雞還是先有蛋的問題嗎?確實有可能你拿到的David的公匙也是假的,但這就要求這個搗蛋者參與這整個過程,他必須對你們三人都很熟悉,還要策劃很久,這一般不可能。當然,PGP對這種可能也有預防的建議,那就是由一個大家普遍信任的人或機構擔當這個角色。他被稱為“密匙侍者”或“認證權威”,每個由他簽字的公匙都被認為是真的,這樣大家只要有一份他的公匙就行了,認證這個人的公匙是方便的,因為他廣泛提供這個服務,假冒他的公匙是很極困難的,因為他的公匙流傳廣泛。 這樣的“權威”適合由非個人控制組織或政府機構充當,現在已經有等級認證制度的機構存在。
對于那些非常分散的人們,PGP更贊成使用私人方式的密匙轉介方式,因為這樣有機的非官方更能反映出人們自然的社會交往,而且人們也能自由地選擇信任的人來介紹。總之和不認識的人們見面一樣。每個公匙有至少一個“用戶名”(User;ID),請盡量用自己的全名,最好再加上本人的Email地址,以免混淆。
注意!你所必須遵循的一條規則是:在你使用任何一個公匙之前,一定要首先認證它!!!無論你受到什么誘惑,當然會有這種誘惑,你都不要,絕對不要, 直接信任一個從公共渠道(由其是那些看起來保密的)得來的公匙,記得要用熟人介紹的公匙,或者自己與對方親自認證。同樣你也不要隨便為別人簽字認證他們的公匙,就和你在現實生活中一樣,家里的房門鑰匙你是只會交給信任的人的。
下面,我講講如何通過電話認證密匙。每個密匙有它們自己的標識(keyID),keyID是一個八位十六進制數,兩個密匙具有相同keyID的可能性是幾十億分之一,
而且PGP還提供了一種更可靠的標識密匙的方法:“密匙指紋”(key"s;fingerprint)。每個密匙對應一串數字(十六個八位十六進制數),這個數字重復的可能就更微乎其微了。而且任何人無法指定生成一個具有某個指紋的密匙,密匙是隨機生成的,從指紋也無法反推出密匙來。這樣你拿到某人的公匙后就可以和他在電話上核對這個指紋,從而認證他的公匙。如果你無法和Alice通電話的話,你可以和David通電話認證David的公匙,從而通過David認證了Alice的公匙,這就是直接認證和間接介紹的結合。
這樣又引出一種方法,就是把具不同人簽名的自己的公匙收集在一起,發送到公共場合,這樣可以希望大部分人至少認識其中一個人,從而間接認證了你的公匙。同樣你簽了朋友的公匙后應該寄回給他,這樣就可以讓他可以通過你被你其他朋友認證。有點意思吧,和現實社會中人們的交往一樣。PGP會自動為你找出你拿到的公匙中有哪些是你的朋友介紹來的,那些是你朋友的朋友介紹來的,哪些則是朋友的朋友的朋友介紹的……它會幫你把它們分為不同的信任級別,讓你參考決定對它們的信任程度。你可以指定某人有幾層轉介公匙的能力,這種能力是隨著認證的傳遞而遞減的。
轉介認證機制具有傳遞性,這是個有趣的問題。PGP的作者Phil;Zimmermann。
有句話:;“;信賴不具有傳遞性;我有個我相信決不撒謊的朋友。可是他是個認定總統不撒謊的傻瓜,可很顯然我并不認為總統決不撒謊。”
關于公匙的安全性問題是PGP安全的核心,我在這里就不細說了。和傳統單密匙體系一樣,私匙的保密也是決定性的。相對公匙而言,私匙不存在被篡改的問題,但存在泄露的問題。RSA的私匙是很長的一個數字,用戶不可能將它記住,PGP的辦法是讓用戶為隨機生成的RSA私匙指定一個口令(pass;phase)。只有通過給出口令才能將私匙釋放出來使用,用口令加密私匙的方法保密程度和PGP本身是一樣的。所以私匙的安全性問題實際上首先是對用戶口令的保密。當然私匙文件本身失密也很危險,因為破譯者所需要的只是用窮舉法試探出你的口令了,雖說很困難但畢竟是損失了一層安全性。在這里只用簡單地記住一點,要像任何隱私一樣保藏你的私匙,不要讓任何人有機會接觸到它。
PGP在安全性問題上的精心考慮體現在PGP的各個環節。比如每次加密的實際密匙是個隨機數,大家都知道計算機是無法產生真正的隨機數的。PGP程序對隨機數的產生是很審慎的,關鍵的隨機數像RSA密匙的產生是從用戶瞧鍵盤的時間間隔上取得隨機數種子的。對于磁盤上的;randseed.bin;文件是采用和郵件同樣強度的加密的。這有效地防止了他人從你的randseed.bin文件中分析出你的加密實際密匙的規律來。
在這里我提一下PGP的加密前預壓縮處理,PGP內核使用PKZIP算法來壓縮加密前的明文。一方面對電子郵件而言,壓縮后加密再經過7bits編碼密文有可能比明文更短,這就節省了網絡傳輸的時間。另一方面,明文經過壓縮,實際上相當于經過一次變換,信息更加雜亂無章,對明文攻擊的抵御能力更強。PGP中使用的PKZIP算法是經過原作者同意的。PKZIP算法是一個公認的壓縮率和壓縮速度都相當
好的壓縮算法。在PGP中使用的是PKZIP;2.0版本兼容的算法。
好了,關于PGP安全性的問題我會在《PGP的安全性》一文中專門介紹。我上面講了這么多只是為了讓大家知道PGP會是非常安全的,只要你自己遵循正確的使用方法。關于PGP的安裝和使用請參考《PGP;2.6.3i的安裝與使用》一文。如果在看英文文檔時有些不太明白的詞匯,請試試能不能從《PGP名詞解釋》一文中找到線索。PGP;2.6.3i是我推薦大家使用的PGP版本,有關這個版本的詳細問題請參見《PGPi;問答集》一文。
在今天的Internet上隨處可見用PGP簽名的文章,PGP的版本也在飛快地更新,據說PGP;3.0;再有幾個月就要推出了。世界上越來越多的人們在使用PGP,我們中國人也應該重視保護自己合法的私密權。我翻譯整理這幾篇文章就是為了在國內宣傳推廣PGP的使用。盡管它還是個新生事物,可是我們要看到在網際空間(CyberSpace)中它肯定能迅速成長起來,中國雖然起步晚,但比美國也差不太多,我們應該迎頭趕上。