auf Ich versuche, Daten mit RSA in C# zu verschlüsseln und zu entschlüsseln. Ich habe den folgenden MSTest Komponententest:CryptographicException tritt zeitweise beim Verschlüsseln/Entschlüsseln mit RSA
Es schlägt während der Entschlüsselung, aber nur manchmal. Es scheint so, als ob jedes Mal, wenn ich Breakpoints setze und den Test durchlaufe, es passiert. Das brachte mich dazu zu denken, dass vielleicht etwas nicht rechtzeitig fertig wurde, damit die Entschlüsselung erfolgreich durchgeführt werden konnte, und ich verlangsamte das Durchlaufen, während das Debugging ihm genügend Zeit gab, um abgeschlossen zu werden. Wenn es fehlschlägt, scheint die Linie es zum Scheitern verurteilt ist decryptedBytes = rsa.Decrypt(bytesToDecrypt, false);
in der folgenden Methode:
public static string Decrypt(string textToDecrypt, string privateKeyXml)
{
if (string.IsNullOrEmpty(textToDecrypt))
{
throw new ArgumentException(
"Cannot decrypt null or blank string"
);
}
if (string.IsNullOrEmpty(privateKeyXml))
{
throw new ArgumentException("Invalid private key XML given");
}
byte[] bytesToDecrypt = ByteConverter.GetBytes(textToDecrypt);
byte[] decryptedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKeyXml);
decryptedBytes = rsa.Decrypt(bytesToDecrypt, false); // fail here
}
return ByteConverter.GetString(decryptedBytes);
}
Es schlägt fehl, mit dieser Ausnahme:
System.Security.Cryptography.CryptographicException: Bad Daten
Meine Encrypt
Methode ist wie folgt:
public static string Encrypt(string textToEncrypt, out string publicKey,
out string privateKey)
{
byte[] bytesToEncrypt = ByteConverter.GetBytes(textToEncrypt);
byte[] encryptedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
encryptedBytes = rsa.Encrypt(bytesToEncrypt, false);
publicKey = rsa.ToXmlString(false);
privateKey = rsa.ToXmlString(true);
}
return ByteConverter.GetString(encryptedBytes);
}
Die ByteConverter
durchgehend verwendet nur die folgenden:
public static readonly UnicodeEncoding ByteConverter = new UnicodeEncoding();
Ich habe ein paar Fragen auf Stackoverflow über die RSA-Verschlüsselung und Entschlüsselung mit .NET gesehen. This one war aufgrund der Verschlüsselung mit dem privaten Schlüssel und versuchen, mit dem öffentlichen Schlüssel zu entschlüsseln, aber ich glaube nicht, dass ich das tue. This question hat die selbe Ausnahme wie ich, aber die ausgewählte Antwort war, OpenSSL.NET zu verwenden, was ich lieber nicht machen würde.
Was mache ich falsch?
Hm, versuchen, das gibt mir eine andere Ausnahme: "System.FormatException: Ungültige Länge für eine Base-64 Char-Array". Dies geschah in der ersten Zeile von 'Encrypt':' byte [] bytesToEncrypt = Convert.FromBase64String (textToEncrypt); '. –
@Sarah - Ok, ich habe dein Beispiel aktualisiert. Ich habe es getestet und es sieht gut aus, dass es funktioniert. – SwDevMan81
Das funktioniert! Vielen Dank. Ich hätte nie gedacht, diese Mischung aus 'Convert' /' UnicodeEncoding' zu verwenden. –