【问题标题】:How to store a public key in a machine-level RSA key container如何将公钥存储在机器级 RSA 密钥容器中
【发布时间】:2011-01-17 11:47:27
【问题描述】:

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

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

当为CspParameters.Flags 指定CspProviderFlags.UseDefaultKeyContainer 时,该代码有效(即从PublicKey 容器中读出的密钥是相同的),但是当为CspParameters.Flags 指定CspProviderFlags.UseMachineKeyStore 时从 PublicKey 读回的密钥不同。

为什么行为不同,我需要做些什么不同的事情来从机器级 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();
}

【问题讨论】:

标签: c# cryptography rsacryptoserviceprovider


【解决方案1】:

似乎密钥容器不适用于此目的(.NET Framework 开发人员指南中的“如何:在密钥容器中存储非对称密钥”暗示了这一点,并由a disccusion on MSDN 确认)。

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

【讨论】:

    【解决方案2】:

    此链接可能会对您有所帮助。 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();
    

    这就是它所说的密钥删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多