暗号化メール(PGP)を巡る諸々

仕事で暗号化メール(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 EncapsulationCombined 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でメッセージを投げる必要がありそうです.

Leave a Reply