web-dev-qa-db-ja.com

Diffie–Hellman鍵交換の質問

現時点では、2人以上のクライアントが同時に通信できるチャットアプリケーションに取り組んでいます。

暗号化を始めたばかりなので、我慢してください。

私の目標は、エンドツーエンドの暗号化を実装することです。そのため、いくつかの調査を行い、Diffie–Hellman key exchange。私はそれがどのように機能するのかについての簡単なアイデアを持っています。

ウィキペディアでは、それは次のように機能すると述べています:

  1. 大きな素数を決定し、それをPと呼びます。
  2. gはprimitive prime root of P.
  3. 各クライアントは、次の条件に従う任意の秘密鍵を選択します:1<= Private_key <= P
  4. 彼らは次のように生成された秘密鍵を送信します:(g^private_key) mod Pover the server
  5. 秘密の共有キーは(User2PublicKey^User1PrivateKey) mod Pおよびその逆(User1PublicKey^User2PrivateKey) mod P

あなたへの私の質問は:

  • これはマルチクライアントチャットで機能しますか? 3つのクライアントの接続をエミュレートするために紙の上でいくつかの試みをしましたが、同じ共有キーを取得できませんでした。もしそうなら、その例を教えていただけませんか?
  • ばかげて聞こえるかもしれませんが、P、g、およびキーは単なる整数ですか? Pが139のように、g 37などになるでしょうか。
  • メッセージを受信者の公開鍵で暗号化する代わりに、秘密の共有鍵を使用できませんか?接続されている各クライアントのメッセージの暗号化を回避するため。
  • Pとgはサーバー側で生成できますか?
  • 誰かがこれをJavaで実装する例を教えてもらえますか?
1

既存のアルゴリズムへの実装を記述したり、アルゴリズムを設計したりしてはなりません。アルゴリズムは本からピックアップし、ライブラリから実装する必要があります。

上記の点に留意して、プロトコルに認証要素が含まれていないため、Diffie HellmanはMITM攻撃に対して脆弱であることを覚えておいてください。機密保持のため、SSLの使用をお勧めします。

エンティティBの自己署名証明書を生成します。エンティティAは証明書のコピーを持ち、それを信頼します。エンティティBが認証されます。 Aの認証のために、Aが表し、Bが検証する事前共有秘密を持つことができます。

Node.jsでのDKE実装のドキュメントを参照できます- https://nodejs.org/api/crypto.html#crypto_diffiehellman_computesecret_otherpublickey_inputencoding_outputencoding

1
Karan Bansal