web-dev-qa-db-fra.com

Puis-je obtenir une clé publique à partir d'une clé privée RSA?

Autant que je me souvienne, vous cryptez le message à l'aide d'une clé publique et le décryptez à l'aide d'une clé privée. Ma question est de savoir s'il est possible d'obtenir une clé publique à partir d'une clé privée RSA. Par exemple, si j'ai une clé comme celle-ci:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCtrKVnwse4anfX+JzM7imShXZUC+QBXQ11A5bOWwHFkXc4nTfE
Or3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j3NgqX8zZJG7IwLJ/Pm2sRW5Q
j32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdWtoeLfxDBL2AJ20qXzQIDAQAB
AoGBAKNXi0GpmjnCOPDxLFg5bvQVfhLSFCGMKQny1DVEtsfgZmbixv5R2R41T4+d
CHJMdEsUFFJ6I7CRLTcg1SDU8IhcAWCBRSNeVuomCHlQG16ti8HxwhiwIcjvDz/z
NC2sL5ZJ2eJnhbtXLdf6pxxO1pA5vLp1AX06IaETO977XvupAkEA+ZgtGZybyUkf
tEA3ekXc5eLoW+zgU0C1fATWcIZ8Iq5YV1BW+3oAzf8HgIbkQh4LM2qa6An3l+vW
NXR4wICHkwJBALIhrcdJqKw36qiyenq+m78klp5SnurQifVt0Sy1GMWyOUqYz5jK
t9sGo9Qn6GDuYe/XGXKWQW25PkEYXxxPPx8CQQCpICyvRidp5VrOURVGjUB5pZ+9
am02/In9V2nXJcnH1kuWHqJSFQGmlEEJHl5dTu5YEMyWnupezzd/UUThbDZxAkAz
TNO5QxNalbf04YG4e9Bq2eSur+iog2pXzkqhb3404UDypNOUkz0jzOO9o8ieschu
xCnGAFPTf7fYE2bAxmnNAkEA0/3bdsvJclquypqP9CQeQnxGwQtWz6+yn07gj3U1
V19mdeKCUZWklRarrcr67u9DdEx+JowyEY/ppzgeQtW01g==
-----END RSA PRIVATE KEY-----

puis-je obtenir une clé publique?

50
user162408

puis-je obtenir une clé publique?

C'est facile d'utiliser openssl rsa:

$ openssl rsa -in the-private-key-from-your-question.pem  -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtrKVnwse4anfX+JzM7imShXZU
C+QBXQ11A5bOWwHFkXc4nTfEOr3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j
3NgqX8zZJG7IwLJ/Pm2sRW5Qj32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdW
toeLfxDBL2AJ20qXzQIDAQAB
-----END PUBLIC KEY---

Si vous voulez avoir une idée de ce qui est contenu dans un fichier clé, vous pouvez passer le -text option pour voir un vidage de débogage lisible par l'homme (en quelque sorte). De cette façon, vous pouvez voir qu'un fichier de clé contient à la fois des informations privées mais aussi des informations publiques. En particulier, il contient le module et publicExponent qui décrivent entièrement la clé publique:

$ openssl rsa -text -in the-private-key-from-your-question.pem
Private-Key: (1024 bit)
modulus:
    00:ad:ac:a5:67:c2:c7:b8:6a:77:d7:f8:9c:cc:ee:
    29:92:85:76:54:0b:e4:01:5d:0d:75:03:96:ce:5b:
    01:c5:91:77:38:9d:37:c4:3a:bd:df:26:39:d1:49:
    4e:40:dc:84:4e:15:4f:e9:55:53:62:5c:93:64:97:
    ba:90:64:ae:66:61:bf:23:dc:d8:2a:5f:cc:d9:24:
    6e:c8:c0:b2:7f:3e:6d:ac:45:6e:50:8f:7d:82:fe:
    e2:6e:9b:ae:10:fe:21:08:b0:28:3f:98:98:c3:2e:
    1d:65:ca:51:0c:12:ec:ca:81:37:56:b6:87:8b:7f:
    10:c1:2f:60:09:db:4a:97:cd
publicExponent: 65537 (0x10001)
privateExponent:
(…)
65
Steffen Ullrich

En pratique, oui, vous pouvez obtenir la clé publique à partir de la clé privée. En principe, il le serait serait possible pour créer une clé privée RSA à partir de laquelle la clé publique correspondante ne peut pas être facilement obtenue, mais cela nécessiterait à la fois une méthode de génération de clé non standard et un format de stockage de clé privée non standard.


Passons rapidement en revue les bases. Une clé publique RSA se compose de deux valeurs:

  • le module n (un produit de deux grands nombres premiers choisis secrètement p et q), et
  • l'exposant public e (qui peut être le même pour de nombreuses clés et est généralement choisi pour être un petit nombre premier impair, le plus souvent soit 3 ou 216+1 = 65537).

Une clé privée RSA, quant à elle, nécessite au minimum les deux valeurs suivantes:

  • le module n (identique à la clé publique), et
  • l'exposant privé d (calculé à partir de l'exposant public e et les facteurs p et q du module).

Cependant, la plupart des formats de stockage des clés privées RSA, y compris le format PKCS1 RSAPrivateKey indiqué dans votre question, stockent également un tas de valeurs supplémentaires, notamment:

  • l'exposant public e,
  • les facteurs p et q du module,
  • les exposants privés réduits d p = d mod ( p - 1) et d q = d mod ( q - 1), et
  • le "coefficient CRT" qinv = q-1 mod p.

En particulier, l'inclusion de l'exposant public e dans le format de clé privée signifie que la clé publique peut être extraite trivialement d'un fichier de clé privée compatible PKCS1. De plus, même si l'exposant public e n'était pas inclus dans le fichier de clé privée, connaissant les facteurs p et q du module permet à chaque exposant d'être facilement calculé à partir de l'autre. Et, enfin, même si nous ne connaissions pas les facteurs du module, pour les clés RSA générées de la manière habituelle, nous pourrions simplement tester les valeurs les plus couramment utilisées de e et voir laquelle des eux génère des textes chiffrés qui peuvent être correctement déchiffrés à l'aide de la clé privée donnée.


Cela dit, si nous devions utiliser un algorithme de génération de clés RSA non standard qui a choisi e (ou d) au hasard dans la plage de valeurs admissible ( c'est-à-dire les entiers supérieurs à 1 et inférieurs à et coprime avec λ ( n) = ppcm ( p - 1, q - 1)), et si nous avons utilisé un format de clé privée RSA non standard qui ne stockait que le strict minimum d'informations pour le déchiffrement (ie n et = d), alors il ne serait pas possible de calculer la clé publique à partir de la clé privée sans craquer efficacement la clé (c'est-à-dire en factorisant le module).

En effet, s'il est utilisé d'une manière non standard, l'algorithme RSA devient "symétrique" en ce sens qu'aucune des clés ( n, e) et ( n, d) peut être calculé efficacement à partir de l'autre et l'un ou l'autre pourrait être arbitrairement désigné comme clé privée. En principe, si vous ne laissez pas le détenteur de la clé privée connaître la clé "publique" correspondante (ce qui, bien sûr, signifie qu'elle ne sera plus vraiment publique), alors il ne pourra que déchiffrer les messages mais pas les chiffrer. Hélas, l'utilité pratique d'un tel schéma est plutôt limité par le simple fait que celui qui génère la paire de clés finira inévitablement par en connaître les deux moitiés de toute façon.

27
Ilmari Karonen

Oui. C'est assez facile aussi. Si vous regardez la spécification RSA, une clé publique a besoin de n et e. Une clé privée peut avoir pqd. Utilisez-les pour calculer.

n=p*q
e=mod_inverse(d,euler_totient(n))

Si vous souhaitez les emballer au format PEM, reportez-vous à https://github.com/ius/rsatool

4
sudhackar