首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从.net x509certificate2对象获取私钥到赏金城堡AsymmetricCipherKeyPair

无法从.net x509certificate2对象获取私钥到赏金城堡AsymmetricCipherKeyPair
EN

Stack Overflow用户
提问于 2017-11-08 06:29:58
回答 2查看 1.4K关注 0票数 2

我试图从这段代码中获取X509Certificate2对象pkcs-7签名的键盘。

代码语言:javascript
复制
RSACryptoServiceProvider key = (RSACryptoServiceProvider)Cert.PrivateKey;
RSAParameters rsaparam = key.ExportParameters(true);
AsymmetricCipherKeyPair keypair = DotNetUtilities.GetRsaKeyPair(rsaparam);

如果X509Certificate2对象是使用.pfx文件创建的,则这样做很好

代码语言:javascript
复制
X509Certificate2 cert = new X509Certificate2(".pfx file path", "password");

效果很好。但是,当从证书存储中列出证书时,如下所示

代码语言:javascript
复制
 X509Certificate2 cert;
 X509Store UserCertificateStore = new X509Store("My");
 UserCertificateStore.Open(OpenFlags.ReadOnly);
 var certificates = UserCertificateStore.Certificates;
 foreach (var certificate in certificates)
 {
    if (certificate.Thumbprint==thumbprint)
    {
       cert=certificate;
       break;
    }
 }

它引发一个异常,其消息-键对于在指定状态下使用无效.

@Crypt32 32应答后,尝试使用RSA方法签名散列

代码语言:javascript
复制
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PrivateKey;

using (SHA256Managed sHA256 = new SHA256Managed())
{
    byte[] hash = sHA256.ComputeHash(data);
    return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));
}

但是签名是而不是PKCS#7格式的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-08 07:14:29

这是因为BouncyCastle试图从.NET对象获取原始密钥材料(字面意思是导出),而实际密钥却没有标记为可导出的。在Windows系统中,密钥存储在控制所有密钥操作的加密服务提供程序中。当您需要执行特定的加密操作时,您要求CSP完成一项工作,而它不需要向您公开关键材料。如果密钥是在CSP中作为可导出的方式导入/生成的,则可以要求CSP导出密钥材料。如果没有设置此标志,CSP将不会给您密钥。

我不知道BouncyCastle是如何工作的,但是如果它需要原始密钥材料,那么您需要在证书中输入可导出的私钥。

票数 2
EN

Stack Overflow用户

发布于 2017-11-09 17:16:56

要回答基本问题,“如何使PKCS#7 SignedData消息与RSA+SHA-2-256签名?”

https://github.com/Microsoft/dotnet/blob/master/releases/net471/dotnet471-changes.md#bcl说SHA-2-256不仅在4.7.1中工作,而且现在是默认的:

更新了SignedXML和SignedCMS,将SHA256用作SHA1的默认设置。通过启用上下文开关,选定的SHA1仍可作为默认使用。397307,System.Security.dll,Bug

在较旧的框架中,可以通过以下方式实现:

代码语言:javascript
复制
ContentInfo content = new ContentInfo(data);
SignedCms cms = new SignedCms(content);
CmsSigner signer = new CmsSigner(cert);
signer.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");
cms.ComputeSignature(signer);
return cms.Encode();

其中"2.16.840.1.101.3.4.2.1“是SHA-2-256的OID-ese。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47172983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档