End to End Encryption

概要

End To End Encryption (E2EE) は自分だけが知っている鍵を利用してデータを暗号化することで自分以外はデータの復号をできなくする仕組みです。 ストレージに保存する場合などに利用されていましたが、最近ではメッセージングやメディアフレームの仕組みにも利用されています。

End to End Message Encryption

今までメッセージングの世界で利用されていた E2EE はクライアント同士がセッションをはり、 全員に対してそれぞれの鍵でメッセージを個別に送ります。これは Client Fan-Out と呼ばれています。

End to End Media Encryption

映像や音声のメディアフレームを E2EE で利用する場合は End to End Media Encryption (E2EME) とも呼ばれています。

全員にメディアフレームを送るのは負荷が高すぎるため、事前に貼ったセッションで送信者がら鍵を共有します。 この仕組は事前似鍵を送っておくしくみのため Sender Keys と呼ばれています。

Client Fan-Out

X3DH と Double Ratchet を利用した仕組みで、それぞれのクライアントとセッションを貼ったため、 一つのメッセージをそれぞれのセッションごとに暗号化して送るのが Client Fan-Out 方式です。

この方式は参加者が増えれば増えるほどメッセージの送信数が多くなります。 ただメッセージングではそんなにメッセージの量を送らないことから多くの E2EE サービスで採用されています。

Sender Keys

X3DH と Double Ratchet を利用した仕組みを利用し、 音声や映像に利用する暗号化/復号用の鍵を導出するためのマテリアル鍵を共有するのが Sender Keys 方式です。

Alice と Bob と Carol と Dave の 4 人で E2EE を利用したテレビ会議を行うことにします。

まず Alice が会議に参加します。一人なのでマテリアル鍵を生成し、そこから導出した共通鍵を利用し、暗号をかけて WebRTC SFU に音声と映像を送信します。 ここに Bob が参加してきます。Alice は Bob が「参加したこと」を通知されたら、Bob と X3DH を行い、 その後 Double Ratchet を用いて、マテリアル鍵を共有します。 Bob も同様 Alice にマテリアル鍵を共有します。

ここに Carol が参加してきます。Alice も Bob も Carol と X3DH を行い、それぞれマテリアル鍵を共有します。

一通り話したあと、 Carol が会議から抜けます。この時 Alice と Bob は新しくランダムなマテリアル鍵を生成し、 それぞれ双方に送ります。誰かが離脱した場合は新しくマテリアル鍵を生成し他のメンバーに配布する必要があります。

NewMaterialKey = HKDF-SHA256(PreviousMateriarlKey, "", "RatchetKey")

ここで Dave が会議に参加してきます。全員が X3DH を Dave と行い、現在のマテリアル鍵を共有します。

つまり参加の場合は既存参加者全員が新規参加者と X3DH と Double Ratchet を利用してマテリアル鍵の共有を行い、 既存参加者は他の既存参加者のマテリアル鍵を新しくローカルで生成します。

参加

  • 既存参加者は HKDF-SHA256 を利用して既存のマテリアル鍵から新しいマテリアル鍵を生成

  • 新規参加者は既存参加者全員と X3DH と Double Ratchet でマテリアル鍵を共有する

離脱

  • 残ってる全員が新しくマテリアル鍵を生成し再配布する