2010-02-16 34 views
9

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(); 
} 
+1

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) –

Trả lời

4

Dường như container quan trọng này không dành cho mục đích này (điều này được ngụ ý bởi "Làm thế nào để: Lưu trữ Asymmetric Keys trong một kho chứa khóa" từ hướng dẫn .NET Framework phát triển, và được xác nhận bởi a disccusion on MSDN).

Các cơ chế khác, chẳng hạn như lưu trữ khóa trong tệp XML, cần được sử dụng để đạt được mục tiêu này.

-1

Liên kết này có thể giúp bạn. http://msdn.microsoft.com/en-IN/library/tswxhw92(v=vs.80).aspx

var cp = new CspParameters(); 
cp.KeyContainerName = ContainerName; 

// Create a new instance of RSACryptoServiceProvider that accesses 
// the key container. 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 

// Delete the key entry in the container. 
rsa.PersistKeyInCsp = false; 

// Call Clear to release resources and delete the key from the container. 
rsa.Clear(); 

Đây là nội dung nói về xóa khóa.

Các vấn đề liên quan