[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 加密與破解 > 正文
PGP 簡介
本文出自: 作者:Loking (2001-06-25 19:00:01)
    本文主要介紹一些關PGP實現的原理和背景知識。其他關PGP的安裝、使用等

請參考與本文同時提供的其他文檔。

    PGPPretty Good Privacy,是一個基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 & Secret key or Private key)。

這兩個密匙是互補的,就是說用公匙加密的密文可以用私匙解密,反過來也一樣。假

設甲要寄信給乙,他們互相知道對方的公匙。甲就用乙的公匙加密郵件寄出,乙收到

就可以用自己的私匙解密出甲的原文。由沒別人知道乙的私匙所以即使是甲本人

也無法解密那封信,這就解決了信件保密的問題。另一方面由每個人都知道乙的公

匙,他們都可以給乙發信,那乙就無法確信是不是甲的來信。認証的問題就出現了,

這時候數字簽名就有用了。


    在說明數字簽名前先要解釋一下什是“郵件文摘”(message digest),簡單

地講就是對一封郵件用某種算法算出一個最能體現這封郵件特征的數來,一旦郵件

有任何改變這個數都會變化,那這個數加上作者的名字(實際上在作者的密匙裡)

還有日期等等,就可以作為一個簽名了。確切地說PGP是用一個128位的二進制數作

為“郵件文摘”的,用來產生它的算法叫MD5(message digest 5),MD5的提出者是

Ron Rivest,PGP中使用的代碼是由Colin Plumb 編寫的,MD5本身是公用軟件。所以

PGP的法律條款中沒有提到它。MD5是一種單向散列算法,它不像CRC校驗碼,很難找

到一份替代的郵件與原件具有同樣的MD5特征值。


    回到數字簽名上來,甲用自己的私匙將上述的128位的特征值加密,附加在郵

件,再用乙的公匙將整個郵件加密。(注意這裡的次序,如果先加密再簽名的話,

別人可以將簽名去掉簽上自己的簽名,從而篡改了簽名)。這樣這份密文被乙收到

以,乙用自己的私匙將郵件解密,得到甲的原文和簽名,乙的PGP也從原文計算出

一個128位的特征值來和用甲的公匙解密簽名所得到的數比較,如果符合就說明這份

郵件確實是甲寄來的。這樣兩個安全性要求都得到了滿足。


    PGP還可以只簽名而不加密,這適用公開發表聲明時,聲明人為了証實自己的

身份(在網絡上只能如此了),可以用自己的私匙簽名。這樣就可以讓收件人能確認

發信人的身份,也可以防止發信人抵賴自己的聲明。這一點在商業領域有很大的應用

前途,它可以防止發信人抵賴和信件被途中篡改。


    那為什說PGP用的是RSA和傳統加密的雜合算法呢?因為RSA算法計算量極大

在速度上不適合加密大量數據,所以PGP實際上用來加密的不是RSA本身,而是採用

了一種叫IDEA的傳統加密算法。我先解釋一下什叫傳統加密,簡單地說就是用一個

密匙加密明文,然用同樣的密匙解密。這種方法的代表是DES(US Federal Data

Encryption Standard),也就是乘法加密,它的主要缺點就是密匙的傳遞渠道解決

不了安全性問題,不適合網絡環境郵件加密需要。IDEA是一個有專利的算法,專利

持有者是ETH和一個瑞士公司:Ascom-Tech AG。非商業用途的IDEA實現不用向他們

交納費用。IDEA的加(解)密速度比RSA快得多,所以實際上PGP是以一個隨機生成

密匙(每次加密不同)用IDEA算法對明文加密,然用RSA算法對該密匙加密。這樣

收件人同樣是用RSA解密出這個隨機密匙,再用IDEA解密郵件本身。這樣的鏈式加密

就做到了既有RSA體系的保密性,又有IDEA算法的快捷性。PGP的創意有一半就在這

一點上了,為什RSA體系70年代就提出來,一直沒有推廣應用呢?速度太慢!那

PGP創意的另一半在哪兒呢?下面我再談PGP的密匙管理。


    一個成熟的加密體系必然要有一個成熟的密匙管理機制配套。公匙體制的提出

就是為了解決傳統加密體系的密匙分配過程難以保密的缺點。比如網絡hacker們常

用的手段之一就是“監聽”,如果密匙是通過網絡傳送就太危險了。舉個例子:

Novell  Netware 的老版本中,用戶的密碼是以明文在線路中傳輸的,這樣監聽者

輕易就獲得了他人的密碼。當然 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)中它肯定能

迅速成長起來,中國雖然起步晚,但比美國也差不太多,我們應該迎頭趕上。


×××××××××××××××××××××××××××××××××××××××

    這篇《PGP 簡介》與《PGP 2.6.3i的安裝與使用》、《PGP 名詞解釋》、《PGPi

問答集》還有《PGP的安全性》,是我在參考PGP內附的文檔和一些關PGP安全性的

文章寫的。我只是一個一般計算機愛好者,拿到PGP覺得很不錯,希望大家都能夠

利用上它,就利用考試回家前這段時間寫了這些東西。由我水平太低,時間又很

倉促,肯定有不少錯誤。只是覺得咱們大陸也應該有這類數據安全的軟件產品讓大家

使用,而英文的東西又不利推廣,就硬著頭皮翻譯了,可是又沒時間全部翻譯PGP的

文檔,只好就自己的理解寫了一些,太雜亂了,沒什頭緒,大家先湊合看吧。我還

想等有時間再翻譯PGP的全部文檔,希望大家多多指教,好讓我少犯錯誤。

                                                 Loking
                                               01/22/1997
×××××××××××××××××××××××××××××××××××××××
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★