2011-05-04 114 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