Próbuję szyfrować i odszyfrowywać dane przy użyciu RSA w języku C#. Mam następujący test jednostki MSTest:Kryptograficzny wyjątek pojawia się sporadycznie podczas szyfrowania/odszyfrowywania za pomocą RSA
const string rawPassword = "mypass";
// Encrypt
string publicKey, privateKey;
string encryptedPassword = RSAUtils.Encrypt(rawPassword, out publicKey, out privateKey);
Assert.AreNotEqual(rawPassword, encryptedPassword,
"Raw password and encrypted password should not be equal");
// Decrypt
string decryptedPassword = RSAUtils.Decrypt(encryptedPassword, privateKey);
Assert.AreEqual(rawPassword, decryptedPassword,
"Did not get expected decrypted password");
Błąd podczas odszyfrowywania, ale tylko czasami. Wygląda na to, że za każdym razem, gdy ustawiam punkty przerwania i przechodzę test, przechodzi. To sprawiło, że pomyślałem, że być może coś nie zakończyło się na czas, aby odszyfrować pomyślnie, a ja spowalniając przechodzenie przez niego podczas debugowania dało mu wystarczająco dużo czasu na dokończenie. Gdy to się nie powiedzie, linia wydaje się nie na to decryptedBytes = rsa.Decrypt(bytesToDecrypt, false);
w następujący sposób:
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);
}
To nie z tego wyjątku:
System.Security.Cryptography.CryptographicException: Bad danych
Moja Encrypt
sposób jest następujący:
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);
}
ByteConverter
używane w całym tylko następujące:
public static readonly UnicodeEncoding ByteConverter = new UnicodeEncoding();
Widziałem kilka pytań na StackOverflow dotyczące szyfrowania i deszyfrowania RSA z .NET. This one było spowodowane zaszyfrowaniem kluczem prywatnym i próbą odszyfrowania za pomocą klucza publicznego, ale nie sądzę, żebym to zrobił. This question ma taki sam wyjątek jak ja, ale wybraną odpowiedzią było użycie OpenSSL.NET, którego wolałbym nie robić.
Co robię źle?
Hm, próba, która daje mi inny wyjątek: "System.FormatException: Niepoprawna długość dla tablicy znaków Base-64". To miało miejsce w pierwszym wierszu 'Encrypt':' byte [] bytesToEncrypt = Convert.FromBase64String (textToEncrypt); '. –
@Sarah - Ok, zaktualizowałem twój przykład. Testowałem to i wygląda na to, że działa. – SwDevMan81
To działa! Dzięki. Nigdy bym nie pomyślał o użyciu tej kombinacji 'Convert' /' UnicodeEncoding'. –