因此,我正在开发一个项目,以将 C# 客户端与现有服务器技术连接起来。其中一项要求是使用 Diffie-Hellman 进行密钥交换。
我们已经知道公共 P 和 G,我需要生成一个 1024 位的公共密钥以发送到服务器。
以下内容在 C++ 中的服务器端与 OpenSSL 一起使用。目前,我在通过 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# 实现会更好?