Jawaban saya di bawah ini agak panjang, tapi mudah-mudahan ini memberikan beberapa detail yang hilang dalam jawaban sebelumnya. Saya akan mulai dengan beberapa pernyataan terkait dan akhirnya menjawab pertanyaan awal.
Untuk mengenkripsi sesuatu menggunakan algoritma RSA Anda memerlukan modulus dan enkripsi (publik) pasangan eksponen (n, e). Itu kunci publik Anda. Untuk mendekripsi sesuatu menggunakan algoritma RSA Anda memerlukan pasangan eksponen modulus dan dekripsi (pribadi) (n, d). Itu kunci pribadi Anda.
Untuk mengenkripsi sesuatu menggunakan kunci publik RSA, Anda memperlakukan plaintext Anda sebagai angka dan menaikkannya menjadi kekuatan modul:
ciphertext = ( plaintext^e ) mod n
Untuk mendekripsi sesuatu menggunakan kunci privat RSA, Anda memperlakukan ciphertext Anda sebagai angka dan menaikkannya dengan kekuatan modulus:
plaintext = ( ciphertext^d ) mod n
Untuk menghasilkan kunci pribadi (d, n) menggunakan openssl Anda dapat menggunakan perintah berikut:
openssl genrsa -out private.pem 1024
Untuk menghasilkan kunci publik (e, n) dari kunci pribadi menggunakan openssl Anda dapat menggunakan perintah berikut:
openssl rsa -in private.pem -out public.pem -pubout
Untuk membedah konten kunci RSA private.pem pribadi yang dihasilkan oleh perintah openssl di atas, jalankan perintah berikut (output terpotong ke label di sini):
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
Bukankah kunci pribadi hanya terdiri dari (n, d) pasangan? Mengapa ada 6 komponen tambahan? Ini berisi e (eksponen publik) sehingga kunci RSA publik dapat dihasilkan / diekstraksi / berasal dari kunci RSA pribadi private.pem. Sisanya 5 komponen ada untuk mempercepat proses dekripsi. Ternyata dengan melakukan pra-komputasi dan menyimpan 5 nilai tersebut, dimungkinkan untuk mempercepat dekripsi RSA dengan faktor 4. Dekripsi akan bekerja tanpa 5 komponen itu, tetapi dapat dilakukan lebih cepat jika Anda memilikinya. Algoritma percepatan didasarkan pada Teorema Sisa Cina .
Ya, private.pem Kunci privat RSA sebenarnya berisi ke-8 nilai tersebut; tidak satu pun dari mereka dihasilkan dengan cepat ketika Anda menjalankan perintah sebelumnya. Coba jalankan perintah berikut dan bandingkan output:
# 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
Struktur kunci pribadi RSA ini direkomendasikan oleh PKCS # 1 v1.5 sebagai representasi alternatif ( kedua ). Standar PKCS # 1 v2.0 mengecualikan eksponen e dan d dari representasi alternatif secara keseluruhan. PKCS # 1 v2.1 dan v2.2 mengusulkan perubahan lebih lanjut pada representasi alternatif, dengan secara opsional memasukkan lebih banyak komponen yang terkait dengan CRT.
Untuk melihat konten kunci RSA publik.pem publik jalankan yang berikut (output terpotong ke label di sini):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Tidak ada kejutan di sini. Itu hanya (n, e) pasangan, seperti yang dijanjikan.
Sekarang akhirnya menjawab pertanyaan awal: Seperti yang ditunjukkan di atas kunci RSA pribadi yang dihasilkan menggunakan openssl berisi komponen kunci publik dan pribadi dan beberapa lagi. Ketika Anda membuat / mengekstrak / mendapatkan kunci publik dari kunci privat, membuka salinan dua komponen tersebut (e, n) ke file terpisah yang menjadi kunci publik Anda.