1024-битный Диффи-Хеллман в C # - PullRequest
5 голосов
/ 28 февраля 2012

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

1 Ответ

3 голосов
/ 28 февраля 2012

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

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

...