2010-09-18 72 views
6

Tôi có các giá trị cho p, q, ne và muốn tính khóa riêng d. Làm thế nào tôi có thể làm điều này, ai đó có thể cho tôi ví dụ mã C#? Tôi đang sử dụng lớp học BigInteger để đại diện cho các giá trị cho p, q, ne vì vậy tôi giả sử d cũng sẽ là BigInteger.Tạo khóa RSA riêng trong C#

Trả lời

1

Cách ngắn gọn là tính toán nghịch đảo của e modulo (p-1) * (q-1). Trên thực tế, bạn chỉ cần bội số chung ít nhất là p-1q-1, nhưng điều này sẽ không mua cho bạn nhiều (có, có một số giá trị có thể cho d, điều này là bình thường, tất cả đều tương đương) .

Nếu lớp học BigInteger của bạn có phương pháp nghịch đảo mô-đun, thì điều này sẽ dễ dàng: chỉ cần gọi nó. Nếu không, bạn sẽ phải tự tính toán nó bằng cách sử dụng thuật toán Euclide mở rộng (đây là những gì mà các lớp BigInteger có xu hướng sử dụng để tính toán các nghịch đảo mô-đun).

3

Từ Wikipedia:

Xác định d (sử dụng số học modula) đáp ứng các mối quan hệ tương đẳng alt text

  • Nói cách khác, ed - 1 có thể được chia đều bởi hàm Ơ-le (p - 1) (q - 1).
  • Điều này thường được tính bằng thuật toán Euclid mở rộng.
  • d được giữ làm số mũ chìa khóa riêng.

Các mở rộng thuật toán Euclide cho phép bạn tìm các số nguyên như vậy mà sau giữ:

alt text

Các mở rộng thuật toán Euclide là đặc biệt hữu ích khi a và b là nguyên tố cùng nhau , vì x là nghịch đảo nhân mô đun của một modulo b.

Trong công thức này thiết lập a-e, b-(p-1)(q-1)gcd(a, b)-1 (vì e và φ (pq) là bắt buộc để được nguyên tố cùng nhau trong thuật toán RSA) và giải quyết cho x mang đến cho bạn d của bạn. Trang Wikipedia trên extended Euclidean algorithm có thêm chi tiết về cách viết thuật toán để giải quyết cho x và y. Ví dụ, bạn có thể sử dụng chức năng này đệ quy (trong pseudo-code):

function extended_gcd(a, b) 
    if a mod b = 0 
     return {0, 1} 
    else 
     {x, y} := extended_gcd(b, a mod b) 
     return {y, x-(y*(a div b))} 

Trong .NET nếu bạn chỉ muốn tạo ra một số phím RSA bạn không cần phải thực hiện các thuật toán RSA mình. Đã có một triển khai thực hiện RSA trong khung công tác .NET mà bạn có thể sử dụng.

+0

Tôi biết cách tạo khóa từ đầu nhưng hết tò mò Tôi cố gắng khôi phục d từ các giá trị trên. – b3n

1

Đây là cách tôi đã làm nó.

số nguyên tố p = 7 và q = 17

Tính n = p * q = 119

Tính f (n) = (p-1) * (q-1) = 96

Tính d = e^-1 mod f (n), vd, d = 77

Các vấn đề liên quan