2010-10-05 26 views
0

J'ai des informations sur n, p, q où n = pq et p et q sont de grands nombres premiers à utiliser pour l'algorithme RSA. Par exemple:RSA clés hexadécimales au format PEM

n: C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3

e: 10001

p: D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5

q: E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09 272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647

Je souhaite générer une clé privée et publique PEM à partir de ces valeurs. Je suppose qu'ils sont au format hexadécimal, mais je ne sais vraiment pas ce qui est contenu dans une clé au format PEM. Je sais que PEM signifie simplement que la clé est base64 avec d'autres bas de page (début public, etc.).

Des suggestions ou des exemples de code?

Je veux dire mon but est de cette valeur obtenir deux fichiers dans les clés privées et publiques PEM à passer à openssl par exemple.

Un grand merci, Andrea

Répondre

1

touches RSA PEM-codées sont essentiellement les clés binaires dans le format décrit par PKCS # 1 (RFC 3447), Codé à base 64 et entouré d'un en-tête ASCII et pied de page. Notez que le format PKCS # 1 requiert qu'une clé privée inclut non seulement d, e, p et q, mais aussi les autres valeurs utilisées pour le théorème des restes chinois (d mod (p-1), d mod (q- 1), et (inverse de q) mod p). Ceux-ci sont facilement calculés si vous connaissez p et q.

Il y a un peu plus à faire si les clés sont cryptées, comme vous devriez alors avoir quelques en-têtes PEM qui décrivent le cryptage.

Il y a un exemple de code dans les sources OpenSSL (bien qu'il soit peu commenté, et assez difficile à suivre). Il vaut mieux lire les RFC pertinents, et vérifier votre code par rapport à OpenSSL pour vous assurer que vous avez bien compris.

0

OpenSSL/pem.h a des fonctions suivantes pour la lecture/écriture des clés RSA (à partir d'un fichier) PEM_write_RSAPrivateKey PEM_read_PrivateKey

PEM_write_RSAPublicKey PEM_read_RSAPublicKey

si elle sait toujours pas comment les utiliser il suffit de demander. Je vais vous fournir quelques exemples :-)

+0

Si vous pouvez me donner un exemple, j'apprécierais beaucoup! Merci beaucoup pour votre gentillesse. – Kerby82

0

Ceci est un exemple pour RSA dans un projet VB.NET.

ÉTAPE 1

D'abord, vous devez formater votre N, E, P, Q, DP, DQ, InverseQ, D données clés (tous !! Voir plus loin) en base64 et de construire avec eux une chaîne structurée XML (ou fichier) comme ceci:

<RSAKeyValue> 
<Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW1Iix</Modulus> 
<Exponent>AQ...</Exponent> 
<P>5w/iuGIBZdTYasdfalksdkkdkdksdldfdfs</P> 
<Q>0ilXTMYjwhp+JvQPo3gnRAF0EgoHPm6tBt1</Q> 
<DP>JS2gLEzQrsLlnlkQCRZ55+RtM6cphJSa5x</DP> 
<DQ>RMWugbsdHHma6phXPcEl6EUpfHW3pSCGko</DQ> 
<InverseQ>h54IMS+ZabAn/WzOFTApgB4y16Az</InverseQ> 
<D>OjnoUo+E02CcU3TBcDFnmlrJ2ORUcXCy5FB</D> 
</RSAKeyValue> 

(Bien sûr, ce un est faux, ne pas essayer de l'utiliser ou jetteront erreur)

Comme les dames l'ont dit, vous devez également avoir D, DP, DQ et InverseQ. Si vous n'en avez pas, les choses deviennent plus compliquées mais pas impossibles, car vous devez les calculer vous-même. Le moyen le plus simple (pour moi) était d'accéder au code source de l'outil qui construit les numéros P et Q pour moi. A l'intérieur, il y avait des classes pour fonctionner avec ce genre de grands nombres. En modifiant légèrement le code, je pourrais calculer:

DP = (1/Exponent) mod (P - 1) 
DQ = (1/Exponent) mod (Q - 1) 
InverseQ = (1/Q) mod P where P > Q 

Voir la dernière ligne, vous devez tenir compte du fait que les normes exigent que P>Q ou seront rejetées la clé. Cependant, l'outil que j'ai utilisé avec Delphi (TPLockBox 2.0) ne s'en souciait pas. En notant que les nombres hexadécimaux au-dessus de XML sont big endian, et en regardant vos touches P et Q, voyez que vous pouvez rencontrer des problèmes car D9<E2, donc P<Q !! Échanger vos numéros P et Q avant que tout calcul ne résout, si j'ai raison (je ne suis absolument pas sûr de ce point, quelqu'un pourrait-il confirmer?)

Enfin, convertir tous les nombres en base64 et construire le XML ci-dessus structure.

ÉTAPE 2

Avec BouncyCastle, cela est plus facile. Téléchargez BouncyCastle.dll, copiez-le dans votre dossier de projet (ou ailleurs) et ajoutez-y une référence dans votre projet VB; maintenant, vous aurez un nouvel espace de noms « org » et vous pouvez le code:

Dim r As New RSACryptoServiceProvider() 
' NOTE: substitute next string with above-like XML, 
' or load it from a file or what you prefer: 
r.FromXmlString("<RSAKeyValue><Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW........</RSAKeyValue>") 
Dim key As Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair = Org.BouncyCastle.Security.DotNetUtilities.GetRsaKeyPair(r) 
' Export to a PEM file:   
Dim fOut As New IO.StreamWriter("c:\keys.pem", False) 
Dim pw As New Org.BouncyCastle.OpenSsl.PemWriter(fOut) 
pw.WriteObject(key) 

espère que cela aide à tous les noobs comme moi qui suintaient comme je l'ai fait tout en regardant la procédure.