Comment puis-je transformer entre les deux styles de format de clé publique, un format est:
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
l'autre format est:
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
par exemple, j'ai généré une paire id_rsa / id_rsa.pub à l'aide de la commande ssh-keygen, j'ai calculé la clé publique à partir de id_rsa en utilisant:
openssl rsa -in id_rsa -pubout -out pub2
puis à nouveau, j'ai calculé la clé publique à partir de id_rsa.pub en utilisant:
ssh-keygen -f id_rsa.pub -e -m pem > pub1
le contenu est pub1 est:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----
et le contenu de pub2 est:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----
Selon ma compréhension, pub1 et pub2 contiennent les mêmes informations de clé publique, mais ils sont dans un format différent, je me demande comment puis-je transformer entre les deux formats? Quelqu'un peut-il me montrer une introduction concise sur les formats de remorquage?
Réponses:
Utilisation de phpseclib, une implémentation pure de PHP RSA ...
Les éléments encodés en base64 semblent correspondre même si l'en-tête indique BEGIN PUBLIC KEY et non BEGIN RSA PUBLIC KEY. Alors peut-être utilisez simplement str_replace pour résoudre ce problème et vous devriez être prêt à partir!
la source
Je voulais aider à expliquer ce qui se passe ici.
Une «clé publique» RSA se compose de deux nombres:
En utilisant votre clé publique RSA comme exemple, les deux nombres sont:
La question devient alors comment voulons-nous stocker ces nombres dans un ordinateur. Nous convertissons d'abord les deux en hexadécimal:
RSA a inventé le premier format
RSA a d'abord inventé un format:
Ils ont choisi d'utiliser la saveur DER du standard de codage binaire ASN.1 pour représenter les deux nombres [1] :
Le codage binaire final en ASN.1 est:
Si vous exécutez ensuite tous ces octets ensemble et que vous l'encodez en Base64, vous obtenez:
Les laboratoires RSA ont alors dit d'ajouter un en-tête et une bande-annonce:
Cinq traits d'union et les mots
BEGIN RSA PUBLIC KEY
. C'est votre clé publique PEM DER ASN.1 PKCS # 1 RSAPas seulement RSA
Après cela, d'autres formes de cryptographie à clé publique sont apparues:
Quand est venu le temps de créer une norme sur la façon de représenter les paramètres de ces algorithmes de chiffrement, les gens ont adopté beaucoup des mêmes idées que RSA avait définies à l'origine:
BEGIN PUBLIC KEY
Mais plutôt que d'utiliser:
-----BEGIN RSA PUBLIC KEY-----
-----BEGIN DH PUBLIC KEY-----
-----BEGIN EC PUBLIC KEY-----
Ils ont plutôt décidé d'inclure l'identificateur d'objet (OID) de ce qui va suivre. Dans le cas d'une clé publique RSA, c'est-à-dire:
1.2.840.113549.1.1.1
Donc, pour la clé publique RSA, c'était essentiellement:
Maintenant, ils ont créé SubjectPublicKeyInfo qui est essentiellement:
En réalité, la définition DER ASN.1 est:
Cela vous donne un ASN.1 de:
Le codage binaire final en ASN.1 est:
Et comme avant, vous prenez tous ces octets, vous les encodez en Base64, vous vous retrouvez avec votre deuxième exemple:
Ajoutez l'en-tête et la bande-annonce légèrement différents, et vous obtenez:
Et ceci est votre clé publique X.509 SubjectPublicKeyInfo / OpenSSL PEM [2] .
Faites-le bien ou piratez-le
Maintenant que vous savez que l'encodage n'est pas magique, vous pouvez écrire toutes les pièces nécessaires pour analyser le module et l'exposant RSA. Ou vous pouvez reconnaître que les 24 premiers octets sont juste ajoutés de nouveaux éléments en plus de la norme PKCS # 1 d'origine
Ces 24 premiers octets sont des "nouveaux" éléments ajoutés:
Et en raison d'une extraordinaire coïncidence de fortune et de chance:
Parce qu'en Base64: 3 octets devient quatre caractères:
Cela signifie que si vous prenez votre deuxième clé publique X.509, les 32 premiers caractères correspondent uniquement aux éléments nouvellement ajoutés:
Si vous supprimez les 32 premiers caractères et que vous les remplacez par BEGIN RSA PUBLIC KEY :
Vous avez exactement ce que vous vouliez - l'ancien
RSA PUBLIC KEY
format.la source
J'ai trouvé que ce site Web était une bonne explication technique des différents formats: https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem
"BEGIN RSA PUBLIC KEY" est PKCS # 1, qui ne peut contenir que des clés RSA.
"BEGIN PUBLIC KEY" est PKCS # 8, qui peut contenir une variété de formats.
Si vous voulez simplement les convertir avec la ligne de commande, "openssl rsa" est bon pour cela.
Pour convertir de PKCS # 8 à PKCS # 1:
Pour convertir de PKCS # 1 à PKCS # 8:
la source
unknown option -RSAPublicKey_in
Bien que les commentaires ci-dessus concernant les en-têtes 32 octets, les formats OID et autres soient intéressants, je ne vois personnellement pas le même comportement, en supposant que je comprends le point. J'ai pensé qu'il pourrait être utile d'explorer cela plus avant dans ce que la plupart pourraient penser être des détails excessifs. Rien ne dépasse comme l'excès.
Pour commencer, j'ai créé une clé privée RSA et l'ai vérifiée:
(Oh, horreurs! J'ai dévoilé une clé privée. Meh ...)
J'extrait et affiche sa clé publique:
Il se trouve qu'il existe un autre paramètre de sortie de clé publique (comme mentionné dans un commentaire précédent). J'extrais et affiche la clé publique en utilisant ce mot-clé à la place:
Bien bien. Ces deux valeurs de clé publique ne sont pas les mêmes, bien qu'elles soient dérivées de la même clé privée. Ou sont-ils les mêmes? Je coupe et colle les deux chaînes de clé publique dans leurs propres fichiers, puis je vérifie le module sur chacune:
Le « pubin » dit rsa que ce vraiment est censé être une clé publique, et ne se plaignent pas que ce n'est pas une clé privée.
Maintenant, nous prenons la clé publique RSA, affichons le module et la transmogrifions en une ancienne `` clé publique '' (encore une fois, nous devons lui dire que l'entrée est une clé publique):
Même module, et même valeur de «clé publique» affichée. Pour rendre les choses plus intéressantes (pour moi, en tout cas), lorsque nous cliquons sur le mot clé RSAPublicKey_out, nous obtenons:
... et lorsque nous transmogrifions l'ancienne `` clé publique '' en une clé publique RSA:
... marchant sans relâche, et bien que nous venons de le faire il y a quelques commandes, pour faire comprendre, nous inversons les choses afin que la transmogrification passe du RSA à la simple `` clé publique '':
... ce qui nous ramène là où nous avons commencé. Qu'avons-nous appris?
Résumé: les touches en interne sont les mêmes, elles sont simplement différentes. Un commentaire précédent a souligné que le format de clé RSA a été défini dans PKCS # 1, et l'ancien format de «clé publique» a été défini dans PKCS # 8. Cependant, modifier un formulaire ne le transforme pas en un autre. J'espère que j'ai maintenant battu cette distinction à mort.
Au cas où il resterait encore une étincelle de vie, fouettons-la un peu plus et référençons le certificat qui a été généré à l'origine avec la clé privée RSA il y a si longtemps, en examinant sa clé publique et son module:
... et ils ont tous vécu heureux pour toujours: le certificat a la même valeur de module que la clé publique RSA, la clé privée RSA et la vieille «clé publique». Le certificat contient la même ancienne valeur de «clé publique» que nous avons vue précédemment, bien qu'il ait été signé avec un fichier marqué comme clé privée RSA. Il est prudent de dire qu'il y a un consensus.
Il n'y a pas de mot-clé équivalent 'RSAPublicKey_out' dans le quadrant X509 de la galaxie OpenSSL, donc nous ne pouvons pas essayer cela, bien que la valeur du module soit décrite comme le "module de clé RSA" qui, je suppose, est aussi proche que nous obtiendrons.
À quoi tout cela ressemblerait avec un certificat signé DSA, je ne sais pas.
Je me rends compte que cela ne répond pas à la question initiale, mais peut-être que cela fournit des informations utiles. Sinon, mes excuses. À tout le moins, des choses à ne pas faire et des suppositions à ne pas faire.
Nul doute que l'on a noté la répétition légèrement irritante de "l'écriture de la clé RSA", quand on ne fait rien de tel. Je suppose que ce que cela signifie, c'est que le module rsa reconnaît l'ancienne clé publique comme une vraie clé RSA, et c'est pourquoi il continue à insister sur la "clé RSA" (en plus c'est le module rsa, après tout). Si je me souviens bien, la structure générique EVP_PKEY a une union pour tous les types de clés, chaque type de clé ayant son propre ensemble spécial de valeurs (les g, w, q et autres consonnes).
En conclusion, je note qu'il y a eu une plainte concernant la programmation et le développement; maintenant, chaque commande OpenSSL a évidemment un code correspondant, et si l'on souhaite explorer toutes les merveilles de la programmation OpenSSL aujourd'hui, la ligne de commande semblerait un point de départ raisonnable. Dans ce cas particulier (comme j'utilise un cygwin récent pour le moment), on peut commencer par examiner \ openssl-1.0.2f \ apps \ rsa.c et (étant donné que l'on a une tolérance élevée pour les macros) \ openssl-1.0. 2f \ crypto \ pem \ pem_all.c
la source
La seule différence entre votre pub1 et pub2, en plus de l' en- tête / pied de page, est cette chaîne supplémentaire pub2:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
. Si vous supprimez cela, la Base 64 est identique à celle de pub1.La chaîne supplémentaire correspond à l'identifiant de l'algorithme selon cette réponse .
la source