2016-05-24 4 views
3

Ich versuche eine Funktion zu schreiben, die eine codierte Zeichenfolge und einen öffentlichen Schlüssel als Base64-codierte Zeichenfolge im PKCS # 1-Format empfängt und eine codierte Zeichenfolge zurückgibt.C# RSA Verschlüsseln von Text mit einem bestimmten öffentlichen PKCS # 1-Schlüssel

public static string EncryptRsa(string stringPublicKey, string stringDataToEncrypt) 
{ 
    byte[] publicKey = Convert.FromBase64String(stringPublicKey); 

    // Code to create an RSACryptoServiceProvider with the public key 
    // var rsa = new RSACryptoServiceProvider(??) 

    byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt); 
    var encryptedData = rsa.Encrypt(dataToEncrypt, true); 
    return Convert.ToBase64String(encryptedData); 
} 

Ich habe über viele Fragen und Antworten über letzten Tag gesehen, wie die RSA-Algorithmus zur Verschlüsselung verwenden, haben aber nicht gefunden Informationen darüber, wie ein RSACryptoServiceProvider zu erstellen, wenn ich bereits einen vorhandenen Schlüssel haben (genauer gesagt, in einem PKCS # 1-Format), nur wie ein Schlüsselpaar erzeugt wird.

zum Beispiel: Wie würde ich mit der folgenden Zeichenfolge Daten mit RSA-Verschlüsselung verschlüsseln?

----- PUBLIC KEY BEGIN ----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6 + H0qtjTkVxwTCpvKe4eCZ0 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/ 3j + skZ6UtW + 5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB

----- END PUBLIC KEY -----

Danke !!

+0

Vielleicht hilft das - Sie wissen nicht, ob es zu einem Format http passt: //stackoverflow.com/questions/1528928/using-a-previously-generated-rs-a-public-private-key-with-the-net-framework –

Antwort

3

Sie können BouncyCastle verwenden, eine .NET-Bibliothek, mit der Sie von PKCS # 1-formatierten Schlüsseln in tatsächliche Schlüsselparameter konvertieren können, die zum Verschlüsseln und Entschlüsseln verwendet werden können.

Da der öffentliche Schlüssel, den Sie haben, als PKCS # 1 base64-codierter Wert formatiert ist. Dann können Sie den öffentlichen Schlüssel als ASN.1-Objekt mit BouncyCastle wie folgt dekodieren

Sie müssen '----- BEGIN PUBLIC KEY -----' und '----- END entfernen PUBLIC KEY ----- 'von der stringPublicKey, bevor Sie fortfahren.

Asn1Object obj = Asn1Object.FromByteArray(Convert.FromBase64String(stringPublicKey)); 

Dann angegeben wie in RFC 3447 (A 1.1):

DerSequence publicKeySequence = (DerSequence)obj; 

DerBitString encodedPublicKey = (DerBitString)publicKeySequence[1]; 
DerSequence publicKey = (DerSequence)Asn1Object.FromByteArray(encodedPublicKey.GetBytes()); 

DerInteger modulus = publicKey[0]; 
DerInteger exponent = publicKey[1]; 

Hier haben Sie alle benötigen Sie einen öffentlichen Schlüssel zu erstellen:

RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue); 

Dann liefert BouncyCastle eine einfache Möglichkeit zu konvertieren dies zu .NET kompatibel RSAParameters:

RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters); 

Anschließend können Sie importieren einfach identifizieren die wichtigsten Parameter in RSACryptoServiceProvider:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.ImportParameters(parameters); 

Schließlich haben Ihre Verschlüsselung:

byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt); 
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true); 
return Convert.ToBase64String(encryptedData); 
+0

Danke! Scheint zu arbeiten –

Verwandte Themen