X3DH Key Agreement Protocol

5494 ワード

ソース:https://signal.org/docs/specifications/x3dh/x3dh.pdf

きほんげんそ

  • curve : X25519 or X448
  • ハッシュ:256または512ビットハッシュ関数(SHA-256、SHA-512など)
  • info:アプリケーション名ASCII String
  • 定義#テイギ#


    DH(PK1, PK2)


    デジタル鍵交換は暗号化鍵を交換する方法であり、暗号化されていない通信網を介して公開鍵を交換する方法である.代表的な公開鍵暗号化方式RSA.
    DH(PK 1,PK 2)は、公開鍵を含む鍵対から導出されたデバイス−ヘルマン鍵交換の結果を指す.
    https://cryptography.io/en/latest/hazmat/primitives/asymmetric/x25519/
    from cryptography.hazmat.primitives import hashes
    from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
    from cryptography.hazmat.primitives.kdf.hkdf import HKDF
    
    private_key = X25519PrivateKey.generate()
    # another private key from other person
    peer_public_key = X25519PrivateKey.generate().public_key()
    shared_key = private_key.exchange(peer_public_key)

    Sig(PK, M)


    これは、バイトシーケンスMのXEdDSAに署名し、公開鍵PKによって認証された状態であることを意味する.
    具体的には,Mに署名しながらPKの秘密鍵を利用する.

    KDF(KM)


    これはHKDFアルゴリズムから導出した32バイトの結果を意味する.
  • HKDF inputはF|KM、Fは0 xFFからなるバイトシーケンスである.
    曲線がX 25519の場合は32バイト、X 448の場合は57バイトの0 xFFを使用します.
    Fは、XEdDSAで暗号化ドメインを分離するために使用される.
  • HKDF salt hash出力長と同じ0 x 00バイトシーケンス
  • HKDF infoはinfoパラメータ
  • を含む

    シミュレーション


    非同期、オフラインでメッセージを送信したり、鍵を交換したりすることもできます.
  • Alice:Bobに暗号化されたデータを送信し、今後の双方向会話で共有鍵が使用されることを確認したい.
  • Bob:Aliceのような人に共有鍵を確立してもらいたいです.ただし、Aliceがこの操作を試みるとオフラインになる可能性があります.そのため、サーバとの関係を確立する必要があります.
  • サーバ:メッセージ(Alice→Bobから転送)を保存することで、Bobは後で受信できます.Bobからデータを受信し、Aliceなどに転送します.
  • キーの種類

    Bobの鍵配布


    すべて公開鍵です
  • IK(B)
  • SPK(B)
  • Sig(IKB, Encode(SPKB)) : prekey signature
  • (OPK(B)1, OPK(B)2, OPKB(3, . . . ) : one set of Bob's one-time prekeys
  • identity keyはサーバに一度だけ送信されます.
    one-time prekeysが送信されることが多い.サーバの残りの部分が切れた場合、サーバは要求します.
    Signed PrekeyとPrekey署名は、特定の期間に1回(週または月に1回)アップロードされます.
    新しい秘密鍵をアップロードすると、古い鍵に対応する秘密鍵が保持され、Bobがそれを使用するメッセージを受信すると削除されます.)

    初期メッセージの送信


    AliceはBobの「Key Bundle」を取得し、その内容は以下の通りです.
  • IK(b)
  • SPK(b)
  • Sig(IKB, Encode(SPKB))
  • (Optionally ... )OPK(B)1
  • サーバはOPK(B)に1つ(存在する場合)を提供し,提供後に削除する.
    BobのOPKがすべて削除されると、ビームにはOPKは存在しません.
    Aliceはprekey署名をチェックし、認証に失敗するとプロトコルを破棄します.
    ビームにOPK(B)がない場合:

    ビームにOPK(B)がある場合:

    結果は以下の通りです.

    DH 1、DH 2は相互認証を提供し、DH 3とDH 4は追加のセキュリティを提供します.
    SKを計算すると、AliceはEK(A)とDH値を削除します.
    次に、ADという名前の「関連データ」バイトシーケンスを計算します.
    AD = Encode(IK(a)) ||  Encode(IK(b))
    # AD 에 usernames, certificates 등 identifying information을 추가할 수 있음.
    アリスついに!Bobに初期メッセージを送信し、
  • IK(A) : Alice Identify Key
  • EK(A) : Alice Ephemeral Key
  • Identifier:AliceはBobの前鍵に何を使用しましたか
  • イニシエータCiphertext:ADをデータとして、(SK自身またはSKから導出されたPRF鍵)を暗号鍵として、AEAD暗号化により暗号化する.
  • この初期メッセージには、post-X 3 DHプロトコルのfirst message役割、AliceのX 3 DH初期メッセージの一部の2つの役割があります.
    その後、Aliceは(SKまたはSKから取得した鍵)を使用してpost-X 3 DHプロトコルの範囲内でBobと通信を継続する.

    Security Considerations


    4.1. 資格認定


    IK(A)とIK(B)は、別々の経路(QRコード確認、デジタル確認等)で認証しなければならない.
    この認証を実行しないと、誰と通信するかのパスワード保護を取得できません.

    4.2. プロトコルリプレイ


    Aliceの初期メッセージがOPK(B)を使用していない場合、Bobに再生され、Bobが受け入れるリスクがあります.
    ...(詳細は後ほど)