web-dev-qa-db-ja.com

WhatsAppで使用されるシグナルプロトコルはどのように機能しますか?

シグナルプロトコルのプロセスを理解したい。私はそれをググっていますが、良い記事やチュートリアルを見つけることができません。

Signal Protocolの基本的な定義と機能を理解したいのですが、プロセスを説明する図が利用できればすばらしいと思います。

19
Taha Kirmani

これをご覧ください テクニカルホワイトペーパー WhatsAppから、最近e2e暗号化用のシグナルプロトコルに移行しました。

公開鍵のタイプ

  • _Identity Key Pair_ –インストール時に生成される長期のCurve25519キーペア。
  • _Signed Pre Key_ –インストール時に生成され、IDキーによって署名され、定期的にローテーションされる中期的なCurve25519キーペア。
  • _One-Time Pre Keys_ –インストール時に生成され、必要に応じて補充される、1回限りの使用のためのCurve25519キーペアのキュー。セッションキーのタイプ
  • _Root Key_ –チェーンキーの作成に使用される32バイトの値。
  • _Chain Key_ –メッセージキーの作成に使用される32バイトの値。
  • _Message Key_ –メッセージの内容を暗号化するために使用される80バイトの値。 AES-256キーには32バイト、HMAC-SHA256キーには32バイト、IVには16バイトが使用されます。

セッションを確立するには:

  1. 開始クライアント(「開始者」)は、受信者に対してパブリック_Identity Key_、パブリック_Signed Pre Key_、および単一のパブリック_One-Time Pre Key_を要求します。
  2. サーバーは、要求された公開鍵の値を返します。 _One-Time Pre Key_は1回だけ使用されるため、要求された後、サーバーストレージから削除されます。受信者の_One-Time Pre Keys_の最新のバッチが消費され、受信者が補充しなかった場合、_One-Time Pre Key_は返されません。
  3. 開始者は受信者の_Identity Key_をIrecipientとして、_Signed Pre Key_をSrecipientとして、_One-Time Pre Key_をOrecipientとして保存します。
  4. イニシエータは、エフェメラルなCurve25519キーペアEinitiatorを生成します。
  5. イニシエーターは、独自の_Identity Key_をIinitiatorとしてロードします。
  6. イニシエーターは、master_secret = ECDH(Iinitiator, Srecipient) || ECDH(Einitiator, Irecipient) || ECDH(Einitiator, Srecipient) || ECDH(Einitiator, Orecipient)としてマスターシークレットを計算します。 _One Time Pre Key_がない場合、最後のECDHは省略されます。
  7. イニシエーターはHKDFを使用して、_Root Key_から_Chain Keys_および_master_secret_を作成します。

セッション設定の受信

実行時間の長い暗号化セッションを構築した後、開始者は、受信者がオフラインであってもすぐに受信者へのメッセージの送信を開始できます。受信者が応答するまで、イニシエーターは、受信者が対応するセッションを構築するために必要な情報を(送信されるすべてのメッセージのヘッダーに)含めます。これには、イニシエーターのEinitiatorおよびIinitiatorが含まれます。

受信者がセッション設定情報を含むメッセージを受信すると、次のようになります。

  1. 受信者は、独自の秘密鍵と着信メッセージのヘッダーでアドバタイズされた公開鍵を使用して、対応する_master_secret_を計算します。
  2. 受信者は、開始者が使用した_One-Time Pre Key_を削除します。
  3. イニシエーターはHKDFを使用して、対応する_Root Key_および_Chain Keys_を_master_secret_から派生させます。
17
joshperry