如何验证来自emailmessage的数字签名?

时间:2016-07-15 10:22:27

标签: c# digital-signature verification mime-message

如果签名有效,我打算从EmailMessage对象(Microsoft.Exchange ...)中提取附加文件。 那是我的测试邮件:

TextView

签名验证的原则如下:计算消息(m)的散列(H(m)),并使用具有验证功能(V)的发送者公钥(pubk)将结果与签名(sig)进行比较。

表示V_pubk(H(m))= sig。

我的代码:

MIME-Version: 1.0
Content-Type: multipart/signed;
protocol="application/x-pkcs7-signature";
micalg=SHA1;
boundary="----=_NextPart_000_0039_01D1C7DA.CFEBF380"

This is a multipart message in MIME format.

------=_NextPart_000_0039_01D1C7DA.CFEBF380
Content-Type: multipart/mixed;
boundary="----=_NextPart_001_003A_01D1C7DA.CFEBF380"


------=_NextPart_001_003A_01D1C7DA.CFEBF380
Content-Type: multipart/alternative;
boundary="----=_NextPart_002_003B_01D1C7DA.CFEBF380"


------=_NextPart_002_003B_01D1C7DA.CFEBF380
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

{body text ...}

------=_NextPart_002_003B_01D1C7DA.CFEBF380
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

{html formating ...}

------=_NextPart_002_003B_01D1C7DA.CFEBF380--

------=_NextPart_001_003A_01D1C7DA.CFEBF380
Content-Type: application/octet-stream;
name="s15sq07 - clearing & margining.sql"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="s15sq07 - clearing & margining.sql"

{file content in base64 ...}

------=_NextPart_001_003A_01D1C7DA.CFEBF380--

------=_NextPart_000_0039_01D1C7DA.CFEBF380
Content-Type: application/pkcs7-signature;
name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="smime.p7s"

{signature ...}

------=_NextPart_000_0039_01D1C7DA.CFEBF380--

我尝试Howto Verify Signature of a SMIME multipart/signed application/x-pkcs7-signature Mailhttp://www.mimekit.net/docs/html/WorkingWithSMime.htm(页面底部):

private static bool iDoHandleMail( EmailMessage msg )
  {
    try
    {
      msg.Load( new PropertySet( EmailMessageSchema.Attachments ) );

      foreach ( Attachment att in msg.Attachments )
      {
        FileAttachment fatt = att as FileAttachment;
        if ( fatt == null )
          continue;

        using ( MemoryStream ms = new MemoryStream( ) )
        {
          fatt.Load( ms );
          ms.Position = 0;
          MimeKit.MimeMessage mmsg = MimeKit.MimeMessage.Load( ms );

然后我尝试了这个没有成功:

          foreach ( MimeEntity me in mmsg.BodyParts )
          {
            if ( string.IsNullOrEmpty( me.ContentType.Name ) ) continue;

            if (me.ContentType.Name.EndsWith("p7s"))
            {
              ApplicationPkcs7Mime sig = me as ApplicationPkcs7Mime;

              if (sig != null) // is always null; mmsg.body as ApplicationPkcs7Mime is also null

现在我达到了我无法进一步思考的程度......

0 个答案:

没有答案