Utiliser la clé privée RSA pour générer une clé publique?

394

Je ne comprends pas vraiment celui-ci:

selon: http://www.madboa.com/geek/openssl/#key-rsa , vous pouvez générer une clé publique à partir d'une clé privée.

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

Ma pensée initiale était qu'ils sont générés par paire ensemble. La clé privée RSA contient-elle la somme? ou la clé publique?

c2h2
la source
1
À tous ceux qui utilisent rsa et openssl et qui veulent crypter un gros fichier comme 5 Ko. s'il vous plaît rappelez-vous que la clé publique doit être proportionnelle ou plus grande que ce que vous voulez crypter, sinon vous obtiendrez un "fichier trop gros pour être crypté par défaut". Je résume que vous générez une clé privée assez grande et sérieuse et que vous créez vos clés privées de sorte que vous avez beaucoup de données avec lesquelles travailler. J'ai dit à qui je connais dans openssl le défaut, et qu'ils devraient simplement le faire boucler sur lui-même, sinon vous utiliserez beaucoup de temps pour comprendre pourquoi il se plaint de la taille.
Kent Hansen
10
Le problème décrit par Kent Hansen est dû à l'utilisation directe de RSA sur des données en clair, ce qui ne devrait en aucun cas être fait pour des raisons de sécurité. Utilisez plutôt un schéma de cryptage hybride bien analysé tel que RSA-KEM ( tools.ietf.org/html/rfc5990#appendix-A ), avec un schéma de cryptage symétrique authentifié tel que encrypt-then-HMAC appliqué aux données.
Daira Hopwood
Cela peut aider: jason4zhu.blogspot.jp/2014/10/…
Juger
en relation: serverfault.com/questions/52285/…
David Cary
La réponse de @ SteffenUllrich dans ce lien explique pourquoi: security.stackexchange.com/questions/172274/…
bearzyj

Réponses:

578
openssl genrsa -out mykey.pem 1024

produira en fait une paire de clés publique-privée. La paire est stockée dans le mykey.pemfichier généré .

openssl rsa -in mykey.pem -pubout > mykey.pub

va extraire la clé publique et l'imprimer. Voici un lien vers une page qui décrit mieux cela.

EDIT: Consultez la section des exemples ici . Pour simplement sortir la partie publique d'une clé privée:

openssl rsa -in key.pem -pubout -out pubkey.pem

Pour obtenir une clé publique utilisable à des fins SSH, utilisez ssh-keygen :

ssh-keygen -y -f key.pem > key.pub
Raam
la source
50
il est déroutant de voir comment tout le monde dans les tutoriels partout dit que l'utilisation de la commande openssl genrsa vous générera la clé privée, car ils oublient qu'elle génère également la
clé publique
15
@jaime pouvez-vous vraiment leur en vouloir? La documentation officielle ne dit absolument rien sur une clé publique. "DESCRIPTION: La commande genrsa génère une clé privée RSA." openssl.org/docs/apps/genrsa.html
Despertar
124
@jaime, c'est parce que ce n'est pas le cas - genrsa génère uniquement la clé privée, la clé publique n'est pas stockée. Cependant, si vous avez la clé privée, vous pouvez calculer (dériver) la clé publique à partir de celle-ci - ce que fait la 2e commande ci-dessus. Il calcule, et non extrait, la clé publique.
steveayre
13
@steveayre J'ai cru comprendre que les clés RSA étaient simplement les deux exposants ( eet ddans la littérature courante). Ni l'un ni l'autre n'est mathématiquement privé ou public, ce sont des étiquettes qui sont arbitrairement attribuées lors de la création. Ils pourraient tout aussi bien être affectés à l'envers. Générer l'un à partir de l'autre est un problème équivalent. Le .pemformat contient tout un tas d'informations, y compris les deux exposants, et donc les deux clés, non?
lynks
13
@steveayre a généralement tort. Les composants de clé RSA publics (n, e) sont générés avec et sont incorporés dans le fichier de clé RSA privé créé avec la openssl genrsacommande. Cependant, un fichier de clé publique distinct n'est pas créé à la même étape. Pour extraire la clé publique du fichier de clé privée dans un fichier de clé publique distinct, vous utilisez votre openssl rsa -in private.pem -pubout -out public.pemcommande. Lorsque vous produisez une clé publique de cette façon, elle est extraite du fichier de clé privée, non calculée. Voir ma réponse ci-dessous pour plus de détails.
golem
273

Les personnes recherchant une clé publique SSH ...

Si vous cherchez à extraire la clé publique pour l'utiliser avec OpenSSH, vous devrez obtenir la clé publique un peu différemment

$ ssh-keygen -y -f mykey.pem > mykey.pub

Ce format de clé publique est compatible avec OpenSSH. Ajoutez la clé publique à remote:~/.ssh/authorized_keyset vous serez prêt à partir


documents de SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y Cette option lira un fichier privé au format OpenSSH et imprimera une clé publique OpenSSH sur stdout.

Je vous remercie
la source
3
Ça fonctionne super bien! Il génère un format que Github prend! Github ne prend pas le format PEM. La réponse précédente suggérée openssl rsa -in key.pem -pubout -out pubkey.pemn'a pas été acceptée, car la sortie est évidemment une clé publique au format PEM. J'ai donc eu cette erreur: "La clé n'est pas valide. Elle doit commencer par 'ssh-rsa' ou 'ssh-dss'. Vérifiez que vous copiez la moitié publique de la clé". ssh-keygen -y [-f input_keyfile] Génère cependant le format correct que prend Github.
Devy
71

Dans la plupart des logiciels qui génèrent des clés privées RSA, y compris openssl, la clé privée est représentée comme un objet PKCS # 1 RSAPrivatekey ou une variante de celui-ci:

A.1.2 Syntaxe de clé privée RSA

Une clé privée RSA doit être représentée avec le type ASN.1
RSAPrivateKey:

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

Comme vous pouvez le voir, ce format a un certain nombre de champs, y compris le module et l'exposant public et est donc un sur-ensemble strict des informations dans une clé publique RSA .

Président James K. Polk
la source
Voulez-vous dire que, étant donné une clé privée, il est mathématiquement possible de générer la clé publique? La force de RSA n'est-elle pas le fait qu'il est impossible de générer une clé compte tenu de l'autre?
Raam
30
@Raam: Non, la force de RSA est qu'il est impossible de générer la clé privée à partir du public. Générer la forme publique privée est trivial.
président James K. Polk
@GregS, pourquoi? Une clé se compose d'un module et d'un exposant. Si l'autre exposant peut être calculé à partir de ces deux nombres, le RSA serait facilement fissuré. La clé privée OpenSSL contient-elle donc plus que l'exposant et le module?
Calmarius
1
@Calmarius: Qui a dit qu'une clé se compose d'un module et d'un exposant? Ce serait la clé privée minimale, mais généralement la clé privée comprend d'autres composants comme les facteurs premiers. Lisez la réponse pour les détails.
président James K. Polk, le
1
@JamesKPolk Ce n'est pas nécessairement vrai. Si l'exposant public est grand (c'est-à-dire qu'il a les mêmes propriétés que l'exposant privé), la clé publique peut être impossible à reconstruire. La plupart des bibliothèques ne prennent pas en charge cela, mais le cryptosystème RSA ne vous oblige certainement pas à reconstruire la clé publique à partir de la clé privée.
Maarten Bodewes
34

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.

Golem
la source
vous avez écrit "Pour générer une clé publique (d, n) à partir de la clé privée ...". Cela ne devrait-il pas être "(e, n)"? Merci pour la bonne réponse!
Elactic
Vous comparez la «syntaxe» (externe) de la v1.5 à la sémantique des versions ultérieures; vérifiez 2.0 # 11.1.2 et 2.1 et 2.2 # A.1.2 et vous verrez n, e, d toujours présents. (Comme la réponse de James Polk l'a déjà noté.)
dave_thompson_085
1
explication incroyable. Merci
Francisco Albert
1
Il semble que l'exposant public esoit toujours 65537 0x010001. C'est probablement un défaut pour choisir l'exposant public et c'est probablement pourquoi dans la page de manuel, et presque partout où genrsaest expliqué comme to generate the private key. Le public est un peu évident.
shampooing
Puis-je calculer le (n, e) uniquement à partir de (n, d)?
Flyq
21

La clé publique n'est pas stockée dans le fichier PEM comme certains le pensent. La structure DER suivante est présente dans le fichier de clé privée:

openssl rsa -text -in mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

Il y a donc suffisamment de données pour calculer la clé publique (module et exposant public), ce qui openssl rsa -in mykey.pem -puboutfait

Uxio
la source
Je vois que la clé publique n'y est pas stockée, bien que dérivable comme la clé privée, mais je ne vois pas non plus la clé privée qui y est stockée?! pourtant, si je cat le fichier pem, je vois qu'il dit clé privée et certains ascii.
barlop
2
La clé privée est également dérivée, regardez le champ privateExponent. Vous pouvez voir les champs en utilisant openssl rsa -text -in mykey.pem
Uxio
2
La clé publique est en fait stockée dans le pem, car le pem comprend également e et d, c'est-à-dire la clé publique. Contrairement aux algos de journaux discrets, la clé publique rsa ne peut pas être calculée à partir de la seule clé privée (d, n). Il n'est là que parce que les spécifications rsa indiquent de le stocker avec la clé privée et d'autres informations.
Michael Chourdakis
1
Oui, cette réponse est à toutes fins utiles et FAUX . L'exposant public et le module sont là, donc la clé publique est certainement présente. Il n'y a aucun besoin pour l'exposant public là-dedans autre que de récupérer facilement la clé publique sans aucun calcul .
Maarten Bodewes
1
@MaartenBodewes: La réponse est correcte. Ce qui est cité est tiré du RFC correspondant en tant que valeurs stockées pour une clé PRIVÉE. Le fait que deux des valeurs soient également / uniquement utilisées pour le chiffrement à clé publique ne change pas qu'il s'agit des données de clé privée. J'ai appris tout cela au cours des deux derniers jours, non pas en posant des questions mais en recherchant et en lisant la norme pertinente. Je comprends maintenant tout sur ASN.1, DER, PEM et RSA (enfin peut-être pas TOUS sur RSA).
AlastairG
8

ici, dans ce code, nous créons d'abord une clé RSA qui est privée, mais elle a également une paire de sa clé publique, donc pour obtenir votre clé publique réelle, nous le faisons simplement

openssl rsa -in mykey.pem -pubout > mykey.pub

j'espère que vous l'obtiendrez pour plus d'informations vérifier cette

Rdx
la source
6

Tout d'abord un bref récapitulatif sur la génération de clés RSA.

  1. Choisissez au hasard deux nombres premiers probables aléatoires de la taille appropriée (p et q).
  2. Multipliez les deux nombres premiers ensemble pour produire le module (n).
  3. Choisissez un exposant public (e).
  4. Faites quelques calculs avec les nombres premiers et l'exposant public pour produire l'exposant privé (d).

La clé publique est constituée du module et de l'exposant public.

Une clé privée minimale serait constituée du module et de l'exposant privé. Il n'y a aucun moyen infaillible faisable sur le plan informatique de passer d'un module connu et d'un exposant privé à l'exposant public correspondant.

Toutefois:

  1. Les formats de clé privée pratiques stockent presque toujours plus de n et d.
  2. e n'est normalement pas choisi au hasard, l'une des quelques valeurs bien connues est utilisée. Si e est l'une des valeurs bien connues et que vous connaissez d, il serait facile de déterminer e par essais et erreurs.

Ainsi, dans la plupart des implémentations RSA pratiques, vous pouvez obtenir la clé publique à partir de la clé privée. Il serait possible de construire un cryptosystème basé sur RSA là où cela n'était pas possible, mais ce n'est pas chose faite.

plugwash
la source
1
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.
Ankit Jain
la source
1
C'est idiot; il n'est pas nécessaire de faire des efforts supplémentaires pour créer un certificat inutile lorsque tout ce que vous voulez, c'est une paire de clés. Pour certains autres Q où vous voulez un cert, cela pourrait être une réponse.
dave_thompson_085