2010-07-15 18 views
12

ich die .NET-Klasse verwendet haben RSACryptoServiceProvider ein Schlüsselpaar zu erhalten:Interoperabilität zwischen RSACryptoServiceProvider und openSSL

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

Nun würde Ich mag diese mit openSSH verwenden, aber der Schlüssel Format sieht nichts gleichermaßen. Kann jemand sowohl den öffentlichen als auch den privaten Schlüssel in Dateien konvertieren, die openSSH verwenden kann?

Danke!

+2

http://stackoverflow.com/questions/497428/how-do-i-import-an-rsa-public -key-from-net-in-openssl sieht so aus als ob es funktionieren sollte, nein? –

Antwort

2

Dieser Blog-Beitrag über die Verwendung von OpenSSL and RSACryptoServiceProvider besagt, dass es möglich ist, aber der Autor endete mit der Chilkat RSA-Bibliothek, um letztendlich mit OpenSSL innerhalb von C# zu interoperieren. Das PEM-Format wird in der .NET-Welt nicht unterstützt, daher können Sie diese Bibliothek von JavaScience mit der Bezeichnung OpenSSLKey.cs; aber, wie der Autor der Blog-Post erwähnt hatten sie Probleme aufgrund dieser (quoted):

OpenSSL: Nur kleine Stückchen Daten signieren, die innerhalb eines einzelnen Blöcke passen. Die Daten sind aufgefüllt und signiert. Die Umkehrung wird "Verify" genannt, und in diesem Fall Fall sind die Daten "unsigned" und dann ungepolded und die ursprünglichen Daten sind zurückgegeben.

[Windows]: Kann eine beliebige Anzahl von Daten signieren. Die Zeichen * -Methoden hashen zuerst die Daten und dann wird der Hash aufgefüllt und signiert. Die Verify * -Methoden erwarten drei Eingaben: die ursprünglichen Daten, ein Hash-Algorithmus-Name und die Signatur Daten. Die Originaldaten werden gehasht und das Ergebnis des unsignieren/ungepadding ist verglichen mit dem Hash der ursprünglichen Daten.

Also ich empfehle Ihnen, mit der Chilkat RSA-Bibliothek zu gehen.

+1

Nein, ich denke OpenSSL kann eine beliebige Menge an Daten signieren, auch .. Sie verwenden eine Kombination von EVP_SignInit, null oder viele EVP_SignUpdates und ein EVP_SignFinal. Es ist nicht schwer, ICryptoTransform und andere .NET Crypto-Interfaces über einen nativen OpenSSL-Wrapper wie openssl-net auf sourceforge zu implementieren. – maxwellb

8

Ich musste wirklich OpenSSL Interoperabilität mit RSACryptoServiceProvider erreichen, so dass ich ein Softwarelizenzschlüssel-System implementieren konnte (Ref).

Ich musste in der Lage sein, die privaten und öffentlichen Schlüssel in Linux mit openssl zu erstellen, damit sie später für die Lizenzverwaltung in einer PHP-Webanwendung verwendet werden konnten. Verwenden Sie sie jedoch auch als Grundlage für ein RSA-Signaturlizenzsystem in einer VB.Net-Anwendung.

Nach einer Woche der Suche, habe ich schließlich entdeckt, dass dies perfekt möglich ist, also dachte ich, ich würde es teilen.

Starten Sie unter Linux (oder einem anderen nützlichen Betriebssystem) und verwenden Sie openssl, um einen privaten Schlüssel (private.pem), einen öffentlichen Schlüssel (public.pem), ein Zertifikat (certificate.crt) und eine Exchange-Datei für persönliche Informationen zu erstellen (Zertifikat.pfx). Machen Sie sich keine Sorgen über die Felder CN und emailAddress, die Zertifikats- und pfx-Dateien werden nur als Vehikel verwendet, um den öffentlichen oder privaten Schlüssel in das RSACryptoServiceProvider-Objekt zu bekommen.

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 

nun den privaten Schlüssel in den Code zu bekommen:

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

Wenn Sie den privaten Schlüssel oder öffentliche Schlüssel versuchen müssen dies:

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

Um den öffentlichen Schlüssel in das bekommen code:

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

Wenn Sie brauchen d der öffentliche Schlüssel versuchen Sie dies:

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

Mehr Informationen zu kommen .....