「プライベートな(プライバシーが守られる)メッセンジャーアプリ」とは何でしょうか?「送受信されるメッセージが暗号化されていれば、どんなメッセンジャーアプリだってプライバシーを守っているんじゃない?」と言われる方も多いと思われますが、実のところ、メッセージのプライバシーというのは、それよりもずっと複雑なのです。ローランド・シリング(Roland Schilling)氏とフリーダー・シュタインメッツ(Frieder Steinmetz)氏は、Chaos Communication Congress(33C3)で行った講演で、プライベートなメッセンジャーアプリとは何か、また「プライベート」と銘打つメッセンジャーアプリにはどのような特性が必要かについて、わかりやすく説明してくれました。
「プライベートな会話」の6本の柱
シリング氏とシュタインメッツ氏はプライベートな(プライバシーが守られる)メッセージング」という考えを理解するにはパーティで密談をする場面を想像してほしい、と述べました。人の多い場所でこっそり会話をするにはどうしますか?おそらく、話したい相手以外、誰も会話を聞くことのできない、奥まったところにある部屋を探すでしょう。
これがプライベートな会話の第1条件です。面と向かった会話でも、オンラインでのやりとりでも、機密性が必要です。あなたと話し相手以外の誰かが、話の内容を聞くことができてはならないのです。
第2の条件は真正性です。会話の相手が話をしたい本人であることの確証が必要です。リアルに会うならば相手の顔で識別できますが、オンラインのやりとりではそうはいきません。
さらに、その会話が非常に重要である場合…まあ、密談というのは普通そういうものですが…あなたの話の内容が一言一句漏らさず相手に伝わっていること、また相手の話を自分がきちんと自分に伝わっていることの確証を得たいものです。さらに、あなたの言っていることを相手が正確に受け止めたかどうかも確認したいところです。プライベートなオンラインのやりとりで言えば、第三者によってメッセージが壊されていないことを確認する必要があります。これが第3の条件である完全性の概念で、プライベートなメッセージングでも重要です。
さて、ここで会話に関係のない人が部屋に入ってきて、会話の一部を聞いてしまったとしましょう。実際の会話では、この第三者が知っているのは聞いてしまった部分だけで、部屋に入る前や、部屋から出たあとの話の内容を知ることはできません。しかし、インターネット上ではすべてが永遠に記録されますし、オンラインでの会話はオフラインほど単純ではありません。ここでさらに2つ、プライベートメッセージングにおける重要な概念、前方秘匿性と後方秘匿性が登場します。
前方秘匿性は、第三者が部屋に入ってくる前に行われていた会話の内容を、後方秘匿性は部屋を出たあとの会話の内容を、その第三者が知ることを許さないという概念です。
さて、あなたの会話がとてもデリケートな話題に関するものだったと仮定しましょう。その話題についてあなたがこう言ったと誰かから非難された場合、それを否定したくなるかもしれません。これがプライベートな会話であれば、会話の内容を引用できるのは、あなたと会話の相手だけですから、あなたは「私が言ったのではない、あなたが言ったのだ!」と相手を非難することになります。これでは、誰も何も証明できません。ここで登場する重要な概念が、否認可能性です。
メッセンジャーアプリへのプライバシーの実装
以上が、プライベートなメッセンジャーアプリが必要とする6本の柱です。これらが実装されて初めて、そのアプリを「プライベートを守っている」と言うことができます。リアルな世界での顔をつきあわせた密談であれば簡単に実現できますが、メッセンジャーサービスには常に「サービスそのもの」という第三者が存在します。この第三者を念頭に置いて、6本の柱を実装するにはどうすればいいでしょう?
機密性は、暗号化により確保できます。暗号化には基本的に対称暗号化と非対称暗号化の2種類があり、後者は公開鍵暗号化とも呼ばれます。プライベートなメッセージング(この講演では、シリング氏とシュタインメッツ氏はThreemaを例に取り上げていました)はこの両方の暗号化方式を使用し、1人の利用者の公開鍵ともう1人の利用者の秘密鍵から共通鍵を作成します。また、1人目の秘密鍵と2人目の公開鍵から作ることもあります。暗号化で行われている計算では、どちらでも同じ効果を得られます。
したがって、この一組の利用者が手にする共通鍵はまったく同じで、この2人に専用の鍵です(他の利用者ペアが同じ鍵を受け取ることはありません)。アプリは単独でこの鍵を生成しますが、機密性を確保するため、鍵の転送は行いません。双方の利用者は、会話をすることにした直後にこの鍵を受け取ります。
この方法は、完全性の確保にも利用されます。すでに暗号化されているテキストに第三者が何らかの編集を加えると、そのテキストは読めなくなります。この場合、あなたの会話の相手に届くのは、あなたが送信したメッセージか、メッセンジャーアプリが暗号文を復号化できなかった場合はエラーメッセージです。
機密性をさらに高めるために、あなたと相手が会話をしているという事実自体を隠してしまいたい場合もあるでしょう。これは、暗号化のレイヤーをもう1つ追加することで実現できます。この場合、まず、あなたの送信したメッセージは、あなたと会話相手の共通鍵を使って暗号化されます。いわば、宛先の書かれた封筒にメッセージを入れるようなものです。その後、これがもう一度、暗号化され、別の封筒に入れられて、メッセンジャーサーバーのアドレスに送信されます。ここでは、あなたの鍵とサーバーの鍵に基づいて生成された鍵が使用されます。
さて、この封筒に入った封筒はメッセンジャーサーバーに配達されます。中身を知ろうとする第三者がこの封筒を見ても、あなたが送信したことはわかりますが、最終的な宛先はわかりません。メッセンジャーサーバーは、外側の封筒を開いて、宛先のアドレスを確認し(メッセージ自体は読めません)、中に入っていた封筒をさらに別の封筒に入れて、受信者に送信します。この時点で、第三者に見えるのは、メッセンジャーサーバーから受信者へ宛てた封筒だけです。どこから送られてきたかはわかりません。
たくさんの封筒があちこち飛び交っているので、あなたのメッセージを誰が受け取るか、追跡するのは困難です…が、不可能ではありません。もし、すべての封筒の重さを量れば、まったく同じ重さの2枚の封筒を見つけて、あなたと会話の相手を結びつけることができます。このようなことが起きないように、システムは、すべての封筒にランダムな重さの「おもり」を追加し、あなたが送った封筒と、相手が受け取る封筒の重さが絶対に同じにならないようにします。
真正性の確保はさらに困難です。メッセンジャーアプリの中には、メールアドレスや電話番号をユーザーIDに使用しているものがあります。利用者はメールアドレスや電話番号を使って、自分がその本人であると主張するのですが、このような個人情報をアプリと共有したくないという人もいるでしょう。Threemaなど、一部のアプリは個人情報とは関係のないIDを使用し、身元証明の際にはQRコードを相互に渡し合うよう推奨しています。
この例で言う否認可能性は、会話している2人にすべてのメッセージを送信することで実現できます。2人とも使っている鍵は同じですから、両者ともそのメッセージを送信できた可能性があります。したがって、第三者が受信メッセージを傍受し、復号化できたとしても、送信者が誰であるかは確認できません。
機密性、真正性、完全性、否認可能性にはこれで対応できます。前方秘匿性と後方秘匿性はどうでしょう?ある人が常に同じ秘密鍵と公開鍵を使用している場合、共通鍵が漏洩すると、第三者はそれ以前のメッセージと将来のメッセージの両方を復号化できてしまいます。
これを防ぐため、サーバーは定期的に鍵を再発行する必要があります。たとえば、鍵が1か月に一度再発行される仕組みならば、盗み見ようとする者が会話履歴を読めるのはその1か月限定で、新しい鍵が発行されると同時に、会話を見ることができなくなります(実際の鍵は、これよりも頻繁に再発行されています)。
まとめ
以上、非常に簡単ですが、プライベートなメッセージングの概念をご紹介しました。現代のメッセンジャーアプリはメディアファイルやグループチャット、時にはビデオ通話などにも対応しなければならないため、実際はもっと複雑です。
さらに詳しく知りたいという方は、33C3で撮影された次の動画をご覧になることをお勧めします(英語動画)。この動画では、シリング氏とシュタインメッツ氏が基本的な概念だけでなく、Threemaをどのようにリバースエンジニアリングし、主要なプライバシーの原則の実装方法を解明したかについても説明しています。非常に興味深い内容なので、お楽しみいただければと思います。