Tôi đang cố mã hóa và giải mã dữ liệu bằng RSA trong C#. Tôi có bài kiểm tra đơn vị MSTest sau:CryptographicException không liên tục xảy ra khi mã hóa/giải mã bằng 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");
Không thành công trong quá trình giải mã, nhưng đôi khi. Nó có vẻ như bất cứ khi nào tôi đặt breakpoint và bước qua các thử nghiệm, nó đi qua. Điều này làm cho tôi nghĩ có lẽ một cái gì đó đã không được hoàn thành trong thời gian để giải mã xảy ra thành công, và tôi làm chậm bước qua nó trong khi gỡ lỗi đã cho nó đủ thời gian để hoàn thành. Khi nó không thành công, dòng có vẻ như thất bại tại là decryptedBytes = rsa.Decrypt(bytesToDecrypt, false);
bằng phương pháp sau:
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);
}
Nó không thành công với ngoại lệ này:
System.Security.Cryptography.CryptographicException: Xấu dữ liệu
phương pháp Encrypt
của tôi là như sau:
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);
}
Các ByteConverter
sử dụng trong suốt chỉ như sau:
public static readonly UnicodeEncoding ByteConverter = new UnicodeEncoding();
Tôi đã nhìn thấy một vài câu hỏi về StackOverflow về mã hóa RSA và giải mã với .NET. This one là do mã hóa bằng khóa riêng và cố gắng giải mã bằng khóa công khai, nhưng tôi không nghĩ mình đang làm điều đó. This question có cùng ngoại lệ với tôi, nhưng câu trả lời được chọn là sử dụng OpenSSL.NET, mà tôi không muốn làm.
Tôi đang làm gì sai?
Hm, việc thử cung cấp cho tôi một ngoại lệ khác: "System.FormatException: Độ dài không hợp lệ đối với mảng char Base-64". Điều này xảy ra trên dòng đầu tiên của 'Encrypt':' byte [] bytesToEncrypt = Convert.FromBase64String (textToEncrypt); '. –
@Sarah - Ok, tôi đã cập nhật ví dụ của bạn. Tôi đã thử nghiệm nó ra và nó trông liek nó hoạt động. – SwDevMan81
Điều đó hoạt động! Cảm ơn. Tôi sẽ không bao giờ nghĩ đến việc sử dụng kết hợp của 'Convert' /' UnicodeEncoding'. –