Câu trả lời của tôi dưới đây hơi dài dòng, nhưng hy vọng nó cung cấp một số chi tiết còn thiếu trong các câu trả lời trước. Tôi sẽ bắt đầu với một số câu liên quan và cuối cùng trả lời câu hỏi ban đầu.
Để mã hóa thứ gì đó bằng thuật toán RSA, bạn cần cặp số mũ và mô đun (công khai) (n, e). Đó là khóa công khai của bạn. Để giải mã một cái gì đó bằng thuật toán RSA, bạn cần cặp số mũ (n, d) mô đun và giải mã (riêng tư). Đó là khóa riêng của bạn.
Để mã hóa thứ gì đó bằng khóa công khai RSA, bạn coi văn bản gốc của mình là một số và nâng nó lên sức mạnh của mô đun điện tử n:
ciphertext = ( plaintext^e ) mod n
Để giải mã một cái gì đó bằng khóa riêng RSA, bạn coi mật mã của mình là một số và nâng nó lên sức mạnh của d modulus n:
plaintext = ( ciphertext^d ) mod n
Để tạo khóa riêng (d, n) bằng openssl, bạn có thể sử dụng lệnh sau:
openssl genrsa -out private.pem 1024
Để tạo khóa công khai (e, n) từ khóa riêng bằng openssl, bạn có thể sử dụng lệnh sau:
openssl rsa -in private.pem -out public.pem -pubout
Để phân tích nội dung của khóa RSA private.pem được tạo bởi lệnh openssl ở trên, hãy chạy phần sau (đầu ra được cắt thành nhãn ở đây):
openssl rsa -in private.pem -text -noout | less
modulus - n
privateExponent - d
publicExponent - e
prime1 - p
prime2 - q
exponent1 - d mod (p-1)
exponent2 - d mod (q-1)
coefficient - (q^-1) mod p
Không nên khóa riêng chỉ bao gồm (n, d) cặp? Tại sao có 6 thành phần phụ? Nó chứa e (số mũ công khai) để khóa RSA công khai có thể được tạo / trích xuất / lấy từ khóa RSA private.pem private. 5 thành phần còn lại có mặt để tăng tốc quá trình giải mã. Hóa ra, bằng cách tính toán trước và lưu trữ 5 giá trị đó, có thể tăng tốc độ giải mã RSA theo hệ số 4. Giải mã sẽ hoạt động mà không cần 5 thành phần đó, nhưng có thể được thực hiện nhanh hơn nếu bạn có sẵn chúng. Thuật toán tăng tốc dựa trên Định lý còn lại của Trung Quốc .
Có, khóa riêng private.pem RSA thực sự chứa tất cả 8 giá trị đó; không ai trong số họ được tạo ra khi bạn chạy lệnh trước đó. Hãy thử chạy các lệnh sau và so sánh đầu ra:
# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der
# Print private.der private key contents as binary stream
xxd -p private.der
# Now compare the output of the above command with output
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less
Cấu trúc này của khóa riêng RSA được PKCS # 1 v1.5 khuyên dùng làm đại diện thay thế ( thứ hai ). Tiêu chuẩn PKCS # 1 v2.0 không bao gồm số mũ e và d từ đại diện thay thế hoàn toàn. PKCS # 1 v2.1 và v2.2 đề xuất các thay đổi tiếp theo đối với biểu diễn thay thế, bằng cách tùy chọn bao gồm nhiều thành phần liên quan đến CRT hơn.
Để xem nội dung của khóa RSA công khai.pem chạy như sau (đầu ra bị cắt thành nhãn ở đây):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Không có bất ngờ ở đây. Đó chỉ là cặp (n, e), như đã hứa.
Bây giờ cuối cùng đã trả lời câu hỏi ban đầu: Như đã trình bày ở trên khóa RSA riêng được tạo bằng openssl chứa các thành phần của cả khóa chung và khóa riêng và một số khóa khác. Khi bạn tạo / trích xuất / lấy khóa công khai từ khóa riêng, openssl sao chép hai trong số các thành phần đó (e, n) vào một tệp riêng trở thành khóa chung của bạn.