Overview
PGP(Pretty Good Privacy)とは、1991年にPhil Zimmermannによって開発された暗号化ソフトウェアおよびその暗号化方式の総称です。メールの暗号化・デジタル署名、ファイルの暗号化、ディスク暗号化など幅広い用途に使用されます。PGPは公開鍵暗号と共通鍵暗号を組み合わせたハイブリッド暗号方式を採用し、中央集権的な認証局に依存しないWeb of Trust(信頼の輪)という独自の信頼モデルを特徴としています。
GPG(GNU Privacy Guard / GnuPG)は、PGPの暗号化規格を実装したフリーソフトウェアです。PGPの商用ライセンスに制約されることなく、OpenPGP標準(RFC 4880)に準拠した暗号処理を提供します。現在ではLinuxディストリビューションに標準搭載されており、ソフトウェア配布のパッケージ署名検証やGitコミットの署名など、オープンソースエコシステムにおいて不可欠なツールとなっています。
PGPの誕生は暗号技術の民主化において画期的な出来事でした。当時、強力な暗号技術は軍事・政府機関の独占物と見なされており、Phil Zimmermannは暗号ソフトウェアの輸出規制に抵触するとして米国政府から3年間の犯罪捜査を受けました。最終的に訴追は取り下げられ、暗号技術の自由な利用を求める運動の象徴的な事件となりました。
Details
PGPの動作原理
PGPはハイブリッド暗号方式で動作します。メッセージの暗号化時には、まずランダムなセッション鍵(共通鍵)を生成し、そのセッション鍵でメッセージ本文を暗号化します(AES-256など)。次に、セッション鍵を受信者の公開鍵で暗号化して、暗号化メッセージとともに送信します。受信者は自分の秘密鍵でセッション鍵を復号し、そのセッション鍵でメッセージ本文を復号します。
デジタル署名の場合は、メッセージのハッシュ値を計算し、送信者の秘密鍵で署名を生成します。受信者は送信者の公開鍵で署名を検証し、メッセージの完全性と送信者の認証を確認します。
Web of Trust(信頼の輪)
Web of Trustは、PGPの中核をなす分散型の信頼モデルです。S/MIMEが認証局(CA)による階層的な信頼構造を採用するのに対し、PGPではユーザー同士が互いの公開鍵に署名(鍵署名)することで信頼関係を構築します。
具体的には、AさんがBさんの公開鍵の正当性を確認し署名すると、Aさんを信頼する第三者CさんはBさんの鍵も間接的に信頼できます。このように信頼が連鎖的に広がる仕組みがWeb of Trustです。信頼レベルは「完全信頼」「限定信頼」「未信頼」の段階で設定でき、間接的な信頼には複数の経路が必要となるよう設計されています。
鍵署名パーティー(Key Signing Party)は、PGPユーザーが対面で互いの身元を確認し、公開鍵に署名し合うイベントです。セキュリティカンファレンスやオープンソースコミュニティのミートアップで開催され、Web of Trustのネットワークを拡大する重要な機会となっています。
OpenPGP標準とRFC 4880
OpenPGPは、PGPの暗号化方式をIETFが標準化したものであり、RFC 4880で規定されています。この標準により、異なるPGP実装間での相互運用性が確保されています。2023年にはRFC 9580として大幅な更新が行われ、AEAD暗号化モード、Ed25519/X25519鍵、SHA-256のデフォルト化など、現代的なアルゴリズムへの対応が盛り込まれました。
主なOpenPGP実装として以下があります。
- GnuPG(GPG):最も広く使用されるフリーのOpenPGP実装。Linux、macOS、Windowsに対応。
- Symantec Encryption(旧PGP Corporation):PGPの商用版。エンタープライズ向け機能を提供。
- OpenPGP.js:JavaScript実装。Proton MailやMailfenceなどのWebメールサービスで使用。
- Sequoia-PGP:Rustで記述された新しいOpenPGP実装。メモリ安全性を重視。
鍵サーバーの仕組み
PGPの公開鍵は鍵サーバー(Key Server)に登録して公開します。従来はSKS(Synchronizing Key Server)ネットワークが広く使用されていましたが、鍵に対する不正な署名の大量付与(鍵汚染攻撃)やプライバシーの問題から、現在では以下の新世代鍵サーバーの利用が推奨されています。
- keys.openpgp.org:メールアドレスの所有確認を行い、検証済みの鍵のみを公開する鍵サーバー。第三者署名は保存しないため、鍵汚染攻撃に対して耐性があります。
- Ubuntu Keyserver:Ubuntuプロジェクトが運営する鍵サーバー。パッケージ署名の検証に使用されます。
ソフトウェア配布における利用
PGP/GPGはソフトウェア配布のセキュリティにおいて重要な役割を果たしています。Linuxディストリビューションのパッケージ管理(APT、RPMなど)では、パッケージにGPG署名を付与し、ユーザーがインストール時に署名を自動検証する仕組みが標準的に実装されています。また、GitHubやGitLabではGitコミットやタグへのGPG署名がサポートされており、コードの改ざん検知に活用されています。
Keybaseとモダンな鍵管理
Keybaseは、PGP公開鍵とソーシャルメディアアカウント(Twitter、GitHub、Redditなど)を暗号学的に紐づけることで、鍵の正当性検証を容易にしたサービスです。Web of Trustの複雑さを解消し、ユーザーフレンドリーなPGP鍵管理を実現しました。2020年にZoomに買収され、Zoom Meetingsのエンドツーエンド暗号化にその技術が応用されています。
Security Measures
- 01最新版GPGの使用:GnuPG 2.2以降(推奨は2.4以降)を使用してください。古いバージョンには既知の脆弱性があり、デフォルトの暗号アルゴリズムも現代の基準に満たない場合があります。gpg.confでデフォルトアルゴリズムをAES-256、SHA-512に設定することを推奨します。
- 02適切な鍵管理の実践:マスター鍵(認証鍵)はオフライン環境に保管し、日常の署名・暗号化にはサブキーを使用します。マスター鍵をUSBメモリやエアギャップ環境に隔離することで、サブキーが漏洩した場合でもマスター鍵の安全性を維持し、サブキーの失効と再発行が可能です。
- 03鍵の有効期限の設定:すべての鍵に有効期限を設定してください。一般的には1〜2年が推奨されます。有効期限が設定されていない鍵は、秘密鍵を紛失した場合に永久に失効できず、鍵サーバー上に無効な鍵が残り続けるリスクがあります。有効期限はマスター鍵で延長可能なため、運用上の不便は最小限です。
- 04失効証明書の事前生成:鍵ペアを作成したら、直ちに失効証明書(Revocation Certificate)を生成し、安全な場所に保管してください。秘密鍵の漏洩や紛失時に、公開鍵を速やかに失効させるために不可欠です。GnuPG 2.1以降では鍵生成時に自動的に作成されます。
- 05最新の鍵サーバーの利用:keys.openpgp.orgなど、メールアドレスの検証機能を備えた最新の鍵サーバーを使用してください。旧来のSKS鍵サーバーは鍵汚染攻撃に脆弱であり、GnuPGのパフォーマンスに深刻な影響を与える可能性があります。
- 06鍵のフィンガープリント全体での検証:公開鍵を受け取った際は、鍵IDではなく40文字のフルフィンガープリントで検証してください。短い鍵ID(8桁や16桁)は衝突攻撃が現実的に可能であり、偽造鍵の作成が報告されています。対面やビデオ通話でフィンガープリントを確認することが最も安全な方法です。
Incidents
📋 SKS鍵サーバー汚染攻撃(2019年)
2019年6月、SKS(Synchronizing Key Server)鍵サーバーネットワークに対する大規模な鍵汚染攻撃が発生しました。攻撃者は著名なGnuPG開発者(Robert J. HansenやDaniel Kahn Gillmorなど)のPGP公開鍵に対して、数万件の不正な署名を大量に付与しました。
SKS鍵サーバーの設計上、一度登録された署名は削除できない仕組みになっていたため、汚染された鍵をインポートしたGnuPGユーザーのキーリングが極端に肥大化し、GnuPGの動作が著しく低速化または完全に停止する事態となりました。この攻撃はSKS鍵サーバーの根本的なアーキテクチャ上の問題を露呈し、keys.openpgp.orgのような検証型鍵サーバーへの移行を加速させる契機となりました。GnuPGプロジェクトはこの問題に対応するため、鍵のインポート時にサイズ制限を導入するパッチをリリースしました。
📋 EFAIL脆弱性によるPGP暗号化メールの平文漏洩(2018年)
2018年5月、ドイツの複数の大学の研究チームがPGPおよびS/MIMEの暗号化メールに対する攻撃手法「EFAIL」を発表しました。この攻撃は、HTMLメールの仕組みを悪用して暗号化メールの平文を外部サーバーに送信させるものでした。
PGPに対するEFAIL攻撃には2つのバリエーションがありました。「Direct Exfiltration」はHTMLタグの中に暗号文を埋め込み、メールクライアントが復号した平文をURLパラメータとして外部に送信させる手法です。「CBC/CFB Gadget Attack」はPGPの暗号モードの特性を利用して暗号文を改変し、復号時に攻撃者のURLを含むHTMLを生成させる手法です。Electronic Frontier Foundation(EFF)はこの脆弱性公表時に、メールでのPGP使用を一時的に停止することを推奨する声明を発表し、大きな議論を呼びました。
📋 短い鍵IDの衝突攻撃と偽造鍵の流通(2016年)
2016年、PGPの32ビット短縮鍵ID(8桁の16進数)を標的とした衝突攻撃の実現可能性が実証されました。研究者はLinuxカーネル開発チームのPGP公開鍵と同一の短縮鍵IDを持つ偽造鍵を生成し、鍵サーバーにアップロードすることに成功しました。
短縮鍵IDが32ビットしかないため、約65,000回の鍵生成で50%の確率で衝突が発生します。GPUを使用すれば数秒で任意の短縮鍵IDと一致する鍵ペアを生成可能です。この偽造鍵は正当な鍵と短縮鍵IDが一致するため、鍵IDのみで鍵を識別しているユーザーやスクリプトは偽造鍵を正規の鍵と誤認する危険性がありました。Linuxディストリビューションのパッケージ署名検証スクリプトの一部にもこの問題が影響し、フルフィンガープリントでの検証への移行が強く推奨される結果となりました。