Tôi đang nhìn chằm chằm vào điều này trong một thời gian và nhờ vào số MSDN documentation Tôi thực sự không thể hiểu được điều gì đang xảy ra. Về cơ bản tôi đang tải một tập tin PFX từ đĩa vào một X509Certificate2
và cố gắng để mã hóa một chuỗi bằng cách sử dụng khóa công khai và giải mã bằng cách sử dụng khóa riêng.CryptographicException "Khóa không hợp lệ để sử dụng ở trạng thái được chỉ định". trong khi cố gắng xuất RSAParameters của khóa riêng X509
Tại sao tôi bối rối: mã hóa/giải mã hoạt động khi tôi vượt qua tham chiếu đến RSACryptoServiceProvider
bản thân:
byte[] ed1 = EncryptRSA("foo1", x.PublicKey.Key as RSACryptoServiceProvider);
string foo1 = DecryptRSA(ed1, x.PrivateKey as RSACryptoServiceProvider);
Nhưng nếu việc xuất khẩu và vượt qua xung quanh RSAParameter
:
byte[] ed = EncryptRSA("foo", (x.PublicKey.Key as RSACryptoServiceProvider).ExportParameters(false));
string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider).ExportParameters(true));
.. .it ném một "Khóa không hợp lệ để sử dụng trong trạng thái được chỉ định". ngoại lệ trong khi cố gắng xuất khóa cá nhân sang RSAParameter
. Xin lưu ý rằng chứng chỉ PFX được tạo ra được đánh dấu là có thể xuất được (tức là tôi đã sử dụng cờ pe trong khi tạo chứng chỉ). Bất kỳ ý tưởng gì gây ra ngoại lệ?
static void Main(string[] args)
{
X509Certificate2 x = new X509Certificate2(@"C:\temp\certs\1\test.pfx", "test");
x.FriendlyName = "My test Cert";
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
try
{
store.Add(x);
}
finally
{
store.Close();
}
byte[] ed1 = EncryptRSA("foo1", x.PublicKey.Key as RSACryptoServiceProvider);
string foo1 = DecryptRSA(ed1, x.PrivateKey as RSACryptoServiceProvider);
byte[] ed = EncryptRSA("foo", (x.PublicKey.Key as RSACryptoServiceProvider).ExportParameters(false));
string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider).ExportParameters(true));
}
private static byte[] EncryptRSA(string data, RSAParameters rsaParameters)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
byte[] plainData = bytConvertor.GetBytes(data);
RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
publicKey.ImportParameters(rsaParameters);
return publicKey.Encrypt(plainData, true);
}
private static string DecryptRSA(byte[] data, RSAParameters rsaParameters)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider();
privateKey.ImportParameters(rsaParameters);
byte[] deData = privateKey.Decrypt(data, true);
return bytConvertor.GetString(deData);
}
private static byte[] EncryptRSA(string data, RSACryptoServiceProvider publicKey)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
byte[] plainData = bytConvertor.GetBytes(data);
return publicKey.Encrypt(plainData, true);
}
private static string DecryptRSA(byte[] data, RSACryptoServiceProvider privateKey)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
byte[] deData = privateKey.Decrypt(data, true);
return bytConvertor.GetString(deData);
}
Chỉ cần làm rõ trong đoạn mã trên phần in đậm là ném: string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider)**.ExportParameters(true)**);
Xin lỗi nếu tôi đã không làm rõ bản thân mình rất tốt, tôi có thể phá vỡ dòng này: chuỗi foo = DecryptRSA (ed, (x.PrivateKey như RSACryptoServiceProvider) .ExportParameters (true)); thành: var pvk = (x.PrivateKey là RSACryptoServiceProvider); var pvkParam = pvk.ExportParameters (true); chuỗi foo = DecryptRSA (ed, pvkParam); ... và nếu tôi làm điều đó pvk.ExportParameters (true); sẽ ném. – kalrashi
Lỗi này là một trong những lỗi khó chịu nhất từng được viết. Nó có thể có nghĩa là rất nhiều thứ. Đối với tôi, như Jeroen đã nói: văn bản tin nhắn của tôi quá lớn để được mã hóa bởi khóa (đó là nhược điểm của mã hóa không đồng bộ). – Aejay