C# 从SHA1到SHA256的数字签名

C# 从SHA1到SHA256的数字签名,c#,sign,C#,Sign,我正在尝试更新一个执行数字签名的函数,我想从SHA1 SHA256切换 这是当前的功能: private byte[] zSignData(Byte[] msg, X509Certificate2 signerCert) { ContentInfo contentInfo = new ContentInfo(msg); SignedCms signedCms = new SignedCms(contentInfo, false); CmsSigner cmsSigner

我正在尝试更新一个执行数字签名的函数,我想从SHA1 SHA256切换 这是当前的功能:

private byte[] zSignData(Byte[] msg, X509Certificate2 signerCert)
{
    ContentInfo contentInfo = new ContentInfo(msg);
    SignedCms signedCms = new SignedCms(contentInfo, false);
    CmsSigner cmsSigner = new CmsSigner(signerCert);

    cmsSigner.DigestAlgorithm = new Oid("1.3.14.3.2.26"); //SHA1

    signedCms.ComputeSignature(cmsSigner, false);

    return signedCms.Encode();
}
这个功能运行良好

要更新到SHA256,我更改了

cmsSigner.DigestAlgorithm = new Oid("1.3.14.3.2.26"); //SHA1

但在

signedCms.ComputeSignature(cmsSigner, false);
我得到以下例外

System.Security.Cryptography.CryptographyException异常 Message=出现内部错误

有人有建议吗


我使用的是VS2010 Professional 64和win7 Professional 64,您指定的OID不正确-该OID用于空签名blob。对于RSA签名的blob,您需要使用1.2.840.113549.1.1.5 sha1RSA。

我认为CAPIBase中存在一个打字错误:

internal const string szOID_OIWSEC_SHA256 = "2.16.840.1.101.3.4.1";
internal const string szOID_OIWSEC_SHA384 = "2.16.840.1.101.3.4.2";
internal const string szOID_OIWSEC_SHA512 = "2.16.840.1.101.3.4.3";
应该是:

internal const string szOID_OIWSEC_SHA256 = "2.16.840.1.101.3.4.2.1";
internal const string szOID_OIWSEC_SHA384 = "2.16.840.1.101.3.4.2.2";
internal const string szOID_OIWSEC_SHA512 = "2.16.840.1.101.3.4.2.3";
有关这方面的更多讨论,请参见:

blogs.msdn.com/b/alejacma/archive/2012/08/02/10018922.aspx


托德,是什么让你相信OID 2.16.840.1.101.3.4.2.1不是SHA256?那么什么是正确的OID?

加密异常上是否存在InnerException?eventlog中的任何内容?InnerException为null,eventlog中没有消息错误相同。微软在SHA256的库和操作系统上搞砸了。我用Bouncy castle解决了所有问题
internal const string szOID_OIWSEC_SHA256 = "2.16.840.1.101.3.4.2.1";
internal const string szOID_OIWSEC_SHA384 = "2.16.840.1.101.3.4.2.2";
internal const string szOID_OIWSEC_SHA512 = "2.16.840.1.101.3.4.2.3";