OTRでオフレコチャット!

前回の記事で (Perfect) Forward Secrecy (FS) のテーマを取り上げたが、これは TLS/SSLだけに限定した話ではない。そこで今回はメールやチャットなどのメッセージングの話題を取り上げたいと思う。

PGP

メールにおける End-to-Endの暗号化としては Pretty Good Privacy (PGP) が以前から広く使われている。NSAの内部情報をリークした Edward Snowden氏もジャーナリストと連絡を取るにあたって、必ずPGPによる暗号化を行うように要求したという。さて、PGPでは各メッセージの暗号化に使われるセッション鍵 (毎回ランダムに生成される) を受信者の公開鍵で暗号化して送る。また各メッセージのハッシュに対して送信者の秘密鍵を用いて署名を行う。一方の受信者は自身の秘密鍵でセッション鍵を復号し、この鍵で暗号化されたメッセージを復号する。また送信者の公開鍵で署名を検証することができる。PGPではこのような仕組みによって、送信されるメッセージの秘匿性と、送信者の認証を実現している。(暗号化と署名の両方とも RSAを使うか、暗号化に ELG + 署名に DSAという組み合わせで使われる。)

ここで PGPによって暗号化されたメールを通信経路上で盗聴できる攻撃者を想定しよう(NSAがまさにこの攻撃者に該当する)。この攻撃者は受信者の秘密鍵を持っていないため、盗聴した暗号メッセージを復号することはできない。しかし将来なんらかの手段によって攻撃者が受信者の秘密鍵を入手(または解読)できた場合、この攻撃者はそれまでに保存したすべての暗号メッセージを復号して見ることができてしまう。

これは前回触れた TLS/SSLにおけるRSA鍵交換と全く同じ問題だと言える。つまりPGPは Forward Secrecyを実現できていない。では FSに対応したメッセージングはないかというと、それが今回紹介する Off-the-Record (OTR) Messagingである。

OTR

Off-the-Record Messaging はその名が示すとおり、メッセージングにおいていわゆる「オフレコ」を実現するための仕組みである。「オフレコ」の会話の場合、会話の内容はその場にいた当事者しかわからない。また録音でもされない限り、その場の発言内容についてあとから誰も証明することができない。当事者達ですらそれは不可能であり、「そんなことは言っていない、言ったという証拠がどこにある」と自らの発言を否定することだってできる。これが「オフレコ」の特徴である。OTRもこれらの特徴を備えている。

OTRが提供する主な機能は以下の4つである。

  1. Encryption (暗号化)
  2. Authentication (認証)
  3. Deniability (否認可能)
  4. Perfect Forward Secrecy (前回の記事を参照)


当事者だけにしかわからないようにメッセージを伝えるためには、相手を認証 (2) した上で相手だけが復号できるように暗号化 (1) を行う必要がある。OTRでは DSAの公開鍵でまず通信相手の確認(認証)を行い、次に Diffie-Hellman鍵交換によって暗号化に必要な共通鍵を生成している。また毎回DH鍵交換を行うことによって Forward Secrecy (4) にも対応している。

OTRがちょっと変わっているのは (3)の性質だろう。「オフレコ」を実現するには発言内容をあとから否認することができなくてはならない。そのため OTRでは第三者が検証できるようなメッセージへの署名は行わない。OTRではメッセージ送信の際に MAC (Message Authentication Code) を付加するが、新しいメッセージを送信する際に古いメッセージの MACに使用した鍵を平文で送信してしまう。そのため古いMAC鍵はもはや当事者だけのものではなくなり、それまでにやりとりされた古いメッセージに限って第三者が偽造することも可能になる。これにより当事者達の否認可能性を実現しているのである。

(OTRの簡単な概要については 2005年のカンファレンス資料 (PDF)がわかりやすいのでオススメ。)


PGPとOTRとの比較

鍵交換 (暗号化) 認証 (署名) FS (PFS)
PGP RSA RSA ×
ELG DSA ×
OTR DHE DSA (署名なし)
OTRの実装

OTRはオープンソースでライブラリとして公開されており、多くのメッセージングソフトが対応している。代表的なソフトウェアとしては、Pidgin (Windos/Mac/Linux), Adium (Mac), IM+ (Android/iOS他) などがある。(Adium, IM+にはOTR機能が組み込まれているが、Pidginではプラグインとして実装されている。)
これらのソフトは Google Talk, AIM, Yahoo!, MSN, Facebook, Twitterなど複数のメッセージサービスに対応しており、これらのサービスの中で OTRを実現することが可能となっている。

OTRの基本的な使い方

使い方は非常に簡単。初回のみ鍵の生成が必要で、また相手先と初めて通信する場合には相手の確認が必要だが、それ以外は通常のチャットと同じように使うことができる。慣れてくれば暗号化されていることを意識することもない。

(1) (初回のみ) 自分の鍵を生成する (送信側、受信側双方とも必要)
(2) OTRによる通信を開始する
(3) (相手毎に最初のみ) 通信相手を確認する (Fingerprintを確認するなど)
(4) OTRによる暗号化通信を行う


OTRでは最初にメッセージ通信相手の確認 (認証) を行う必要があるが、次の 3つの方法が用意されている。
a. Question and Answer 質問とその答え (当事者しか知らない内容)
b. Shared Secret 共通の秘密 (合言葉)
c. Manual Fingerprint Verification 公開鍵のフィンガープリントを確認

a.の方法は、当事者同士しか知りえない内容について質問し、答えが一致すればOK (これは両方向に行なう)。また b.の方法では、なんらかの合言葉をあらかじめ決めておき、双方がその場で正しく入力する必要がある。c.の方法はPGPでも公開鍵の確認に使われている方法で、電話や暗号化メールなど別の信頼できる手段によって相手の公開鍵の Fingerprint情報をあらかじめ入手しておく必要がある。

なお a.は v3.2.0から、b.は v3.1.0からサポートされた比較的新しい認証方法である (現在の最新バージョンは 4.0.0)。そのため実装によってサポートしている方法には違いがある。たとえば Pidginの OTRプラグインは上記の 3つとも対応しているが、Adiumや IM+は Fingerprint方式のみに対応している。
(注:暗号化メッセージを送るだけであれば通信相手の確認なしでもできるが、その場合には MITM攻撃を受ける可能性がある。)

Adiumによる使い方の例

Adiumで Facebookメッセージをやりとりする際に OTRを利用した例を紹介する。

最初に Adiumで Facebookアカウントを追加すると OTR通信用の公開鍵/秘密鍵のペアが生成される。これはいつでも再生成することができる (図1)。

(図1) OTRの鍵生成
f:id:ukky3:20131109085801p:plain


次に通信相手とのチャットをはじめるわけだが、はじめは OTRによる暗号化が無効の状態になっている (図2の鍵アイコンが開いている)。 ここでツールバーの鍵アイコンをクリックして “Initiate Encrypted OTR Chat” を選択すると、OTRによる暗号化通信が開始される (図3)。

(図2) OTR暗号化が無効の状態
f:id:ukky3:20131109085815p:plain

(図3) OTRによる暗号化通信を開始
f:id:ukky3:20131109085835p:plain


次に送信者、受信者双方が通信相手の確認を行う。図4は相手から送信された公開鍵の Fingerprintを示している (下線部)。これをあらかじめ入手ずみのものと比較して本物かどうかの確認を行う。

(図4) 相手の公開鍵の Fingerprintを確認
f:id:ukky3:20131109085843p:plain


これで準備は整った。以降は通常のチャット同じようにメッセージのやりとりを行えばよい。

図5は Adiumでのチャットの様子を示している。赤線で囲まれた中は暗号化されたメッセージだ。同じ内容を Facebookから見たのが図6である。OTRは End-to-Endで暗号化を行なうため、メッセージを復号できるのは鍵を持っているクライアント(今回の例では Adium)だけである。そのため Facebookからは暗号化されたメッセージの中身を見ることはできない。(OTRメッセージが送信されていることは “?OTR” という文字列からわかる。)

(図5) Adium側から見た OTR暗号化通信の様子
f:id:ukky3:20131109085851p:plain

(図6) Facebook側から見た OTR暗号化通信の様子
f:id:ukky3:20131109085859p:plain


あとログを保存する設定にしていると「オフレコ」にならないので、OTRのチャットログは保存しない設定にすることをオススメする。(図7)

(図7) Adiumの設定画面
f:id:ukky3:20131109104425p:plain

まとめ

以上、メッセージングにおいて Forward Secrecyを実現する Off-the-Record (OTR) Messagingについて、その仕組みや簡単な使い方などを紹介した。残念ながらメールのプロトコルで OTR相当のことを実現することはできないが、インスタントメッセージであれば様々なサービスにおいて OTRを使うことができる。NSAによる監視問題をきっかけに、OTRは今あらためて注目されているところだ。EFFなども監視に対抗してプライバイーを守るために OTRの利用をユーザに推奨している。みなさんも一度使ってみてはいかがだろうか。


最後に、今回の記事を書くにあたり、尊敬する友人である辻氏 (@ntsuji) にご協力いただいた。この場を借りて感謝したい。


(参照)
RFC 4880 - OpenPGP Message Format
Off-the-Record Messaging
Ten Steps You Can Take Right Now Against Internet Surveillance | Electronic Frontier Foundation
Encryption Works: How to Protect Your Privacy in the Age of NSA Surveillance | Freedom of the Press Foundation
NSA Surveillance: a Guide to Staying Secure
Opt out of global data surveillance programs like PRISM, XKeyscore, and Tempora - PRISM Break