OpenPGP

**PGP**（英語：Pretty Good Privacy，直譯：**優良保密協定**）是一套用於訊息加密、驗證的應用程式。

PGP 的主要開發者是菲爾・齊默曼。齊默曼於 1991 年將 PGP 在網際網路上免費發布。PGP 本身是商業應用程式；開源並具有同類功能的工具名為 GnuPG（GPG）。PGP 及其同類產品均遵守 OpenPGP 資料加解密標準（RFC 4880）。

## PGP 加密如何工作

PGP 加密由一系列雜湊、資料壓縮、對稱金鑰加密，以及公鑰加密的演算法組合而成。每個步驟均支援幾種演算法，使用者可以選擇一個使用。每個公鑰均繫結一個使用者名稱和 / 或者 E-mail 位址。該系統的最初版本通常稱為可信網或 X.509 系統；X.509 系統使用的是基於數位憑證認證機構的分層方案，該方案後來被加入到 PGP 的實現中。當前的 PGP 加密版本通過一個自動金鑰管理伺服器來進行金鑰的可靠存放。

### 相容性

隨著 PGP 的發展，支援更新功能和演算法的版本能夠建立舊 PGP 系統無法解密的加密訊息，即使使用有效的私鑰也是如此。因此，PGP 通信中的夥伴必須了解彼此的能力或至少就 PGP 設定達成一致。

### 機密性

PGP 可用於傳送機密訊息。為此，PGP 結合了對稱金鑰加密和公鑰加密。PGP 使用對稱加密演算法對訊息進行加密，該演算法需要對稱金鑰。每個對稱金鑰也稱為對談金鑰僅被使用一次。訊息及其對談金鑰被傳送到接收方。 對談金鑰必須被傳送給接收方以解密訊息，但是為了在傳輸過程中保護它，它使用接收方的公鑰進行加密。只有屬於接收方的私鑰才能解密對談金鑰。

### 數位簽章

PGP 支援訊息身分認證和完整性檢查。後者被用來檢查訊息在傳輸過程中是否被修改過（即驗證**訊息完整性**），而訊息身分認證則是被用來決定訊息是否由聲稱為傳送者的個人或實體發出（即數位簽章驗證）。由於訊息的內容是加密的，因此更改任何訊息中的內容都將導緻密鑰解密失敗。在 PGP 中，這些特性預設是和訊息加密同時開啟的，而且同樣可以被應用到明文的驗證。傳送者只需使用 PGP 為訊息建立一個數位簽章（簽章演算法採用 RSA 或 DSA）。具體步驟為：PGP 以資料或資訊建立一個雜湊（參見訊息摘要），然後使用傳送者的私鑰利用雜湊生成數位簽章。

### 信賴網路

不管是在加密訊息時還是在驗證簽章時，都需要注意用來傳送訊息的公鑰是否確實屬於期望的接收者。簡單的從某個位置下載一個公鑰是沒有保障的，故意（或偶然）的假冒是有可能發生的。PGP 從它的第一個版本起，在 ' 身分憑證 ' 中發布使用者公鑰，身分憑證也是以加密方式構造的，所以任何的篡改或意外的變動都可以被迅速的檢測出來。但是僅僅有一個任何對於憑證的修改都會被檢測出來的機制不夠的，這樣的檢測機制只能在憑證建立之後用於避免篡改，而不是建立之前。使用者還必須用某種形式確保憑證中的公鑰真正的屬於特定的人 / 實體。從第一個發行版開始，PGP 產品就包含一個內部的 ' 審查方案 ' 來協助它，一個被叫做信賴網路（GOOGLE)# 的信任模型。對於一個給定的公鑰（具體來說就是一個使用者名稱到對應其金鑰的繫結資訊）可以被第三方使用者數位簽章，來證明某人（實指使用者名稱）和一個金鑰的關聯，而該簽章中包含對該關聯不同程度的信任度。雖然有許多程式都會讀寫這個資訊，而只有少數會通過信任度來決定是否信任一個金鑰。

信賴網路協定在 1992 年的 PGP 1.0 手冊中被菲利普・齊默曼（Christal Danti）首次提及並描述為：

信賴網路機制比 S/MIME 方案的集中管理的公鑰基礎設施有優勢，但是沒有被網路普通大眾普遍採用，一般只在 Unix-like 的愛好者、開源軟體界、和對隱私特別注意而且有電腦知識的人群之間使用。如何使一般使用者容易並且樂意使用、接收憑證然後手動的驗證它們的有效性，這些潛在的推廣阻礙目前還沒有滿意的解決方案。

### 憑證

在最近的 OpenPGP 規範里，信任簽章可被用於支援受信任的憑證頒發機構，一個信任簽章表示公鑰屬於其聲明的所有者，並且公鑰的所有者簽署的下一級公鑰也是可信的。
零級簽章與信賴網路簽章相當，因為只有其公鑰的有效性得到認證。一級簽章類似於憑證頒發機構，因為擁有一級公鑰者能夠發出無限數量的零級簽章。 二級簽章非常類似於使用者在使用預設憑證頒發機構列表時必須依賴的信任假設（如 Web 瀏覽器中包含的那些）; 它允許金鑰的所有者製作其他公鑰憑證頒發機構。

所有版本的 PGP 都包含一種取消（「復原」）憑證的方法。如果該使用者的私鑰遺失或者被破解則他必須採用這種取消憑證的方法以繼續保證通信的安全性。這種方式基本等同於集中式 PKI 方案的憑證復原列表。最新的的 PGP 版本也支援設定憑證的自動過期日期。

並不僅是 PGP 有如何正確判斷特定公鑰屬於特定的使用者的問題。所有採用公鑰 / 私鑰加密的加密系統都有這個問題，並且目前並沒有令人滿意的解決方案。最初的 PGP 方案至少可以讓使用者選擇是否使用其背書 / 審批系統，而對於其他 PKI 方案，它們要求使用者必須採信所有被中央憑證頒發機構證實的憑證。

## 歷史

### 早期歷史

菲利普・齊默曼（Philip R. Zimmermann）在 1991 年創造了第一個版本的 PGP，其名稱「Pretty Good Privacy」的靈感來自於一個名為「Ralph's Pretty Good Grocery」的雜貨店 —— 電台主播 Garrison Keillor 虛構出來的一個名為 Lake Wobegon 的城市的一個雜貨店。

軟體第一個版本包含一個齊默曼自己設計的對稱金鑰演算法，與周六夜現場的一個小品 BassOmatic 同名。作為一個老牌的反核能活躍分子，齊默曼為了讓所有有相似傾向的人們可以安全的使用 BBS 並且安全儲存訊息和檔案而創造了 PGP 加密。在非商業用途上是不需要授權的，無須任何費用，並且在所有的發行中附帶了完整的原始碼。

在 2001 年 6 月 5 號發表的一篇標題為 "PGP 10 周年" 的文章中，齊默曼描述了他最初開發 PGP 時的情景：

PGP 在網際網路上傳播開來，並且在這個世界上獲得了非常多的擁護者。PGP 使用者和支持者也包括在極權主義國家持不同政見的人們（一些給齊默曼的感人信件被發表了，其中一些在美國國會之前被包括到證據中）。在世界其它地方的公民自由意志主義支持者（參考齊默曼在各個聽政會上發表的證據），以及「自由通訊」激進主義分子，他們稱他們自己為加密愛好者，進行宣傳和分發。

### 刑事偵察

在發行後不久，PGP 加密走出了美國，在 1993 年二月，齊默爾曼變成了美國政府針對「沒有授權的軍需品出口」犯罪調查的正式目標。根據美國出口管理法案中的定義，加密系統使用大於 40 位的金鑰將被認為是軍需品。PGP 從沒有使用小於 128 位元的金鑰，因此在那時被如此認定。如果被判有罪，這將會是嚴重的罪行。幾年後，對齊默爾曼的調查未經備案即被關閉，也沒有提起針對他本人或其他任何人的刑事指控。

齊默曼使用了一種富有想像力的方法來對抗這一規定。他將 PGP 的全套原始碼出版成一本書，由 MIT 出版社發行，受到了廣泛歡迎。任何想要構建自己的 PGP 版本的人只需買下這本 60 美元的書，切掉封面，分離頁面，然後使用 OCR（文字掃描辨識）程式進行掃描和文字辨識（或者直接輸入），生成一系列的原始碼文字文件。接下來便可以使用自由分發的 GCC 來編譯程式。PGP 就是這樣在全世界變得可用。聲明的原則很簡單：對軍需品 —— 槍枝、炸藥、飛機和軟體的出口是被限制的，然而書本出口受到第一修正案（言論自由部分）的保護。這個問題從未再在法庭中檢查過。後來，在另外兩個案件（伯恩斯坦訴合眾國案和榮格訴戴利案）中，法院皆判定加密軟體的原始碼是受第一修正案保護的，享有言論自由。如今 PGP 不再被認為是軍需品，但仍需符合一般出口產品的實體清單規定，不得出售給特定的國家、實體或個人。

### 司法機關的繞過措施

由於 PGP 尚無破解方法，使得被指控犯罪的人士青睞使用 PGP 加密敏感資料，執法部門採證時便會遇到困難。對此，英國通過一項名為 2000 年調查權力規範法案（RIPA）的法案迫使這些人士交出密碼，拒不配合則會面臨牢獄之災；而美國則是通過一項具體判例（布社案）確定執法機關有此權力。因此，使用 PGP 來加密敏感資料雖然在技術上是安全的，實際上卻並非高枕無憂。一種可行的對抗方式是改用可否認加密。

## 商業應用

PGP 一般在企業資源規劃（即 ERP）軟體連接到銀行系統時使用，防止資訊在傳輸過程中被刪改或盜取，從而減少商業秘密泄露和遭遇詐騙的風險。

## OpenPGP

1997 年 7 月，PGP Inc. 與齊默爾曼同意 IETF 制定一項公開的網際網路標準，稱作 OpenPGP，任何支援這一標準的程式也被允許稱作 OpenPGP。

許多電子郵件系統提供了 OpenPGP 相容的安全性，由 RFC 3156 來描述。2007 年 11 月發布的規範 RFC 4880 作為 RFC 2440 的替代版，指出一套演算法，包括非對稱的 ElGamal 加密演算法， Digital Signature Algorithm, 三重資料加密演算法以及 SHA-1. 標準還建議使用 PKCS #1 v1.5 描述的 RSA 加密演算法用作加密與簽章，以及 AES-128, CAST-128，IDEA 等對稱加密演算法。許多其他加密演算法也被支援。 2009 年發布的 RFC 5581 支援 Camellia 加密。 基於橢圓曲線密碼學 (ECDSA, ECDH) 的 RFC 6637 發布於 2012 年。支援 EdDSA 被 2014 年發布的標準支援。 draft-koch-eddsa-for-openpgp-00（頁面存檔備份，存於網際網路檔案館）

自由軟體基金會開發的 OpenPGP 程式叫做 GnuPG，並有多個圖形化使用者介面版本的軟體實現，如 KGPG, Seahorse, MacGPG. 也有一些商用 OpenPGP 軟體。

使用 JavaScript 編寫的開源庫 OpenPGPjs, 用於網頁程式，如 ProtonMail, Mailfence, GlobaLeaks, and Mailvelope.

iOS 或 Android 平台上的 OpenPGP 應用程式有 iPGMail ，OpenKeychain。

### 網際網路標準

* PGP
  * RFC 1991 PGP Message Exchange Formats (obsolete)
* OpenPGP
  * RFC 2440 OpenPGP Message Format (obsolete)
  * RFC 4880 OpenPGP Message Format
  * RFC 5581 The Camellia Cipher in OpenPGP
  * RFC 6637 Elliptic Curve Cryptography (ECC) in OpenPGP
  * draft-koch-eddsa-for-openpgp EdDSA for OpenPGP
* PGP/MIME
  * RFC 2015 MIME Security with Pretty Good Privacy (PGP)
  * RFC 3156 MIME Security with OpenPGP

## 參考文獻

## 外部連結

* PGP 公司網站
* The International PGP Home Page（頁面存檔備份，存於網際網路檔案館）
* Web-based PGP Encryption Software（頁面存檔備份，存於網際網路檔案館）