Ubuntu Weekly Recipe

第211回メールをGnuPGで暗号化する

読者の中には特殊部隊のエージェントとして、悪の組織と日夜戦っている方もいることでしょう。上司やクライアントからの連絡は電子メールで、となると作戦の指令や顧客情報、アジトの地図といった機密性の高い情報がインターネットに平文で流れてしまい、敵に諜報され放題です。

テープやDVDなどの物理媒体であれば、特定の相手以外が受け取った時点で爆破するといった古典的な方法が使えますが、電子メールの場合はそうもいきません。そんな悩みを解決するために、今回はメールを暗号化して送受信する方法をご紹介します。

メールの暗号化とGPG鍵

今回はメールの暗号化方式としてOpenPGPと、その実装であるGnuPGを使います。これはGnuPGがUbuntuコミュニティで一般的に使われているためです[1]⁠。

仕組みは単純で、メールの本文を送信相手の公開鍵で暗号化し、そのファイルをマルチパートとして添付するPGP/MIMEか、さらにASCII化(armor)した上でメール本文に埋め込んで送信しますインラインPGP⁠。受信者は自分自身の秘密鍵でこれを復号することで、本文を確認します。なお、暗号化されるのはメール本文のみです。サブジェクトは暗号化されないので、注意しましょう。

GnuPGを使うためにはまず公開鍵と秘密鍵を生成する必要がありますが、詳細は第28回の最後を参照してください。生成方法は端末で以下のコマンドを実行し、名前やメールアドレスを入力します。この名前やメールアドレスはメールの暗号化や復号の際に、どの鍵データを使うべきか特定する時にも使われます。

$ gpg --gen-key

これにより、⁠~/.gnupg/」ディレクトリに公開鍵と秘密鍵が生成されます。

さらに暗号化する際は相手の公開鍵を知っておく必要があります。公開鍵は手渡しが原則です。これは「その公開鍵ファイルが本当に相手のものであるかどうかを確認する」ことがインターネット上の通信手段だけだと難しいからです。実際のところ、公開鍵というバイナリデータをやりとりするのは大変なので、公開鍵自体は鍵サーバーに登録する、メールで送るという手段をとった上で、鍵のフィンガープリントを信頼できる通信手段で連絡し、それを用いて公開鍵を確認するという方法がとられます。

今回は、自分の公開鍵で暗号化したメールを自分のアドレスに送る形で説明しますので、このあたりの説明は省かせていただきます。他人の公開鍵を扱う方法はUbuntuの公式ドキュメントを確認してください。Software Design 2011年11月号のUbuntu Monthly Reportでも、知人と公開鍵を交換しお互いに署名を行うGPGキーサインについて紹介しています。

今回は以下の3つのメーラーで自分自身に暗号メールを送り、解読する方法を説明します。

  • Thunderbird/Enigmail
  • Sylpheed
  • Chromium/cr-gpg

Thunderbird/Enigmail

Ubuntu 11.10から標準のメーラーになったThunderbirdはEnigmailと呼ばれるアドオンを導入することで、PGPメールを扱えるようになります。

EnigmailはThunderbirdのアドオンマネージャーからはもちろんのこと、ソフトウェアセンターからもEnigmailで検索してインストール可能です。

インストールが終わってThunderbirdを一度再起動したら、メニューの「OpenPGP→設定ウィザード」を選択して初期設定を行います。基本的に初期設定のままで良いでしょう。Thunderbirdは、初期状態だとHTML形式で編集するため、常にプレーンテキスト形式にしたい場合は、⁠編集→アカウント設定」にある「編集とアドレス入力」「HTML形式でメッセージを編集する」のチェックを外しておいてください。

暗号化メールの送信

送信メールの編集画面のツールバーに、OpenPGPのボタンが現れますので、これを使って、署名・暗号化を行います。標準ではインラインPGPとして暗号化しますが、このボタンからPGP/MIMEを指定することも可能です。本文はISO-2022-JPのテキストをそのまま暗号化します。また、添付ファイルが存在する場合は、添付ファイルも暗号化するかどうか、その方式はどうするかを個別に設定できます。

図1 送信ウィンドウでOpenPGPのボタンから暗号化にチェックを入れておくと、送信時に暗号化される
図1 送信ウィンドウでOpenPGPのボタンから暗号化にチェックを入れておくと、送信時に暗号化される

暗号化する際に使用する公開鍵は、宛先のメールアドレスから自動的に検出してくれますし、OpenPGPメニューの設定画面から、メールアドレスごとに処理を変えることも可能です。

図2 例えばGPGメールに対応していない環境から見ると、このように暗号化された状態で見える
図2 例えばGPGメールに対応していない環境から見ると、このように暗号化された状態で見える

暗号化メールの復号

受信したメールの復号は、インラインPGP、PGP/MIMEともにパスフレーズを入力すれば、自動的に行ってくれます。

ただし、インラインPGPについてはCharsetフィールドが存在しない場合は文字エンコーディングをISO-2022-JPと仮定してデコードするらしく、後述のcr-gpgから送ったテキストは文字化けします。

図3 公開鍵があるなら、自動的に復号される。本当に暗号化メールかどうかはCtrl-Uでメールの生データを見てみよう
図3 公開鍵があるなら、自動的に復号される。本当に暗号化メールかどうかはCtrl-Uでメールの生データを見てみよう

添付ファイルはPGP/MIME形式の場合そのまま復号しますが、インラインPGPの場合は添付ファイルを右クリックして表示か保存を選んでください。

Sylpheed

軽量で使いやすく、Lubuntuの標準のメーラーになったSylpheedは、標準でPGP/MIMEの送受信に対応しています。鍵についても、何も設定しなくてもホームディレクトリの鍵を使用してくれますので、起動するだけで簡単に暗号化メールを送受信できます。

暗号化メールの送信

署名や暗号化は、メールの作成ウィンドウを開いて、⁠PGP署名」⁠PGP暗号化」にそれぞれチェックを入れるだけです。これだけで、メール送信時にPGP/MIMEにしてくれます。SylpheedもISO-2022-JPのテキストをそのまま暗号化しますが、こちらはEnigmailと異なり暗号化本文の方にContent-Typeで文字コードを指定するようです。

図4 Sylpheedはウィンドウに署名・暗号化チェックボックスがある
図4 Sylpheedはウィンドウに署名・暗号化チェックボックスがある

「設定→現在のアカウントの設定」の個人情報タブを開けば、⁠暗号化にASCII包装形式を使用する」にチェックを入れることでインラインPGPで送信できます。ただし、この設定は推奨されない旨のダイアログが出ます。

暗号化メールの復号

PGP/MIMEのメールで、鍵をもっていれば、添付ファイルも含めて自動的に復号してくれます。インラインPGPには未対応ですが、アクションを設定することで対応可能です。⁠設定→アクション」から、署名確認用と復号用の2つのアクションを入力します。

メニュー名:署名確認
アクション:gpg --no-tty --verify %p

メニュー名:復号
アクション:* gpg --no-tty --command-fd 0 --passphrase-fd 0 --decrypt %p | nkf -w |

復号アクションでは文字コードを自動判別しUTF-8に変換するためにnkfコマンドを使っていますので、nkfパッケージをインストールしておいてください。

これで復号したいインラインPGPメールを開いた状態で、⁠ツール→アクション→復号」を選べば、パスフレーズ入力後に復号されたメールを閲覧できます。nkfで文字コードを自動判別させているので、cr-gpgからの暗号化メールでも文字化けすることなく読めます。

図5 PGP/MIMEなので、添付ファイル扱いになっている
図5 PGP/MIMEなので、添付ファイル扱いになっている

Chromium/cr-gpg

GMailを常用していると、ブラウザーからメールの暗号化や復号はできないかと思うことがあるでしょう。

過去にFireGPGというGMailインターフェースにも対応したFirefox向けアドオンが存在したのですが、現在は開発を終了しています。

しかし昨年、cr-gpgというGMailにも対応したChromium向けの拡張機能が登場しました。まだアルファ版ではあるものの、これを使えばブラウザー上のGMailからでも、メールの暗号化や復号ができます。

まずはサイトからcrxファイルをダウンロードしてChromiumにインストールしてください。また、現在は英語版のGMailインターフェースしか対応していません。GMailの設定画面から「表示言語」「English(UI)」に変更しておいてください。

暗号化メールの送信

暗号化はメールの作成画面で相手のメールアドレスを入力した状態で、本文の入力ボックスの上にある"Encrypt Message"をクリックするだけです。ちなみに、一度クリックすると元に戻せなくなるので、メールを送る直前にクリックするようにしましょう。あとは普段と同様に送信するだけです。

形式はインラインPGPで、文字コードはUTF-8として送られます。このため、Thunderbird/Enigmailでは文字化けしますので注意してください。ただし、データその物が文字化けしているわけではないので、Sylpheedのように別途GPGコマンドで復号して、普通のテキストエディタで閲覧すれば問題なく内容を確認できます。

図6 一度暗号化するとこのように編集できなくなってしまうので注意が必要
図6 一度暗号化するとこのように編集できなくなってしまうので注意が必要

暗号化メールの復号

署名・暗号化されたメッセージを受信した場合は、返信ボタンの隣に復号用の鍵ボタンと、署名確認用のチェックボタンが現れます。ここで、鍵ボタンを押せばパスフレーズを入力して復号できます。

こちらも対応しているのはインラインPGPだけです。PGP/MIMEなメールは、cr-gpgのインターフェースでは復号できません。個々のパートをダウンロードして復号する必要があります。また、Enigmailが送ってくるインラインPGPはISO-2022-JPになるので、これも復号すると文字化けします。

図7 鍵アイコンをクリックするとパスフレーズが問われる
図7 鍵アイコンをクリックするとパスフレーズが問われる

おすすめ記事

記事・ニュース一覧