Meine Antwort unten ist etwas lang, aber hoffentlich enthält sie einige Details, die in früheren Antworten fehlen. Ich werde mit einigen verwandten Aussagen beginnen und schließlich die erste Frage beantworten.
Um etwas mit dem RSA-Algorithmus zu verschlüsseln, benötigen Sie ein Exponentenpaar aus Modul und Verschlüsselung (öffentlich) (n, e). Das ist dein öffentlicher Schlüssel. Um etwas mit dem RSA-Algorithmus zu entschlüsseln, benötigen Sie ein Exponentenpaar aus Modul und Entschlüsselung (privat) (n, d). Das ist dein privater Schlüssel.
Um etwas mit dem öffentlichen RSA-Schlüssel zu verschlüsseln, behandeln Sie Ihren Klartext als Zahl und erhöhen ihn auf die Potenz des Moduls n:
ciphertext = ( plaintext^e ) mod n
Um etwas mit dem privaten RSA-Schlüssel zu entschlüsseln, behandeln Sie Ihren Chiffretext als Zahl und erhöhen ihn auf die Potenz des Moduls d:
plaintext = ( ciphertext^d ) mod n
Um einen privaten (d, n) Schlüssel mit openssl zu generieren, können Sie den folgenden Befehl verwenden:
openssl genrsa -out private.pem 1024
Um einen öffentlichen (e, n) Schlüssel aus dem privaten Schlüssel mit openssl zu generieren, können Sie den folgenden Befehl verwenden:
openssl rsa -in private.pem -out public.pem -pubout
Führen Sie die folgenden Schritte aus, um den Inhalt des privaten RSA-Schlüssels private.pem zu zerlegen, der mit dem obigen Befehl openssl generiert wurde (Ausgabe hier auf Beschriftungen abgeschnitten):
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
Sollte der private Schlüssel nicht nur aus (n, d) Paaren bestehen? Warum gibt es 6 zusätzliche Komponenten? Es enthält e (öffentlicher Exponent), sodass der öffentliche RSA-Schlüssel aus dem privaten RSA-Schlüssel private.pem generiert / extrahiert / abgeleitet werden kann. Die restlichen 5 Komponenten beschleunigen den Entschlüsselungsprozess. Es stellt sich heraus, dass durch Vorberechnung und Speicherung dieser 5 Werte die RSA-Entschlüsselung um den Faktor 4 beschleunigt werden kann. Die Entschlüsselung funktioniert ohne diese 5 Komponenten, kann jedoch schneller durchgeführt werden, wenn Sie sie zur Hand haben. Der Beschleunigungsalgorithmus basiert auf dem chinesischen Restsatz .
Ja, der private RSA-Schlüssel private.pem enthält tatsächlich alle diese 8 Werte. Keiner von ihnen wird im laufenden Betrieb generiert, wenn Sie den vorherigen Befehl ausführen. Führen Sie die folgenden Befehle aus und vergleichen Sie die Ausgabe:
# 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
Diese Struktur des privaten RSA-Schlüssels wird von PKCS # 1 v1.5 als alternative ( zweite ) Darstellung empfohlen . Der PKCS # 1 v2.0- Standard schließt e- und d-Exponenten insgesamt von der alternativen Darstellung aus. PKCS # 1 v2.1 und v2.2 schlagen weitere Änderungen an der alternativen Darstellung vor, indem optional mehr CRT-bezogene Komponenten einbezogen werden.
Führen Sie die folgenden Schritte aus, um den Inhalt des öffentlichen RSA-Schlüssels public.pem anzuzeigen (Ausgabe hier auf Beschriftungen gekürzt):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Keine Überraschungen hier. Es ist nur (n, e) Paar, wie versprochen.
Beantworten Sie nun endlich die erste Frage: Wie oben gezeigt, enthält der mit openssl generierte private RSA-Schlüssel Komponenten sowohl öffentlicher als auch privater Schlüssel und einige weitere. Wenn Sie einen öffentlichen Schlüssel aus dem privaten Schlüssel generieren / extrahieren / ableiten, kopiert openssl zwei dieser Komponenten (e, n) in eine separate Datei, die zu Ihrem öffentlichen Schlüssel wird.