2011-04-18 28 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?