そのため、C# クライアントを既存のサーバー テクノロジと連携させるプロジェクトに取り組んでいます。要件の 1 つは、Diffie-Hellman を使用した鍵交換です。
公開 P と G はわかっているので、サーバーに送信する 1024 ビットの公開鍵を生成する必要があります。
以下は、OpenSSL を使用した C++ のサーバー側で使用されます。現在、P/Invoke 経由で呼び出されるネイティブ DLL で同じコードを使用していますが、同様に機能します。可能であれば、ネイティブ DLL の依存関係を排除したいと考えています。
char publicKey[128];
char P[128]; //this is set to a static 128-byte value, omitting for brevity
unsigned long G = 2;
DH* dh = DH_new();
dh->p = BN_new();
dh->g = BN_new();
BN_set_word(dh->g, G);
BN_bin2bn(P, 128, dh->p);
if(DH_generate_key(dh))
{
BN_bn2bin(dh->pub_key, publicKey);
}
これにより、1024 ビットの公開鍵が生成されます。
BouncyCastle で DH クラスを使用してみましたが、何らかの理由で 1024 ビット キーを取得できず、代わりに 960 ビット キーを取得したいと考えています。たぶん、自分が何をしているのかよくわかっていないからです。クラスの使用方法に関する実際の説明はあまり見つかりませんでした。
BouncyCastle DH クラスを使用して、上記の OpenSSL DH コードと同じように動作させることはできますか? そうでない場合、より適切に機能する別の C# 実装はありますか?