2012-02-28 4 views
5

Итак, я работаю над проектом для взаимодействия с клиентом 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#, которая будет работать лучше?

ответ

3

Вот рабочий код примера + статьи на CodeProject с отличным рейтингом:

http://www.codeproject.com/Articles/24632/Shared-Key-Generation-using-Diffie-Hellman

+0

я нашел эту статью раньше, но это не дает возможность устанавливать P и G параметры он использует только случайно сгенерированное простое число. Однако я просто снова посмотрел, и похоже, что это не так сложно изменить его работу. Я дам ему попробовать. – Gerald

+0

Как оказалось, код в этой статье был достаточно прост, что я действительно мог понять процесс Диффи-Хеллмана, который намного проще, чем я понял, - и я смог свернуть свой, который работает отлично. Поэтому я приму ответ. Благодарю. – Gerald