Я пытаюсь зашифровать и расшифровать данные с помощью RSA в C #. У меня есть следующий тестовый модуль MSTest:
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");
Не удается во время расшифровки, но только иногда. Кажется, что когда бы я ни устанавливал точки останова и проходил тест, он проходил. Это заставило меня подумать, что, возможно, что-то не было завершено вовремя, чтобы расшифровка прошла успешно, и мой медленный переход по нему во время отладки дал достаточно времени для завершения. Когда это терпит неудачу, строка, в которой это, кажется, терпит неудачу, является decryptedBytes = rsa.Decrypt(bytesToDecrypt, false);
следующим способом:
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);
}
Сбой с этим исключением:
System.Security.Cryptography.CryptographicException: неверные данные
Мой Encrypt
метод выглядит следующим образом:
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
- это просто следующее:
public static readonly UnicodeEncoding ByteConverter = new UnicodeEncoding();
Я видел несколько вопросов в StackOverflow о шифровании и дешифровании RSA с помощью .NET. Этот был из-за шифрования с помощью закрытого ключа и попытки расшифровки с помощью открытого ключа, но я не думаю, что я делаю это. Этот вопрос имеет то же исключение, что и я, но выбранный ответ должен был использовать OpenSSL.NET, чего я бы предпочел не делать.
Что я делаю не так?