PGPを使う

安全なデータのやりとりをメールでやるには、暗号化するのが一番。
メールの暗号化(メールだけじゃないけど)には、PGPって言うものがある。
ずいぶん前には、Mewって言うメーラで、pgp2.6.3i って言うのを使っていたのだけれど、最近使おうと思ったらどうしてもパスフレーズが思い出せない(汗)。
この際なので、pgpのバージョンも上げて、現在のメーラ(Wanderlust)でpgpを使えるようにすることにする。このページは、その作業の備忘録。

Windowsで使えるようにする

自宅のメールは、Windowsクライアントで Beckey!を使っている。Beckeyには、PGPのプラグインが入っているので、コマンドライン版のPGPをインストールすれば使えるはず。
PGP日本語版のページから、バイナリをダウンロードしてインストール。再起動して PGPTrayからPGPKeysを選んだら、キーペアの作成をウィザードでやってくれる。
# 最近はWindowsが簡単だな〜と思ったりする・・・。
とりあえず、これだけでBeckey!からはPGPの暗号化/復号化が行えるようになった。

Wanderlustで使えるようにする

会社のメールは、emacs/xemacsで Wanderlusを使っている。こちらは、Windowsよりはちょっと面倒。
  1. portsから、/usr/ports/security/pgp6 をインストールする。
    make install一発で成功。/usr/local/bin/pgpにインストールされたから、pgp2.6.3iは消えてしまった・・・。
  2. 自分のキーを作成する
    % pgp -kg
    Pretty Good Privacy(tm) Version 6.5.8
    Internal development version only - not for general release.
    (c) 1999 Network Associates Inc.
    
    Export of this software may be restricted by the U.S. government.
    
    Choose the public-key algorithm to use with your new key
    1) DSS/DH (a.k.a. DSA/ElGamal) (default)
    2) RSA
    Choose 1 or 2: 1
    Choose the type of key you want to generate
    1) Generate a new signing key (default)
    2) Generate an encryption key for an existing signing key
    Choose 1 or 2: 1
    Pick your DSS ``master key'' size:
    1)  1024 bits- Maximum size (Recommended)
    Choose 1 or enter desired number of bits: 1
    Generating a 1024-bit DSS key.
    
    You need a user ID for your public key.  The desired form for this
    user ID is your name, followed by your E-mail address enclosed in
    , if you have an E-mail address.
    For example:  John Q. Smith 
    Enter a user ID for your public key: メールアドレス("名前 <アドレス>"の形式)
    
    Enter the validity period of your signing key in days from 0 - 10950
    0 is forever (the default is 0): 
    
    You need a pass phrase to protect your DSS secret key.
    Your pass phrase can be any sentence or phrase and may have many
    words, spaces, punctuation, or any other printable characters.
    
    Enter pass phrase:                         ←パスフレーズ
    Enter same pass phrase again:              ←パスフレーズ再入力
    
    PGP will generate a signing key. Do you also require an 
    encryption key? (Y/n) Y
    Pick your DH key size:
    1)  1024 bits- High commercial grade, secure for many years
    2)  2048 bits- "Military" grade, secure for forseeable future
    3)  3072 bits- Archival grade, slow, highest security
    Choose 1, 2, 3, or enter desired number of bits: 2
    
    Enter the validity period of your encryption key in days from 0 - 10950
    0 is forever (the default is 0): 
    
    
    Note that key generation is a lengthy process.
    
    PGP needs to generate some random data. This is done by measuring
    the time intervals between your keystrokes. Please enter some
    random text on your keyboard until the indicator reaches 100%.
    Press ^D to cancel
    100% of required data    ← 35%くらいでスタートするので、100%になるまで適当にキーを押す
    Enough, thank you.
    .******** ..................................................******* . 
    Make this the default signing key? (Y/n) Y
      
    Key generation completed.
    
  3. emacs/wanderlustの設定
    いろいろドキュメントを当たった結果、SEMI-1.14以降ならばPGPに対応してそうなので、.emacsに以下を追加してみる。
    (setq pgg-default-scheme "pgp")
    (setq pgg-default-user-id "メールアドレス")
    (setq pgg-pgp-user-id "メールアドレス")
    (setq pgg-cache-passphrase nil)
    
ここまでやって、emacs/xemacsでいろいろ試してみたが、結局うまく暗号化/複合化できなかった・・・。
メールを書いて、C-c C-x e とすると、暗号化するか聞いてくるので yes と答えると、そのまま C-c C-c でメールが送れる(パスフレーズを聞いてこない)
で、届いたメールを読もうとすると読めないのだ。最初の一度だけ、変なダイアログが出てきたので、wl-ほげほげ の方を選んだのが失敗だっただろうか?その後聞いてこないし、どこに設定が保存されたのかもわからない・・・。

後日また挑戦することにしよう・・・。

というわけで後日。pgp6が駄目ならgpgに挑戦してみようと言うことで、gpgをいれる。

  1. portsから、/usr/ports/security/gnupg をインストールする。
    make install一発で成功。
  2. 自分のキーを作成する
    % gpg --gen-key
    gpg (GnuPG) 1.2.1; Copyright (C) 2002 Free Software Foundation, Inc.
    This program comes with ABSOLUTELY NO WARRANTY.
    This is free software, and you are welcome to redistribute it
    under certain conditions. See the file COPYING for details.
    
    gpg: 警告: やばいメモリーを使用しています!
    gpg: 詳細はhttp://www.gnupg.org/faq.htmlをご覧ください
    すきな鍵の種類を選択してください:
       (1) DSAとElGamal (既定)
       (2) DSA (署名のみ)
       (5) RSA (署名のみ)
    どれにしますか? 1
    DSA鍵対は1024ビットになります。
    新しいELG-E鍵対を生成します。
                 最小の鍵長は  768 ビット
                 既定の鍵長は 1024 ビット
             最大の推奨鍵長は 2048 ビット
    どの鍵長にしますか? (1024) 
    要求された鍵長は1024ビット 
    鍵の期限を決めてください。
             0 = 無期限
            = 有効期限 n 日間
          w = 有効期限 n 週間
          m = 有効期限 n か月間
          y = 有効期限 n 年間
    鍵の有効期間は? (0)
    Keyは無期限です    
    これでいいですか (y/n)? y
                             
    あなたの鍵を同定するためにユーザーIDが必要です。
    このソフトは本名、コメント、電子メール・アドレスから
    次の書式でユーザーIDを構成します:
        "Heinrich Heine (Der Dichter) "
    
    本名: false
    電子メール・アドレス: false@wizard-limit.net
    コメント:                               
    次のユーザーIDを設定しました:
        "false <false@wizard-limit.net>"
    名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
    秘密鍵を保護するためにパスフレーズがいります。                    
    
    今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
    とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
    乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。
    ++++++++++.++++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++.+++++.+++++++++++++++++++++++++.++++++++++++++++++++++++++++++>+++++.+++++........................+++++
    
    十分な長さの乱数が得られません。OSがもっと乱雑さを収集
    できるよう、何かしてください! (あと300バイトいります)
    (適当にキーを打つ
    今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
    eとか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
    乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。
    +++++.+++++++++++++++.a+++++o+++++;++i++++++++..+++++s++++++++++.+++++j.++++++++++.++++++++++.+++++++++++++++.+++++.+++++.++++++++++++++++++++.+++++>+++++......
    .............+++++^^^^^^^^^
    gpg: /var/home/false/.gnupg/trustdb.gpg: 信用データベースができました
    公開鍵と秘密鍵を作り、署名しました。
    絶対的に信用した鍵として記録しました。
    
    pub  1024D/4EBA6BEA 2003-04-30 false 
                    指紋 = C985 E3AB 3C7A E022 EBE9  1598 C067 1647 4EBA 6BEA
    sub  1024g/91E780F9 2003-04-30
    
    
  3. .emacsを変更
    (setq pgg-default-scheme "gpg")
    (setq pgg-default-user-id "メールアドレス")
    (setq pgg-pgp-user-id "メールアドレス")
    (setq pgg-cache-passphrase nil)
    
    これで、メールを書いて C-c C-x e で暗号化したメールが送れて、届いたメールも読むことができた。
    mew の頃は、メールを書くときもパスフレーズを聞いてきたと思うんだけど、なんで聞いてこないのかな?なんて思ったら、C-c C-x s で署名をしようと思ったら聞いてきました。mew のときは、暗号化&署名を使っていたけど、SEMIだとこれが別の概念なのね〜。
  4. Windowsとの相互テストもしようと思い、キーをウィンドウズのアカウントに送る。C-c C-x C-k でキーが添付されるはず。
    Beckeyで受信してみると、そのままでは認識してくれなかったので、添付ファイルを保存して、PGPKeysにインポートする。
  5. 今度は、PGPKeysからWindowsのキーをexportし、UNIXの方でキーリングに登録する。
    % gpg --import ファイル名
    gpg: 警告: やばいメモリーを使用しています!
    gpg: 詳細はhttp://www.gnupg.org/faq.htmlをご覧ください
    gpg: 鍵A8B0443A: 公開鍵「false <false@wizard-limit.net>」を読み込みました
    gpg:          処理数の合計: 1
    gpg:                読込み: 1
    
  6. ついでに、受け取った鍵に署名する。(これをやらないと、署名の検証をしたときのメッセージがうざい。今回はファイルをコピーしたので絶対信用できる)
    % gpg --sign-key false@wizard-limit.net
    gpg: 警告: やばいメモリーを使用しています!
    gpg: 詳細はhttp://www.gnupg.org/faq.htmlをご覧ください
    
    pub  1024D/A8B0443A  作成: 2003-04-28 期限: never      trust: -/-
    sub  2048g/9C58F30B  作成: 2003-04-28 期限: never     
    (1). false <false@wizard-limit.net>
    
    
    pub  1024D/A8B0443A  作成: 2003-04-28 期限: never      trust: -/-
     主鍵の指紋: D171 AEB5 06DF FF9E 0C95  C537 7A1D BC41 A8B0 443A
    
         false <false@wizard-limit.net>
    
    署名しようとしている鍵が実際に上記の名前の人のものかどうか、どの程度
    注意して検証しましたか? 答がわからなければ、「0」を入力してください。
    
       (0) 答えません。 (default)
       (1) 全然、確認していません。
       (2) 一応、確認しました。
       (3) かなり注意して確認しました。
    
    どれにしますか? 3
    本当にこの鍵にあなたの鍵で署名してよいですか: "false <false@wizard-limit.net>"
    
    この鍵は、かなり注意して確認しました。
    
    本当に署名しますか? y
                         
    次のユーザーの秘密鍵のロックを解除するには
    パスフレーズがいります: "false <false@wizard-limit.net>"
    1024ビットDSA鍵, ID 4EBA6BEA作成日付は2003-04-30
    
    
この結果 UNIX(Wanderlust) ⇔ Windows(Beckey!)でメールをやりとりした結果、以下のような結果になった。
送り側\受け側UNIXWindows
UNIX暗号化のみ
署名のみ
暗号化+署名×
Windows暗号化のみ
署名のみ
暗号化+署名
どうも、Wanderlust(SEMI)で暗号化+署名を選ぶと、以下のような構成のメールになり、これが Beckey!では読めないらしい。
[1  <multipart/mixed (7bit)>]
[1.1  <multipart/encrypted (7bit)>]
[1.1.1  <application/pgp-encrypted (7bit)>]
[1.1.2  <application/octet-stream (7bit)>]
[1.2  <text/plain; US-ASCII (7bit)>]
[2  <application/pgp-signature (7bit)>]
また、UNIXで署名のみしたメールをWindowsに送って、Beckey!のメニューからPGP:復号化と検証...を選ぶと、エラーは出ずに終了するのだが、何のメッセージも出ないのでこれが正しいのかどうか良くわからない。

後日その2)
と思ったら、別のWindowsマシンで試したところ、ちゃんとpgpが出すメッセージを読むことができた。なので、
送り側\受け側UNIXWindows
UNIX暗号化のみ
署名のみ
暗号化+署名×
Windows暗号化のみ
署名のみ
暗号化+署名
となる。 同じバージョンのPGPと同じバージョンのBeckey!なんだけど、駄目なマシンは何がいけないのかな〜?

後日その3)
大丈夫なマシンと駄目なマシンの違いを見ると、駄目なマシンはSocksCap経由でIMAPサーバと通信するようになってる。
試しに、駄目なマシンでSocksCapを使わないで実験したら、正しく署名の検証結果を見ることができた。
SocksCapがなんに関係しているんだろう??
あと、gpg がやばいメモリーとか警告を出すのが嫌なので、~/.gnupg/gpg.conf を以下のように変更した。

keyserver pgp.nic.ad.jp
keyserver-options honor-http-proxy
no-secmem-warning
※ keyserver-options は、使用するマシンがfirewall の内側にいるため。あわせて、環境変数 http_proxyにhttp://proxy-server:3128 を設定した。
これで、gpg --search-keys アドレス で公開鍵がサーチできる。自分をサーチしてみたら、登録した記憶はないんだけど古いキーが登録されていた(汗)
とりあえず新しい鍵を登録したが、古い鍵を破棄するためには古い鍵のパスフレーズが必要で、古い鍵のパスフレーズは・・・。

思い出しました!で、pgp -ke でパスフレーズを覚えやすいものに変更して、

% pgp -kx false@wizard-limit.net false.asc secring.skr
% gpg --import false.asc
しようとしたら、自己署名がないって言うようなエラーになったので、
% pgp -ks false@wizard-limit.net
% pgp -kx false@wizard-limit.net false.asc secring.skr
% gpg --import false.asc
でうまく行った。(ユーザIDが同じなんだけど、どうやって区別するのかな?) 早速、古いメールで暗号化されている奴を探して読もうとしたら、secret key が見つかりません・・・。
あれ〜?と思って良く見ると、入社当時のキーではなく、大学時代に使っていたキーだった!
同じ方法で、pgp のキーリングから gpg のキーリングに移動し、メールを読もうとしたら、gpg が IDEA 1 なんて知らん!とエラー。gpg が使えない暗号化方式らしい。
結局、pgpで読もうとしたら、パスフレーズを聞いてきます(あたりまえ)。・・・まあいいや、このメールは闇に葬ろう・・・。
で、気を取り直して入社当時に作成したキー宛のメールを発掘して読んでみると、こちらはgpgでも問題なく読めました。
ん〜、古いメールは捨てていくしかないんですかねえ。
false@wizard-limit.net