Aşağıdaki cevabım biraz uzun, ancak umarım önceki cevaplarda eksik olan bazı ayrıntıları sağlar. İlgili bazı ifadelerle başlayacağım ve sonunda ilk soruyu cevaplayacağım.
RSA algoritmasını kullanarak bir şeyi şifrelemek için modül ve şifreleme (genel) üs çiftine (n, e) ihtiyacınız vardır. Bu sizin genel anahtarınız. RSA algoritmasını kullanarak bir şeyin şifresini çözmek için modül ve şifre çözme (özel) üs çiftine (n, d) ihtiyacınız vardır. Bu senin özel anahtarın.
RSA genel anahtarını kullanarak bir şeyi şifrelemek için düz metninizi sayı olarak ele alırsınız ve e modülünün gücüne yükseltirsiniz:
ciphertext = ( plaintext^e ) mod n
RSA özel anahtarını kullanarak bir şeyin şifresini çözmek için şifre metninize sayı olarak davranır ve d modülünün gücüne yükseltirsiniz:
plaintext = ( ciphertext^d ) mod n
Openssl kullanarak özel (d, n) anahtar oluşturmak için aşağıdaki komutu kullanabilirsiniz:
openssl genrsa -out private.pem 1024
Openssl kullanarak özel anahtardan genel (e, n) anahtar oluşturmak için aşağıdaki komutu kullanabilirsiniz:
openssl rsa -in private.pem -out public.pem -pubout
Yukarıdaki openssl komutu tarafından oluşturulan private.pem private RSA anahtarının içeriğini incelemek için aşağıdakini çalıştırın (çıktı burada etiketlere kısaltılmıştır):
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
Özel anahtar yalnızca (n, d) çiftinden oluşmamalı mı? Neden 6 ekstra bileşen var? Genel RSA anahtarının private.pem özel RSA anahtarından oluşturulabilmesi / çıkarılabilmesi için e (genel üs) içerir. Geri kalan 5 bileşen, şifre çözme işlemini hızlandırmak için vardır. Bu 5 değeri önceden hesaplayıp saklayarak, RSA şifre çözmeyi 4 katına kadar hızlandırmak mümkün. Hızlandırma algoritması, Çin Kalan Teoremine .
Evet, private.pem RSA özel anahtarı aslında bu 8 değerin tümünü içerir; önceki komutu çalıştırdığınızda bunların hiçbiri anında oluşturulmaz. Aşağıdaki komutları çalıştırmayı deneyin ve çıktıyı karşılaştırın:
# 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
RSA özel anahtarının bu yapısı, alternatif ( ikinci ) bir gösterim olarak PKCS # 1 v1.5 tarafından önerilir . PKCS # 1 v2.0 standardı, e ve d üslerini alternatif gösterimden tamamen hariç tutar. PKCS # 1 v2.1 ve v2.2 , isteğe bağlı olarak daha fazla CRT ile ilgili bileşen ekleyerek alternatif sunumda başka değişiklikler önermektedir.
Public.pem public RSA anahtarının içeriğini görmek için aşağıdakileri çalıştırın (çıktı burada etiketlere kısaltılmıştır):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Burada sürpriz yok. Söz verdiğim gibi (n, e) çifti.
Şimdi nihayet ilk soruyu cevaplıyor: Yukarıda gösterildiği gibi, openssl kullanılarak oluşturulan özel RSA anahtarı hem genel hem de özel anahtarların bileşenlerini ve daha fazlasını içerir. Özel anahtardan ortak anahtar oluşturduğunuzda / ayıkladığınız / türettiğinizde, bu bileşenlerden ikisini (e, n) ortak anahtarınız olan ayrı bir dosyaya kopyalar.