所以我正在开发一个项目,将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#实现?
答案 0 :(得分:3)
这是一个关于CodeProject的工作代码示例+文章,评分很高:
http://www.codeproject.com/Articles/24632/Shared-Key-Generation-using-Diffie-Hellman