仕事で暗号化メール(PGP)を使う必要があっていろいろ調べておるのですが, どうにもサポート状況がメーラー(やそのプラグインなど)によってまちまちで 気軽に使えるものでもなさそうです.
あまりまとまりがないですが,調べた範囲のことをメモしておこうと思います.
PGPに関連するソフトウェア
- GnuPG
- OpenPGPの実装の一つです.
- Gpg4win
- Windows用のGnuPGとそのフロントエンドを含むパッケージです.このページでは安定版である2.3.3と,ベータ版である3.0.0-beta187を使って検証しています.
- GpgOL
- Gpg4winに含まれるOutlook拡張です.現在の安定版であるGpg4win 2系に付属するものと,ベータ版である3系に付属するもので動作が大きく異なります.
- Enigmail
- ThunderbirdでPGPを使えるようにする拡張です.
- Sylpheed
- Linuxなどでよく使われているPGPに対応したメーラーの一つです(Windows版あり).ただし,GnuPGとの連携が必要です.
- Claws-Mail
- PGPに対応したメーラーの一つで,英語圏ではよく言及されるように思います.これも,GnuPGとの連携が必要です.
- Mailvelope
- GmailでPGPを扱うためのChrome/Firefox拡張です.ただし,仕組み上PGP Inlineにしか対応していません.
PGPのメッセージフォーマット
電子メールのメッセージフォーマットと言えばMIMEです. PGPでメッセージを暗号化したり署名したりする場合には,二つの方法があります.
- PGP Inline
- ASCIIアーマー形式の暗号化文を普通のMIMEに書き込む方法
- PGP/MIME
- PGP用に拡張されたMIMEを利用する方法
前者は要するに本文に”—–BEGIN PGP MESSAGE—–“で始まるPGPの暗号化データを貼り付けるのと 同じことです.シンプルな反面,添付ファイルを直接的に扱えないという欠点があります. ただし,暗号化したファイルをMIMEの添付ファイル(“multipart/mixed”)として送るという手は ありますが取り回しが面倒です.
対して後者は,メールの本文のContent-Typeに”multipart/ecrypted”や”multipart/signed”を 指定する方法です.普通の”multipart/mixed”に似ますが,どのサブパートにPGPのデータが来るかが決まっています.
これらはPGP固有というよりRFC1847 で定義されているもので,RFC1847の上でOpenPGPを扱う際の取り決めがRFC3156 で定義されています.
メッセージフォーマットのサポート状況
PGP対応を謳っているメーラーおよびプラグインではほとんどがPGP/MIMEをサポートしていますが, 一部PGP/MIMEを扱えないものもあります.
以下は全てWindows版での調査です.
メーラー | PGP Inline | PGP/MIME | ||
---|---|---|---|---|
作成可能 | 解釈可能 | 作成可能 | 解釈可能 | |
Outlook 2010 + GpgOL(Gpg4win 2) | ○※1※2 | ○※2 | × | ○ |
Outlook 2010 + GpgOL(Gpg4win 3+) | × | × | ○ | ○ |
Thunderbird(45.3.0) + Enigmail(1.9.5) | ○ | ○ | ○ | ○ |
Slypheed 3.5.1 | × | × | ○ | ○ |
Claws Mail 3.14.0 | ○ | ○ | ○ | ○ |
Gmail + Mailvelope | ○※1 | ○※3 | × | × |
- ※1 暗号化と署名の両方を同時にはできない.
- ※2 RFC2440で定義されているクリアテキスト署名の作成/検証ができない(メッセージの後ろにPGPデータを付与するだけ).
- ※3 GmailのUI上のテキストを拾って検証するので,送信元がUTF-8のデータに署名していない限りはほぼ確実に検証に失敗する(実質オマケ程度の機能とみるべき).
PGP/MIME対応で暗号化と署名を同時に行う場合,その処理方法に2通りのバリエーションがあります. RFC3156ではこれに関してRFC1847 Encapsulationと Combined methodの方法を定義しています.
- RFC1847 Encapsulation
- RFC1847の署名付きメッセージを暗号化メッセージとして埋め込む方法です.

- Combined method
- OpenPGPの暗号化データ自体に署名を埋め込む方法です.

PGP/MIME対応のメーラーで,暗号化と署名を行う場合どちらの形式で送るのかを調べてみました.
メーラー | メソッド |
---|---|
Outlook 2010 + GpgOL(Gpg4win 3+) | RFC1847 Encapsulation |
Thunderbird(45.3.0) + Enigmail(1.9.5) | Combined method |
Slypheed 3.5.1 | Combined method |
Claws Mail 3.14.0 | RFC1847 Encapsulation |
古いThunderbirdだと,RFC1847 Encapsulation形式(というより”multipart/signed”)を解釈できないという バグがありました(38.5で確認)が, 現在は修正されているようです.
暗号時の文字コードの問題
PGP/MIMEを使う場合,暗号化する平文はMIMEフォーマットである必要があります.

ですので,通常のメールと同じくメッセージ本文の文字コードが7bitコードならそのまま, それ以外なら何らかの形式(Quoted printableやBase64など)で7bit化する必要があります.
この部分に関して奇妙な動作をするメーラーがあります.
以下は文字コードとしてISO-2022-JPを指定してメッセージ(text/plain)を暗号化して送った際の, 暗号化文内のContent-TypeヘッダのcharsetパラメータとContent-Transfer-Encodingヘッダ, そしてメッセージそのものの文字コードを調査した結果です.
メーラー | charset | Content-Transfer-Encoding | 実際の文字コード |
---|---|---|---|
Outlook 2010 + GpgOL(Gpg4win 3+) | UTF-8 | Base64 | UTF-8 |
Thunderbird(45.3.0) + Enigmail(1.9.5) | ISO-2022-JP | Quoted-printable | Quoted-printable化したISO-2022-JP |
Slypheed 3.5.1 | ISO-2022-JP | 7bit | ISO-2022-JP |
Claws Mail 3.14.0 | ISO-2022-JP | 7bit | ISO-2022-JP |
EnigmailはISO-2022-JPで送ってくれるものの,Quoted-printableにするという余計なことをしてくれます. ISO-2022-JPはそもそも7bitコードなので,Quoted-printableにする必要は全くないのですがMIME的には Quoted-printableしても問題はありません.ただ,これを正しく処理できないメーラーもあるように思います. (RFC3156で「署名されるデータは7bit化しなければならない」と 定めているのをおおざっぱに実装して暗号化時にも適用しているのかも知れません).
最大の問題はOutlook 2010 + GpgOL(Gpg4win 3+)が,メーラー上で文字コードとして何を指定しようと, UTF-8で送ってしまうという点,そしてUTF-8以外で書かれたものを解釈できないという点です.
Outlook自体は,文字コードに正しく対応しているのでGpgOLが文字コードを上手く扱えていないのだと 思います.
暗号文をやりとりするコミュニティにOutlook使いが居る場合は,必ずUTF-8でメッセージを投げる必要がありそうです.