如何在机器级RSA密钥容器中存储公钥

And*_*all 9 c# cryptography rsacryptoserviceprovider

当仅存储公钥/私钥对的公钥时,我在使用机器级RSA密钥容器时遇到问题.

以下代码创建公共/私有对,并从该对中提取公钥.该对和公钥存储在单独的密钥容器中.然后从那些密钥容器获得密钥,此时它们应该与进入容器的密钥相同.

该代码在CspProviderFlags.UseDefaultKeyContainer指定时工作CspParameters.Flags(即从PublicKey容器读回的密钥是相同的),但是当CspProviderFlags.UseMachineKeyStorePublicKeyCspParameters.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();
}
Run Code Online (Sandbox Code Playgroud)

And*_*all 5

似乎密钥容器不是为此目的而设计的(这是由"如何:在.NET Framework开发人员指南中存储密钥容器中的非对称密钥"所隐含的,并通过对MSDN的讨论得到证实).

需要使用其他机制(例如将密钥存储在XML文件中)来实现此目标.