2012-02-28 31 views
5

Vì vậy, tôi đang làm việc trên một dự án để giao tiếp một máy khách C# với một công nghệ máy chủ hiện có. Một trong những yêu cầu là trao đổi khóa sử dụng Diffie-Hellman.Diffie-Hellman 1024 bit trong C#

Chúng tôi đã biết P và G công khai và tôi cần tạo khóa công cộng 1024 bit để gửi tới máy chủ.

Phần sau được sử dụng ở phía máy chủ trong C++ với OpenSSL. Hiện nay tôi đang sử dụng cùng một mã trong một DLL bản địa được gọi là thông qua P/Invoke, và nó hoạt động như là tốt. Tôi muốn loại bỏ sự phụ thuộc DLL gốc nếu có thể.

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); 
} 

Điều này tạo ra khóa công cộng 1024 bit.

Tôi đã thử sử dụng các lớp DH trong BouncyCastle, nhưng vì bất kỳ lý do gì tôi không thể đưa cho tôi khóa 1024 bit, thay vào đó, nó muốn cho tôi khóa 960 bit. Có thể bởi vì tôi thực sự không biết mình đang làm gì. Tôi không thể tìm thấy nhiều trong cách giải thích thực tế về cách các lớp học được cho là được sử dụng.

Có thể sử dụng các lớp BouncyCastle DH để hoạt động giống như mã OpenSSL DH được đăng ở trên không? Nếu không, có một triển khai C# nào khác có thể hoạt động tốt hơn không?

Trả lời

3

Dưới đây là một ví dụ mã làm việc + bài viết trên CodeProject với một đánh giá tuyệt vời:

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

+0

tôi thấy bài viết mà trước đây nhưng nó không cung cấp một cách để thiết lập P và G thông số nó chỉ sử dụng một được tạo ngẫu nhiên. Tuy nhiên tôi chỉ nhìn lại và có vẻ như không quá khó để sửa đổi nó để làm việc. Tôi sẽ cho nó nó một cơ hội. – Gerald

+0

Như nó chỉ ra mã trong bài viết đó là đủ đơn giản mà tôi đã thực sự có thể hiểu được quá trình của Diffie-Hellman - đó là đơn giản hơn nhiều so với tôi nhận ra - và tôi đã có thể cuộn của riêng tôi mà chỉ hoạt động tốt. Vì vậy, tôi sẽ chấp nhận câu trả lời. Cảm ơn. – Gerald