C# 无法从.net x509certificate2对象获取到bouncycastle AsymmetricipherKeyPair的私钥
我试图从这段代码中获取pkcs-7签名对象的密钥对C# 无法从.net x509certificate2对象获取到bouncycastle AsymmetricipherKeyPair的私钥,c#,cryptography,bouncycastle,x509certificate2,pkcs#7,C#,Cryptography,Bouncycastle,X509certificate2,Pkcs#7,我试图从这段代码中获取pkcs-7签名对象的密钥对 RSACryptoServiceProvider key = (RSACryptoServiceProvider)Cert.PrivateKey; RSAParameters rsaparam = key.ExportParameters(true); AsymmetricCipherKeyPair keypair = DotNetUtilities.GetRsaKeyPair(rsaparam); 如果像这样使用.pfx文件创建了X509C
RSACryptoServiceProvider key = (RSACryptoServiceProvider)Cert.PrivateKey;
RSAParameters rsaparam = key.ExportParameters(true);
AsymmetricCipherKeyPair keypair = DotNetUtilities.GetRsaKeyPair(rsaparam);
如果像这样使用.pfx文件创建了X509Certificate2对象,那么这种方法很好
X509Certificate2 cert = new X509Certificate2(".pfx file path", "password");
它很好用。
但是当从证书存储中列出证书时,如下所示
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应答后,尝试使用RSA方法签名哈希
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PrivateKey;
using (SHA256Managed sHA256 = new SHA256Managed())
{
byte[] hash = sHA256.ComputeHash(data);
return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));
}
但是签名不是PKCS#7格式的这是因为BouncyCastle试图从.NET对象获取原始密钥材料(字面上是导出),而实际密钥未标记为可导出。在Windows系统中,密钥存储在控制所有密钥操作的加密服务提供程序中。当您需要执行特定的加密操作时,您要求CSP执行一项工作,而CSP不必向您公开密钥材料。如果密钥在CSP中导入/生成为可导出,则可以要求CSP导出密钥材料。如果未设置此标志,CSP将不会给您密钥
我不知道BouncyCastle是如何工作的,但如果它需要原始密钥材料,那么您的证书中需要可导出的私钥。要回答下面的问题,“如何生成使用RSA+SHA-2-256签名的PKCS#7 SignedData消息?” 说明SHA-2-256不仅在4.7.1中有效,而且现在是默认值: 更新了SignedXML和SignedCMS,将SHA256作为SHA1的默认值。SHA1仍然可以通过启用上下文切换作为默认值由selected使用。[397307,System.Security.dll,Bug] 在较旧的框架上,可以通过以下方式实现:
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();
其中“”是SHA-2-256的OID ese。谢谢,是否有任何解决方法来实现此目的,我必须使用windows密钥存储和CSP硬件中的证书对sha256哈希进行签名您必须调用windows代码(.NET对象中的方法)来对数据进行签名。比如说,
RSA.SignData
方法中任何合适的重载RSA
是rsacyptoserviceprovider派生的基类。例如:RSA将创建分离的pkcs7签名RSACryptoServiceProvider csp=(RSACryptoServiceProvider)cert.PrivateKey;使用(SHA256Managed sHA256=new SHA256Managed()){byte[]hash=sHA256.ComputeHash(data);返回csp.SignHash(hash,CryptoConfig.MapNameToOID(“sHA256”);}
我尝试了这个方法,但我得到的签名不是PKCS#7格式,无法创建PKCS#7消息,您必须使用SignedCms
类,该类根据您的数据构造PKCS#7消息,并使用签名者证书计算签名。