Tôi có các giá trị cho p
, q
, n
và e
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
, n
và e
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
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-1 và q-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).
Từ Wikipedia:
Xác định d (sử dụng số học modula) đáp ứng các mối quan hệ tương đẳng
- 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ữ:
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)
và 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.
Đâ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
- 1. Cách tạo khóa Riêng RSA từ chuỗi * pem trong Java
- 2. Mở khóa riêng RSA từ Ruby
- 3. RSA: Cách tạo khóa riêng trong java và sử dụng nó trong C#?
- 4. Flash SecureSocket và khóa riêng RSA
- 5. Tạo cặp khóa RSA trong JavaScript
- 6. Tạo khóa thuật toán RSA
- 7. Các khóa công khai/riêng tư của RSA trong YAML
- 8. Tải khóa RSA riêng được mã hóa PEM trong Crypto ++
- 9. Cách tạo khóa công cộng và khóa riêng thông qua RSA
- 10. Tạo cặp khóa RSA bằng Erlang?
- 11. C + + OpenSSL xuất khẩu khóa riêng
- 12. Tạo cặp khóa RSA trong javascript, dựa trên mật khẩu
- 13. Sử dụng Khóa công cộng RSA để giải mã một chuỗi đã được mã hóa bằng Khóa riêng RSA
- 14. tạo các khóa công khai/riêng tư rsa từ NED Big Ints
- 15. Sử dụng khóa RSA do Crypto ++ tạo trên OpenSSL
- 16. Java: Cách tạo Khóa công cộng RSA từ chuỗi
- 17. Mã hóa tin nhắn bằng khóa riêng RSA (như trong RSA_private_encrypt của OpenSSL)
- 18. Chuyển khóa công cộng RSA thành RSA DER
- 19. RSACryptoServiceProvider khởi tạo với khóa công khai và khóa riêng
- 20. tải RSA khóa công khai từ file
- 21. Nhập cặp khóa công khai/riêng tư OpenSSH RSA vào quyền truy cập Keychain của Apple
- 22. Securing key bản quyền với khóa RSA
- 23. Sử dụng RSA trong C#
- 24. Sử dụng RSA trong Python
- 25. Nhập khóa RSA vào iPhone keychain?
- 26. Cách tải bằng Python-RSA một khóa RSA công khai từ một tệp được tạo bằng openssl?
- 27. Giải mã bằng khóa riêng từ tệp .pem trong C# với thư viện crypto .NET
- 28. RSA: Tính toán khóa riêng với thuật toán Euclide mở rộng
- 29. Tạo CSR bằng khóa riêng hiện có
- 30. Cách cất giữ khóa công khai trong ngăn chứa khóa RSA cấp máy
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