【发布时间】:2020-04-17 15:59:17
【问题描述】:
我有使用RSACryptoServiceProvider 创建的(不可导出的)密钥。我想使用 RSA-PSS(不是RSACryptoServiceProvider)对数据进行签名。因此,我想获得与RSACng 实例相同的私钥。
我尝试了以下方法:
// Create key with RSACryptoServiceProvider
var keyId = Guid.NewGuid().ToString();
var providerName = "Microsoft Enhanced RSA and AES Cryptographic Provider";
var key = new RSACryptoServiceProvider(2048, new CspParameters(24) {
ProviderName = providerName,
KeyContainerName = keyId,
KeyNumber = (int) KeyNumber.Signature,
Flags = CspProviderFlags.UseNonExportableKey
});
// Obtain an RSACng reference:
var cngKey = CngKey.Open(keyId, new CngProvider(providerName));
var cngRsaKey = new RSACng(cngKey);
// Sign something using cngRsaKey
[...]
很遗憾,使用WindowsCryptographicException: Keyset does not exist 执行 CngKey.Open 时总是失败。
如何使用 RSACng 打开之前创建的密钥?
请注意,我不能使用https://stackoverflow.com/a/50703729/1400869 提供的答案,因为我不能使用可导出的私钥。最后,密钥应该驻留在 HSM(硬件安全模块)上。
有什么想法吗?
【问题讨论】:
-
看看这是否有帮助:infinitec.de/post/2010/11/22/…
-
我不确定以编程方式指定 PIN 与我的问题有何关系。你能详细说明一下吗?
-
对不起。使用 RSA 处理智能卡问题并混淆了两个帖子。您仍然在证书中设置提供者。智能卡的 PIN 是证书中的密钥。智能卡使用证书。
-
我这里只处理密钥,没有看到证书。
-
那么key怎么也有provider名呢?不需要加载证书吗?
标签: c# .net cryptography rsa cng