1分でわかるPGP

 この色だけを読めば,1分です.詳しくは,ページ全体,また末尾のリンクをご覧ください.

PGPとは

 PGP (Pretty Good Privacy, 「たいへんよいプライバシー」)は,Philip Zimmermannが開発した暗号ソフトウェアです.

 主な用途は,ファイルやメールの暗号化です.また,署名やその検証も行えます.一方,SSL/TLSやSSHと異なり,通信の暗号化はしません.

 公開鍵暗号を使用しますが,その鍵の管理のために,認証局を設置せず,各利用者の責任で鍵を管理し,取得した公開鍵をチェックします.そして,ハイブリッド暗号で暗号化されます.メッセージまたはファイルは,セッション鍵と呼ばれる乱数の値を鍵として,対称暗号により暗号化され,そのセッション鍵は,受信者の公開鍵で暗号化されます.

 PGPの別実装として,GnuPG (GNU Privacy Guard)があります.こちらはGPL (GNU General Public License)に基づき無料で利用できます.ターミナル(シェル)では,gpgというコマンドに,オプションをつけて実行します.

他の秘密通信方式との違い

 1. SSLなどとの違い: SSL/TLS (Secure Sockets Layer / Transport Layer Security)や,SSH (Secure Shell)のポート転送を用いて,メールサーバとの通信を暗号化することができます.しかしそれでは,送信後のメールの配送や,サーバで保管されるメールについては,暗号化されません.

 Bcc (Blind Carbon Copy)は,メールのヘッダに宛先が表示されませんが,これも配送は暗号化されませんし,サーバで保管された状態のメールは,暗号化されていません.

 これらに対して,PGPは,必ずしも安全でない通信経路やサーバを介しても,メッセージの秘密を守るための仕組みを提供しています.

 2. 暗号化ZIPとの違い: パスワードつきのZIPファイル(暗号化ZIP)は,そのファイルごとにパスワードが設定されます.しかし,何らかの理由でパスワードを変更したいと思っても,送付したあとには,できませんし,いくつも作るとなると,そのパスワードの管理が面倒です.

 PGPの暗号化では,鍵(セッション鍵)が,受信者の公開鍵で暗号化されています.したがってその安全性は,受信者の鍵の管理に依存します.受信者の持つ秘密鍵は,パスフレーズを入力しないと使用できませんが,そのパスフレーズはあとで変更できます.

 なお,暗号化ZIPでは,一つのファイルに対して,パスワードを知っている複数の人が復号できますが,PGPにおいても,複数の利用者が(それぞれの秘密鍵で)ファイルを復号できるような,単一のファイルを作ることは可能です.

 3. S/MIMEとの違い: S/MIME (Secure / Multipurpose Internet Mail Extensions)は,メールの暗号化や署名についての規格ですが,そのデータフォーマットは,PGPと異なります.S/MIMEでは,鍵や証明書を発行したりその正当性を保証したりするため,認証局を必要とします.

鍵の管理の概要図

PDF版(2ページ)もどうぞ.

鍵の管理

 PGPの鍵は,公開鍵暗号系や,PKI (Public-Key Infrastructure, 公開鍵基盤)での考え方と,同じところもあれば,異なっているところもあります.

 PGPを使うにあたっての原則は,次の5つです.

  • 暗号化には,受信者の公開鍵を使用します.
  • 復号には,受信者の秘密鍵を使用します.
  • 署名には,送信者の秘密鍵を使用します.
  • 検証には,送信者の公開鍵を使用します.
  • 秘密鍵を使用するとき,パスフレーズを入力します.

 鍵情報は,16進8桁(32ビット)であらわされる,「鍵ID」を指定するのが一般的です.私の鍵IDは,0x3BDCC722です.これが,"Takehiko Murakawa <takehiko@sys.wakayama-u.ac.jp>"という「ユーザーID」に結びつけられています.

 しかし,PGPでは,私以外の人が,私と同じユーザーIDの鍵ペア(公開鍵と秘密鍵のペア)を作ることができてしまいます.ソフトウェアに手を加えれば,鍵IDも同じにすることができます.

 そのようにして作られる可能性のある,偽造鍵と,正しい鍵とを区別するため,公開鍵の利用者はあらかじめ,公開鍵の正当性を確認しておきます.通常は,fingerprint (「フィンガープリント」「指紋」「ハッシュ値」とも呼ばれます)を使います.受け取った公開鍵からfingerprintを求め,それが,鍵の所有者が提示するfingerprintと一致していれば,正当な鍵とみなします.(fingerprintまで一致するような,鍵の偽造は,現実的にできません.もし万一そのようなことがあれば,むしろ,秘密鍵の漏洩を疑うべきです.)

 私の鍵のfingerprintは,連絡先で公開しています.ただし,ブラウザで受信し画面に表示されるまでのあいだで,ひょっとしたら,書き換わっている可能性もありますので,インターネット経由の情報を過信しないようにしましょう.

 公開鍵を正当なものと確認したら,その鍵に,自分の秘密鍵で署名をすることで,以後,安全に利用できるようになります.またその公開鍵に信頼度を設定することもできます.このように鍵の正当性を確認するとともに,信頼度を設定し,その情報をやりとりするしくみは,web of trust (「信頼の輪」または「信頼の網」)と呼ばれます.

 公開鍵は,公開鍵サーバ(または「鍵サーバ」)を介してやりとりができます.例えば,鍵IDや,ユーザーIDの一部を指定すれば,検索をしてくれる公開鍵サーバもあります.また自分の鍵IDを指定して送れば,ほどなく,公開鍵が登録されることでしょう.なお,公開鍵サーバは,公開鍵のやりとりの利便性を図るものであって,鍵そのものの正当性は保証してくれません.

 ここまでご覧になって,「よし自分も使ってみよう」と思った方へ.どんなOSで使いたいでしょうか? Windowsで,管理者権限を持っていれば,Thunderbird + Enigmail + GnuPGの組み合わせをおすすめします.LinuxやMac OS Xでは,gpgコマンドを使って鍵を作ったり管理したりし,コマンド実行が面倒なら,GUIアプリケーションを活用しましょう.

 なお,生成した鍵ペアを含め,所有し管理する鍵の集合をkeyring (「鍵束」または「鍵輪」)といいます.Linuxなどでは,~/.gnupgに保存されます.複数の計算機に,共通の(もちろん同じ鍵IDの)鍵ペアを持たせることも可能です.

 運用のためのアドバイスを,以下に記します.

  • 自分の秘密鍵のパスフレーズを,忘れないようにしましょう.
  • 自分の秘密鍵のパスフレーズを,漏らさないようにしましょう.
  • 暗号化して送りたいとき,公開鍵の正当性確認をきちんとしましょう.

gpgコマンド

 gpgコマンドのクイックリファレンスです.

■鍵ペア
鍵ペア生成: gpg --gen-key
鍵の破棄(失効)証明書作成: gpg -o Filename_Revoke_Out --gen-revoke Keyname

■鍵の管理
鍵一覧: gpg --list-keys
秘密鍵一覧: gpg --list-secret-keys
鍵をエクスポート(ファイルから鍵束へ): gpg -o Filename_Key_Out --export Keyname
鍵をインポート(鍵束からファイルへ): gpg --import Filename_Key_In
鍵のフィンガープリント: gpg --fingerprint Keyname
鍵に署名: gpg --sign-key Keyname
鍵の設定(信頼度,パスフレーズなど): gpg --edit-key Keyname
鍵を(鍵束から)削除: gpg --delete-key Keyname
鍵を(公開鍵サーバへ)送る: gpg --keyserver Servername --send-keys Keyname
鍵を(公開鍵サーバで)検索: gpg --keyserver Servername --search-keys KeyID
鍵を(公開鍵サーバから)入手: gpg --keyserver Servername --recv-keys KeyID

■暗号化・署名
暗号化: gpg -o Filename_Cipher_Out -r Keyname --encrypt Filename_Plain_In
復号: gpg -o Filename_Plain_Out --decrypt Filename_Cipher_In
署名: gpg -o Filename_Signed_Out --sign Filename_Plain_In
検証: gpg --verify Filename_Signed_In
対称暗号による暗号化: gpg -o Filename_Cipher_Out --symmetric Filename_Plain_In
対称暗号による復号: gpg -o Filename_Plain_Out --decrypt Filename_Cipher_In

◆引数の例
KeyIDの例: 3BDCC722
Keynameの例: takehiko@sys.wakayama-u.ac.jp
Servernameの例: pgp.nic.ad.jp

 大文字から始まる引数は,そのまま打ち込むのではなく,ファイル名,鍵ID,メールアドレス(の一部),鍵サーバのホスト名などに置き換えてください.

 ファイルを出力するコマンドでは,「-a」または「--armor」というオプションをつけることで,テキストファイルを得ることができます.

更新履歴

  • 2011年4月17日
    • 「鍵の所有者が公開するfingerprintと一致していれば」から「鍵の所有者が提示するfingerprintと一致していれば」に変更しました.例えばfingerprintを名刺に記載し,必ずしも公表しないという方法も考えられるからです.他に細部を修正しました.
  • 2011年4月16日
  • 2011年4月14日
  • 2011年4月12日
    • 細部を修正しました.
  • 2011年4月11日
    • リリースしました.