[英]How to store a public key in a machine-level RSA key container
當僅存儲公鑰/私鑰對的公鑰時,我在使用機器級RSA密鑰容器時遇到問題。
以下代碼創建公共/私有對,並從該對中提取公鑰。 該對和公鑰存儲在單獨的密鑰容器中。 然后從那些密鑰容器獲得密鑰,此時它們應該與進入容器的密鑰相同。
當代碼工作CspProviderFlags.UseDefaultKeyContainer
用於指定CspParameters.Flags
(即密鑰讀取的公鑰容器退了出來是一樣的),但是當CspProviderFlags.UseMachineKeyStore
用於指定CspParameters.Flags
讀取公鑰回來,關鍵是不同的。
為什么行為不同,我需要做些什么來從機器級RSA密鑰容器中檢索公鑰?
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();
}
似乎密鑰容器不是為此目的而設計的(這是由“如何:在.NET Framework開發人員指南中存儲密鑰容器中的非對稱密鑰”所隱含的,並通過對MSDN的討論得到證實)。
需要使用其他機制(例如將密鑰存儲在XML文件中)來實現此目標。
這個鏈接可以幫到你。 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();
這就是關於密鑰刪除的說法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.