Tôi đang gặp sự cố khi sử dụng vùng chứa khóa RSA cấp máy khi chỉ lưu trữ khóa công khai của cặp khóa công khai/riêng tư.Cách cất giữ khóa công khai trong ngăn chứa khóa RSA cấp máy
Đoạn mã sau tạo cặp công cộng/riêng và trích xuất khóa công khai từ cặp đó. Cặp và khóa công cộng được lưu trữ trong các vùng chứa khóa riêng biệt. Các chìa khóa sau đó được lấy từ những thùng chứa chính tại thời điểm đó chúng nên giống như các phím đi vào các thùng chứa.
Mã này hoạt động khi CspProviderFlags.UseDefaultKeyContainer
được quy định cho CspParameters.Flags
(ví dụ phím đọc lại ra khỏi PublicKey container là giống nhau), nhưng khi CspProviderFlags.UseMachineKeyStore
được quy định cho CspParameters.Flags
phím đọc lại từ PublicKey là khác nhau.
Tại sao hành vi lại khác và tôi cần phải làm gì khác để truy xuất khóa công khai từ vùng chứa khóa RSA cấp máy?
var publicPrivateRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicPrivateKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
)
{
PersistKeyInCsp = true,
};
var publicRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
)
{
PersistKeyInCsp = true
};
//Export the key.
publicRsa.ImportParameters(publicPrivateRsa.ExportParameters(false));
Console.WriteLine(publicRsa.ToXmlString(false));
Console.WriteLine(publicPrivateRsa.ToXmlString(false));
//Dispose those two CSPs.
using (publicRsa)
{
publicRsa.Clear();
}
using (publicPrivateRsa)
{
publicRsa.Clear();
}
publicPrivateRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicPrivateKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
);
publicRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
);
Console.WriteLine(publicRsa.ToXmlString(false));
Console.WriteLine(publicPrivateRsa.ToXmlString(false));
using (publicRsa)
{
publicRsa.Clear();
}
using (publicPrivateRsa)
{
publicRsa.Clear();
}
Thảo luận về câu hỏi này có thể được tìm thấy tại MSDN (http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/e3902420-3a82-42cf-a4a3-de230ebcea56) –