あなたの質問では、(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)
(実際n
にh
は と からの計算ですが(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 はsecp256r1
、secp384r1
、およびのみをサポートしていたためsecp521r1
です。したがって、KeySize を { 256, 384, 521 } のいずれかに設定できます。
using (ECDiffieHellman ecdh = ECDiffieHellman.Create())
{
ecdh.KeySize = 384;
...
}
そのように作成する
Windows 10 では、より多くの曲線のサポートが追加され、サイズがあいまいになりました。256 はsecp256r1
or 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)
。