将导出的CngKey导入RSA并再次导出



我导出CngKeyBlobFormat.Pkcs8PrivateBlob格式的密钥,然后尝试将此信息导入到新的CngKey中,然后再次尝试导出新密钥。问题是,当你简单地用CngKey.Import()导入一个密钥时,你既不能选择参数,也不能选择密钥的名称,因此我不能再次导出它,因为默认参数不允许你这样做。所以我写了以下代码:

// Import key into RSACng rsa
var key = rsa.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
CngProvider cp = new CngProvider("NewProvider");
CngKeyCreationParameters ckcp = new CngKeyCreationParameters() { ExportPolicy=CngExportPolicies.AllowPlaintextExport, Provider=cp};
ckcp.Parameters.Add(new CngProperty(CngKeyBlobFormat.Pkcs8PrivateBlob.Format, key, CngPropertyOptions.None));
CngKey cngKey2 = CngKey.Create(CngAlgorithm.Rsa, "OldKey", ckcp);
RSACng rsa2 = new RSACng(cngKey2);
var exportedKey = rsa2.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
// exportedKey.Equals(key) == true

我在CngKey.Create:上得到一个错误

系统。安全密码学。CryptographicException:"未知错误"-1073741275"。

它报告为未知错误,这很奇怪。该值为STATUS_NOT_FOUND("找不到对象。"(。

最可能的问题是您没有名为"NewProvider"的注册提供商。这不是它所要求的密钥容器的名称,而是它应该将密钥发送到哪个库

99%的时间你想要CngProvider.MicrosoftSoftwareKeyStorageProvider。1%的时间你想要CngProvider.MicrosoftSmartCardKeyStorageProvider。几乎不可估量的小,你想要一些其他的价值。

最新更新