Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从.net x509certificate2对象获取到bouncycastle AsymmetricipherKeyPair的私钥_C#_Cryptography_Bouncycastle_X509certificate2_Pkcs#7 - Fatal编程技术网

C# 无法从.net x509certificate2对象获取到bouncycastle AsymmetricipherKeyPair的私钥

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

我试图从这段代码中获取pkcs-7签名对象的密钥对

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消息,并使用签名者证书计算签名。