2011-04-18 27 views
2

我试图更新进行数字签名的功能,我想从SHA1 SHA256 切换这是当前功能:数字标牌从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 消息=发生内部错误。

有人有建议吗?

我用VS2010专业64工作,Win7专业版64

+0

CryptographicException是否存在InnerException?事件日志中的任何内容? – paulmey 2011-04-18 16:44:30

+0

InnerException为空,事件日志中没有消息 – 2011-04-19 09:26:34

回答

0

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

+1

错误是相同的。微软已经利用其图书馆和操作系统对SHA256进行了篡改。我用了Bouncy城​​堡,并解决了所有问题 – 2012-05-23 10:31:51

3

我相信这是在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?