簡體   English   中英

如何在機器級RSA密鑰容器中存儲公鑰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM