Ma réponse ci-dessous est un peu longue, mais j'espère qu'elle fournit certains détails qui manquent dans les réponses précédentes. Je vais commencer par quelques déclarations connexes et enfin répondre à la question initiale.
Pour crypter quelque chose à l'aide de l'algorithme RSA, vous avez besoin d'un module et d'une paire d'exposants de cryptage (public) (n, e). Voilà votre clé publique. Pour décrypter quelque chose à l'aide de l'algorithme RSA, vous avez besoin d'un module et d'une paire d'exposants de décryptage (privés) (n, d). Voilà votre clé privée.
Pour crypter quelque chose à l'aide de la clé publique RSA, vous traitez votre texte en clair comme un nombre et vous l'élevez à la puissance du module e n:
ciphertext = ( plaintext^e ) mod n
Pour décrypter quelque chose à l'aide de la clé privée RSA, vous traitez votre texte chiffré comme un nombre et l'élevez à la puissance du module d n:
plaintext = ( ciphertext^d ) mod n
Pour générer une clé privée (d, n) en utilisant openssl, vous pouvez utiliser la commande suivante:
openssl genrsa -out private.pem 1024
Pour générer une clé publique (e, n) à partir de la clé privée en utilisant openssl, vous pouvez utiliser la commande suivante:
openssl rsa -in private.pem -out public.pem -pubout
Pour disséquer le contenu de la clé RSA privée private.pem générée par la commande openssl ci-dessus, exécutez la commande suivante (sortie tronquée aux étiquettes ici):
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
La clé privée ne doit-elle pas consister en une paire (n, d) uniquement? Pourquoi y a-t-il 6 composants supplémentaires? Il contient e (exposant public) afin que la clé RSA publique puisse être générée / extraite / dérivée de la clé RSA privée private.pem. Les 5 autres composants sont là pour accélérer le processus de décryptage. Il s'avère qu'en pré-calculant et en stockant ces 5 valeurs, il est possible d'accélérer le décryptage RSA par un facteur de 4. Le décryptage fonctionnera sans ces 5 composants, mais cela peut être fait plus rapidement si vous les avez à portée de main. L'algorithme d'accélération est basé sur le théorème des restes chinois .
Oui, la clé privée RSA private.pem contient en fait toutes ces 8 valeurs; aucun d'eux n'est généré à la volée lorsque vous exécutez la commande précédente. Essayez d'exécuter les commandes suivantes et comparez la sortie:
# 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
Cette structure de la clé privée RSA est recommandée par le PKCS # 1 v1.5 comme représentation alternative ( seconde ). La norme PKCS # 1 v2.0 exclut complètement les exposants e et d de la représentation alternative. PKCS # 1 v2.1 et v2.2 propose d'autres modifications à la représentation alternative, en incluant éventuellement plus de composants liés au CRT.
Pour voir le contenu de la clé publique RSA public.pem, exécutez ce qui suit (sortie tronquée aux étiquettes ici):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Pas de surprise ici. C'est juste (n, e) paire, comme promis.
Répondant enfin à la question initiale: comme cela a été montré ci-dessus, la clé RSA privée générée à l'aide d'openssl contient des composants des clés publiques et privées et d'autres encore. Lorsque vous générez / extrayez / dérivez une clé publique à partir de la clé privée, openssl copie deux de ces composants (e, n) dans un fichier séparé qui devient votre clé publique.