Итак, я работаю над проектом для взаимодействия с клиентом C# с существующей технологией сервера. Одним из требований является обмен ключами с использованием Diffie-Hellman.1024-бит Diffie-Hellman в C#
Мы знаем общедоступные P и G, и мне нужно создать 1024-разрядный открытый ключ для отправки на сервер.
На стороне сервера в C++ используется OpenSSL. В настоящее время я использую тот же код в родной DLL, вызванной через P/Invoke, и он также работает. Я бы предпочел, если возможно, устранить родную 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-битный открытый ключ.
Я пробовал использовать классы DH в BouncyCastle, но по какой-то причине я не могу заставить его дать 1024-битный ключ, вместо этого он хочет дать мне 960-битный ключ. Возможно потому, что я действительно не знаю, что я делаю. Я не мог найти много способов объяснения того, как классы должны использоваться.
Можно ли использовать классы BouncyCastle DH для работы так же, как и код OpenSSL DH, указанный выше? Если нет, есть ли еще одна реализация C#, которая будет работать лучше?
я нашел эту статью раньше, но это не дает возможность устанавливать P и G параметры он использует только случайно сгенерированное простое число. Однако я просто снова посмотрел, и похоже, что это не так сложно изменить его работу. Я дам ему попробовать. – Gerald
Как оказалось, код в этой статье был достаточно прост, что я действительно мог понять процесс Диффи-Хеллмана, который намного проще, чем я понял, - и я смог свернуть свой, который работает отлично. Поэтому я приму ответ. Благодарю. – Gerald