2010-07-15 4 views
12

Je l'ai utilisé la classe .NET RSACryptoServiceProvider pour obtenir une paire de clés:L'interopérabilité entre les RSACryptoServiceProvider et OpenSSL

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
{ 
    File.WriteAllText ("PublicKeyOnly.xml", rsa.ToXmlString (false)); 
    File.WriteAllText ("PublicPrivate.xml", rsa.ToXmlString (true)); 
} 

Maintenant, je voudrais l'utiliser avec OpenSSH, mais le format de clé se ressemble rien. Est-ce que quelqu'un sait comment convertir les clés publiques et privées en fichiers que l'utilisateur peut utiliser?

Merci!

+2

http://stackoverflow.com/questions/497428/how-do-i-import-an-rsa-public -key-from-net-into-openssl ressemble à ça devrait marcher, non? –

Répondre

2

Cet article de blog sur l'utilisation de OpenSSL and RSACryptoServiceProvider indique que c'est possible, mais l'auteur a fini par utiliser la bibliothèque Chilkat RSA pour finalement interopérer avec OpenSSL à partir de C#. Le format PEM n'est pas pris en charge dans le monde .NET, vous pouvez donc utiliser cette bibliothèque à partir de JavaScience, appelée OpenSSLKey.cs; Cependant, comme l'auteur du blog mentionne qu'ils avaient des problèmes en raison de cette (quoted):

OpenSSL: Ne peut signer des petits morceaux de données qui correspondent à l'intérieur d'un seul bloc. Les données sont complétées et signées. L'inverse est appelé "vérifier" et dans ce cas les données sont "non signées", puis non rembourré et les données d'origine sont retourné. [Windows]: peut signer n'importe quelle quantité de données . Les méthodes Sign * hachent d'abord les données puis le hachage est complété et signé. Les méthodes Verify * attendent trois entrées: les données d'origine, un nom d'algorithme de hachage et les données de signature . Les données d'origine sont hachées et le résultat de non-signature/non-rembourrage est par rapport au hachage des données originales .

Je vous recommande donc d'utiliser la bibliothèque Chilkat RSA.

+1

Non, je pense qu'OpenSSL peut signer n'importe quelle quantité de données, aussi .. vous utilisez une combinaison de EVP_SignInit, zéro ou plusieurs EVP_SignUpdate et un EVP_SignFinal. Il n'est pas trop difficile d'implémenter ICryptoTransform et d'autres interfaces .NET Crypto au-dessus d'un wrapper natif OpenSSL tel que openssl-net sur sourceforge. – maxwellb

8

J'avais vraiment besoin de l'interopérabilité OpenSl avec RSACryptoServiceProvider pour pouvoir implémenter un système de clé de licence logicielle (Ref).

Je devais être capable de créer les clés privées et publiques sous Linux en utilisant openssl afin qu'elles puissent ensuite être utilisées pour la gestion des licences dans une application web PHP. Pourtant, également les utiliser comme base d'un système de licence de signature RSA dans une application VB.Net. Après une semaine de recherche, j'ai finalement découvert que c'est parfaitement possible, alors j'ai pensé que je le partagerais. Démarrer sur Linux (ou tout autre système d'exploitation) et utiliser openssl pour créer une clé privée (private.pem), une clé publique (public.pem), un certificat (certificate.crt) et un fichier d'échange d'informations personnelles (certificate.pfx). Ne vous inquiétez pas des champs CN et emailAddress, les fichiers certificat et pfx ne sont utilisés que pour véhiculer la clé publique ou privée dans l'objet RSACryptoServiceProvider.

openssl genrsa -out private.pem 1024 
openssl rsa -in private.pem -out public.pem -pubout 
openssl req -nodes -x509 -days 3650 -subj '/CN=www.example.com/[email protected]' -new -key private.pem -out certificate.crt 
openssl pkcs12 -export -out certificate.pfx -inkey private.pem -in certificate.crt 

Maintenant, pour obtenir la clé privée dans le code:

Dim cert As New X509Certificate2("certificate.pfx", "", X509KeyStorageFlags.Exportable) 
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider) 

Si vous avez besoin de la clé privée ou publique, essayez ceci:

msgbox(rsaProvider.ToXmlString(True)) 'Private key in XML format 
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format 

Pour obtenir la clé publique dans la code:

Dim cert As New X509Certificate2("certificate.crt") 
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PublicKey.Key, RSACryptoServiceProvider) 

Si vous devez d la clé publique, essayez ceci:

msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format 

Plus à venir .....

Questions connexes