0

ECDHE アルゴリズムを使用してクライアントとサーバー間で鍵を交換し、両方がメッセージを暗号化するための共通の秘密鍵を導出できるようにする予定です。

私が読んだことに基づいて、ECDHEアルゴリズムを使用するには、両方の当事者(クライアントとサーバー)が最初に「共通の」値(p、g)のペアに同意する必要があります。次に、各当事者は秘密鍵を使用して共有鍵を生成します。つまり、クライアントは秘密鍵 (P1) を使用して共有鍵 (S1) を生成し、サーバーは秘密鍵 (P2) を使用して共有鍵 (S2) を生成します。https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange#説明]

ここでの共通値は、共通ペイントを指します。これらは実際には、共有キーを生成するために両当事者が使用する mod 値 (p) と base 値 (g) です。

次に、両当事者が共有鍵 (S1 および S2) を交換し、それを独自の秘密鍵 (P1 または P2) と共に使用して、共通の秘密 (K) を導出します。

ECDiffieHellmanCng を使用してキーを生成するサンプルを見ると、これらの「共通の」値を指定するオプションがどこにもありません。私たちの場合、クライアントとサーバーの両方が p と g に同意し、それらの値を「ECDiffieHellmanCng」で使用して共通の共有キーを生成することを期待していました。

参照: https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.ecdiffiehellmancng?view=netframework-4.7.2

Alice と Bob が ECDiffieHellmanCng の新しいインスタンスを作成しているように見えますが、どちらも同じ共通の値 (p と g) を内部的に使用していますか?

4

2 に答える 2

4

あなたの質問では、(classic/IFC) Diffie-Hellman を説明する記事にリンクしていますsecret = (g ^^ (alice * bob)) % p。次に、ECDHE について言及し、楕円曲線 Diffie-Hellman に関する .NET の ECDiffieHellman(Cng) クラスについて質問します... IFC (Integer Factorization Cryptography) アルゴリズムの ECC バリアントです。

(IFC)DH には間違いなく、適切な(g, p)組み合わせを選択するというブートストラップの問題があり、中間の人間にだまされません。TLS の場合、接続のサーバー側は必要なものを作成し(g, p)、クライアントに何を選択したかを伝えますが、クライアントはそれがだまされているかどうかを実際に知ることはできません。両側を所有している場合は、2048 ビット空間で品質グループを生成し、それを維持することでこの問題を解決できます。

.NET でインボックスで提供される (IFC) Diffie-Hellman はサポートされていません。

ECDH には、まとめて「曲線」と呼ばれるさまざまなパラメーターのセットがあります。素数曲線 (最も一般的な形式) の場合、パラメーターはタプル(p, a, b, G, n, h)(実際nhは と からの計算ですが(p, a, b, G)) であり、ECC 数学はその上に定義されます。ECC 演算が定義されると、ECDH は次のようになります。secret = X-Coordinate((alice * bob) * G). ECC には (IFC)DH と同じ落とし穴があります。パラメーターに不適切な値を選択すると、相手に悪戯が行われる可能性があります。潜在的なトリックと、ドメイン パラメータが大きいという事実のために、ドメイン パラメータの選択は「名前付き曲線」に標準化されます。同じ曲線上の 2 つのキーは、定義上、同じドメイン パラメータのセットを持ちます。TLS では、曲線の名前 (オブジェクト識別子の値) のみを使用できます。サーバーはほとんどの場合、どのパラメーターのセットを選択しますが、相互運用性を最大限に高めるために、通常、(2018 年現在) secp256r1(別名 NIST P-256)、secp384r1(別名 NIST P-384)、およびsecp521r1(別名 NIST P ) の 3 つの曲線のみが選択されます。 -521)。

ECDiffieHellmanCng はデフォルトで を使用しsecp521r1ますが、次の 3 つの方法のいずれかで曲線を制御できます。

ecdh.KeySize の設定

KeySize 値を変更すると (現在保持されている値以外の値に設定すると)、そのサイズのカーブにキーが生成されます。これは、Windows 7、8、および 8.1 にとって完全に理にかなっています... Windows CNG はsecp256r1secp384r1、およびのみをサポートしていたためsecp521r1です。したがって、KeySize を { 256, 384, 521 } のいずれかに設定できます。

using (ECDiffieHellman ecdh = ECDiffieHellman.Create())
{
    ecdh.KeySize = 384;
    ...
}

そのように作成する

Windows 10 では、より多くの曲線のサポートが追加され、サイズがあいまいになりました。256 はsecp256r1or brainpoolp256r1(or brainpoolp256t1, numsp256t1, secp256k1, ...) を意味しますか? ということsecp256r1で、さらに複雑な API が存在します。

ファクトリには、ECDiffieHellman.Create.NET を受け入れるオーバーロード (.NET Core 2.1+、.NET Framework 4.7+) がありますECCurve。したがって、カーブを作成する別の方法は次のとおりsecp384r1です。

using (ECDiffieHellman ecdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384))
{
    ...
}

後からでも設定可能

DI を使用していて、ファクトリをうまく使用できない可能性があります。GenerateKeyメソッド (.NET Core 2.1+、.NET Framework 4.7+) を使用して同じ結果を得ることができます。

using (ECDiffieHellman ecdh = ECDiffieHellman.Create())
{
    ecdh.GenerateKey(ECCurve.NamedCurves.nistP384);
    ...
}

ECCurve 値を取得する方法は他にもありECCurve.CreateFromValue("1.3.132.0.34")ます(p, a, b, G = (Gx, Gy), n, h)

于 2018-10-26T15:52:45.237 に答える
0
  • GF(q) は q 個の要素を持つ有限体を表す
  • p は基点

はい、フィールド Fq で同じベースポイントと同じ楕円曲線 E を使用する必要があります。これらは公開されています。

于 2018-10-22T18:51:51.320 に答える