我试图从这段代码中获取X509Certificate2对象pkcs-7签名的键盘。
RSACryptoServiceProvider key = (RSACryptoServiceProvider)Cert.PrivateKey;
RSAParameters rsaparam = key.ExportParameters(true);
AsymmetricCipherKeyPair keypair = DotNetUtilities.GetRsaKeyPair(rsaparam);如果X509Certificate2对象是使用.pfx文件创建的,则这样做很好
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 32应答后,尝试使用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格式的。
发布于 2017-11-08 07:14:29
这是因为BouncyCastle试图从.NET对象获取原始密钥材料(字面意思是导出),而实际密钥却没有标记为可导出的。在Windows系统中,密钥存储在控制所有密钥操作的加密服务提供程序中。当您需要执行特定的加密操作时,您要求CSP完成一项工作,而它不需要向您公开关键材料。如果密钥是在CSP中作为可导出的方式导入/生成的,则可以要求CSP导出密钥材料。如果没有设置此标志,CSP将不会给您密钥。
我不知道BouncyCastle是如何工作的,但是如果它需要原始密钥材料,那么您需要在证书中输入可导出的私钥。
发布于 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
在较旧的框架中,可以通过以下方式实现:
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。
https://stackoverflow.com/questions/47172983
复制相似问题