2

我正在尝试更新执行数字签名的函数,我想从 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

cmsSigner.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");//SHA256

但在

signedCms.ComputeSignature(cmsSigner, false);

我得到以下异常

System.Security.Cryptography.CryptographicException Message=出现内部错误。

有人有建议吗?

我使用 VS2010 Professional 64 和 win7 Professional 64

4

2 回答 2

4

我相信 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 是什么?

于 2012-09-06T10:35:52.500 回答
0

您指定了错误的 OID - OID 用于 NULL 签名的 blob。对于 RSA 签名的 blob,您需要使用 1.2.840.113549.1.1.5 sha1RSA。

于 2012-03-16T16:04:51.963 回答