2017-02-11 5 views
1

Ich habe DER-RSA-Schlüsselpaar in Crypto ++ erstellt, sowie Chiffre. Sie sind Base64Encoded Zeichenfolge. Ich decodiere zuerst die Daten von Base64 zu Bytearray, aber ich bin nicht sicher, wie man sie in RSACryptoServiceProvider lädt.Laden Sie ASN.1/DER-RSA-Schlüsselpaar verschlüsselt in C#

static void Main() 
{ 
    string pbkeystr = "mypublickey"; 
    string pvkeystr = "myprivatekey"; 
    string cipherstr = "mycipher"; 

    byte[] pbkey = Convert.FromBase64String(pbkeystr); 
    byte[] pvkey = Convert.FromBase64String(pvkeystr); 
    byte[] cipher = Convert.FromBase64String(cipherstr); 

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

    //Set keys here.. 

    //Decrypt the cipher using private key 
    rsa.Decrypt(pvkey, false); 
} 

Es gibt keine Funktionen zum Einstellen der Tasten. Die einzige Sache, die ich fand, war ImportParameters Methode, die RSAParameters Klasse, die aus , q, n, Modul, Exponent usw. dauert. Ich habe keinen Zugriff auf diese.

Gibt es eine Möglichkeit, wie ich die Schlüssel als String laden kann? Wie kann ich den Schlüssel in RSACryptoServiceProvider laden?

+1

Was ist in der Base64-codierten Zeichenfolge? Ein DER/PEM ASN.1-Schlüssel oder etwas anderes? – yaakov

+0

Es ist DER von Crypto ++ – Kyojin

Antwort

1

Gibt es eine Möglichkeit, die Schlüssel als String zu laden? Wie kann ich den Schlüssel in RSACryptoServiceProvider laden?

Von Ihrem anderen Crypto ++ Frage, How to load Base64 RSA keys in Crypto++, es sieht aus wie Sie nur die öffentlichen und privaten Schlüssel haben, weil Sie DEREncode und BERDecode verwendet. Das heißt, Sie haben die RSA-Parameter und nicht die Informationen zum öffentlichen Schlüssel des Subjekts und die Informationen zum privaten Schlüssel. Ihren Schlüsseln fehlen die OID-Kennungen und Versionsnummern. So ist es gut.

Von Cryptographic Interoperability: Keys auf dem Code-Projekt benötigen Sie eine C# -Klasse, die die ASN.1/DER analysiert, nachdem Sie Base64 dekodieren. Der CodeProject-Artikel stellt eine C# -Klasse mit dem Namen AsnKeyParser zum Lesen der ASN.1/DER bereit und gibt eine RSAParameters zum Laden in einen CSP zurück.

Der Code für die AsnKeyParser Klasse ist etwa 800 Zeilen, und es gibt fünf weitere unterstützende Dateien, um alles passieren zu lassen, so ist es nicht wirklich angebracht, es hier zu platzieren. Sie sollten es selbst herunterladen. Die Datei von Interesse heißt CSInteropKeys.zip.

Sobald Sie die Klasse AsnKeyParser verdrahten, wird es für einen öffentlichen RSA-Schlüssel so einfach wie folgt sein. Der private Schlüssel wird ähnlich sein und der Code wird auf der CodeProject-Site angegeben.

// Your ASN.1/DER parser class 
AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der"); 
RSAParameters publicKey = keyParser.ParseRSAPublicKey(); 

// .Net class 
CspParameters csp = new CspParameters; 
csp.KeyContainerName = "RSA Test (OK to Delete)";  
csp.ProviderType = PROV_RSA_FULL; // 1 
csp.KeyNumber = AT_KEYEXCHANGE;  // 1 

// .Net class 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 
rsa.PersistKeyInCsp = false; 
rsa.ImportParameters(publicKey); 

wird Verknüpfen mit Dateien auf einer anderen Website verpönt, aber ich weiß nicht, wie die Informationen auf andere Weise zur Verfügung zu stellen. Es gibt zu viel Quellcode, um eine Antwort zu geben.


Zur Vollständigkeit macht .Net nicht make Interop einfach. Sie akzeptieren nicht ASN.1/DER oder PEM. Stattdessen akzeptiert .NET einige XML-Darstellungen der Schlüssel. Ich glaube, Sie können es in RFC 3275, XML-Signature Syntax and Processing finden. Microsoft does not state that for you. Ich habe es irgendwie zusammengesetzt, als ich den Code Project Artikel geschrieben habe.

Vielleicht sollten wir Crypto ++ eine Klasse hinzufügen, um XML zusätzlich zu ASN.1/DER und PEM zu erbrechen.

+0

Okay, was ich getan habe, war ich die Base64-Zeichenfolge gelesen und konvertiert es in Byte-Daten (konvertiert von Base64 zurück zu den ursprünglichen Bytes DEREncoded). Es wurde in eine Datei namens "rsa-private.der" geschrieben und wie in Ihrem Beispiel an den AsnKeyParser übergeben, aber ich bekomme eine Ausnahme: CryptographicException: Parameter war ungültig. http://pastebin.com/hLwErEfp Was habe ich falsch gemacht? – Kyojin

+0

@Kyojin - Aus Ihren Notizen zum PasteBin sieht es so aus, als ob die Ausnahme bei 'var data = rsp.Decrypt (cipherArr, false)' auftritt. Ist das korrekt? Wenn das der Fall ist, bedeutet das, dass der private Schlüssel wie erwartet geladen wurde. Ich vermute, das Problem ist entweder 'csp.KeyNumber = AT_KEYEXCHANGE' oder sein Sie RSA Padding. Vielleicht können Sie ['Decrypt Method (Byte [], RSAEncryptionPadding)'] (https://msdn.microsoft.com/en-us/library/mt132683 (v = vs.110) .aspx) versuchen. Wenn es mehr als Polsterung ist, dann sollten Sie wahrscheinlich eine neue Frage stellen. Stack Overflow hält Fragen und Antworten gerne eng. – jww

+0

Ja, ich habe rsa.ToXmlString() und überprüft, und alles ist korrekt und das gleiche wie die Base64-Zeichenfolge in der Datei. Warum also hat er die Chiffre nicht entschlüsselt? Schätze, das ist jetzt offtopic. – Kyojin