2011-05-04 118 views
3

我有以下代碼(HTTP)之前將其發送給我簽字數據:C#驗證簽名

string sig = Convert.ToBase64String(bSignature) + MESSAGE_SEPARATOR; 
    //this will be included in the message: 
    bSignature = System.Text.ASCIIEncoding.ASCII.GetBytes(sig); 

    //debug data, see the signature: 
    string deb8 = System.Text.ASCIIEncoding.ASCII.GetString(bSignature); 
    //-- 

例如:

internal static byte[] Encode(byte[] arMessage, string signerCert, string signerPassword) 
      { 
       X509Certificate2 cert = new X509Certificate2(signerCert, signerPassword); 
       //debug data 
       var msg = System.Text.ASCIIEncoding.ASCII.GetString(arMessage); 
       //-- 
       ContentInfo contentInfo = new ContentInfo(arMessage); 

       SignedCms signedCms = new SignedCms(contentInfo, true); // <- true detaches the signature 
       CmsSigner cmsSigner = new CmsSigner(cert); 

       signedCms.ComputeSignature(cmsSigner); 
       byte[] signature = signedCms.Encode(); 

       return signature; 
      } 

我可以做以下後看到簽名

MIICvgYJKoZIhvcNAQcCoIICrzCCAqsCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCCAbgwggG0MIIBXqADAgECAhAGicJ2MhB7tUZtG3QcdWDwMA0GCSqGSIb3DQEBBAUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTExMDUwMzEyMTQ0NVoXDTM5MTIzMTIzNTk1OVowDzENMAsGA1UEAxMEVGVzdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuOm4jGHUzLPNww6sx7cZJJxjLIDL/rVVLOtDd1NeA4DZZM1+lKwLpDp3FrV1CA4NP7g3weTg6Y0Jb6X7CSQHnfHRzU8LLrHgp/D9NJ39/RhsKggUteMa1FUUas0fMDMELtTO07ejNfYAhDYQiXmeg+pIMpUfeUhMicyV2xrPzG8CAwEAAaNLMEkwRwYDVR0BBEAwPoAQEuQJLQYdHU8AjWEh3BZkY6EYMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5ghAGN2wAqgBkihHPuNSqXDX0MA0GCSqGSIb3DQEBBAUAA0EAVIjI0My490lY6vKrcgorZZ8MBo3MSk9HuDRBE0SRwSQjnvPsAD0ol1ZjvzjFKA/0Vgvp1lyYquCTSL8R/uWf+TGBzzCBzAIBATAqMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5AhAGicJ2MhB7tUZtG3QcdWDwMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEgYCuXG2CJ0G6UaO1AVMpo5ul3JkJ9EvJbdwb6sXOqOonq5qKbaGJsx0sgwoBfg3lLMP3UI9JVi4dTGG4KTzA1k/0Qt0owmEPKrDh3zVZr2hK/iHsW75sGjSgYT4hxbn6ziQ2IFoN2qCbxdXrMZ+TD0pf7o/ABdorjlvQ5USwlPKjZQ== 

這就是我收到的信息中所包含的內容。 所以這個問題是:如何驗證收件人收到的郵件的簽名(提供.cer文件)? 在此先感謝

編輯1:

我試圖按照丹尼爾Hilgarth的邏輯,但它並沒有奏效。 有幾次遇到「ASN Bad tag value」異常。 爲了方便,我硬編碼的消息被用來生成簽名 因此,在接收器上我有兩兩件事:原始郵件和它產生的簽名:

//Signature from the message (string in ASCII) 
    var signatureKey = GetSignatureFromSignatureMessage(signatureMessage, boundary); 
    //Original sent message (the arMessage itself used in Encode method above, converted to string from byte) 
    var messageOriginal = 
     "Content-Type: application/EDIFACT\r\nContent-Transfer-Encoding: binary\r\n\r\nSome short text.\r\nVery short."; 

我需要檢查簽名對應此消息。 所以我試圖做這樣的事情:

//contentInfo from the original message. 
ContentInfo contentInfo = new ContentInfo(System.Text.ASCIIEncoding.ASCII.GetBytes(messageOriginal)); 

//SingedCms from the contentInfo above 
SignedCms signedCms = new SignedCms(contentInfo, true); 

//Here, I believe, I am attaching the signature I have to the Cms  
signedCms.Decode(System.Text.ASCIIEncoding.ASCII.GetBytes(signatureKey)); 

//checking? 
signedCms.CheckSignature(true); 

而且我得到的解碼部分例外。

任何建議?

編輯2: 解決方案: 由Daniel Hilgarth給出的方向是正確的。 我的問題是,發件人幾次編碼密鑰: Base64字節數組 - > Base64String - > ASCII字節數組 - > ASCII字符串 - > Send_message 接收器已經接收到ASCII數據,正在執行: ASCII String - >字節數組。 我不得不將所有東西都轉換回base64字節數組來使其工作。

//Signature from the message (ASCII String) 
    var signatureKey = GetSignatureFromSignatureMessage(signatureMessage, boundary); 

    //Original Byte Array (Base64) 
    var sigKeyBase = Convert.FromBase64String(signatureKey); 

    //Original sent message 
    var messageOriginal = 
     "Content-Type: application/EDIFACT\r\nContent-Transfer-Encoding: binary\r\n\r\nSome short text.\r\nVery short."; 

    var messageOriginalByteASCII = System.Text.ASCIIEncoding.ASCII.GetBytes(messageOriginal); 


    ContentInfo contentInfo = new ContentInfo(messageOriginalByteASCII); 
    SignedCms signedCms = new SignedCms(contentInfo, true); 
    signedCms.Decode(sigKeyBase); 

    signedCms.CheckSignature(true); 

在這種情況下,它通過檢查。 P.S.太糟糕ChekSignature不返回真或假。我會更舒服的imho。 :(

回答

2

嗯......也許使用SignedCms.CheckSignatureSignedCms.Decode使用它結合基本上,只要使用反向方式使用簽署該文件與獨立的簽名的一個例子是可以從MSDN頁:?!。

// Create a ContentInfo object from the inner content obtained 
// independently from encodedMessage. 
ContentInfo contentInfo = new ContentInfo(innerContent); 

// Create a new, detached SignedCms message. 
SignedCms signedCms = new SignedCms(contentInfo, true); 

// encodedMessage is the encoded message received from 
// the sender. 
signedCms.Decode(encodedMessage); 

// Verify the signature without validating the 
// certificate. 
signedCms.CheckSignature(true); 
+0

詳情請。 的簽名,就是爲消息arMessage。後來我發送包含兩種,消息和簽名(ASCII格式)給收件人。他得到的數據包1包(消息+附簽名)以及他應該如何驗證它?SignedCms.CheckSignature沒有簽名本身作爲輸入?! – Razp 2011-05-04 11:50:06

+0

@Razp:已更新的答案,請檢查 – 2011-05-04 11:55:34

+0

我試過了,但沒有奏效。 我認爲我做錯了什麼,所以我更新了我原來的問題。 請看看它。 – Razp 2011-05-04 12:34:01