使用C#加密和签名的电子邮件

时间:2016-07-08 10:06:20

标签: c# encryption sign

我如何加密和签名电子邮件? 似乎我可以加密或签名,但不能同时加密或签名。 以下是我的代码

   public void SendEncryptedEmail04(
        //string SigningCertPath, string EncryptingCertPath,
        String sender, String To,
        string Subject, string Body,
       // string SmtpServer, int SmtpPort, bool HTML)
       bool HTML)
    {
        X509Certificate2 SignCert = new X509Certificate2("D:\\certwithprivatekey.pfx", "password"));
        X509Certificate2 EncryptCert = new X509Certificate2("abc@gmail.crt", "");

        StringBuilder Message = new StringBuilder();
        Message.AppendLine("Content-Type: text/" + ((HTML) ? "html" : "plain") +
            "; charset=\"iso-8859-1\"");
        Message.AppendLine("Content-Transfer-Encoding: 7bit");
        Message.AppendLine();
        Message.AppendLine(Body);

        byte[] BodyBytes = Encoding.ASCII.GetBytes(Message.ToString());

        EnvelopedCms ECms = new EnvelopedCms(new ContentInfo(BodyBytes));
        CmsRecipient Recipient = new CmsRecipient(
            SubjectIdentifierType.IssuerAndSerialNumber, EncryptCert);
        ECms.Encrypt(Recipient);
        byte[] EncryptedBytes = ECms.Encode();

        SignedCms Cms = new SignedCms(new ContentInfo(EncryptedBytes));
        CmsSigner Signer = new CmsSigner
            (SubjectIdentifierType.IssuerAndSerialNumber, SignCert);

        Cms.ComputeSignature(Signer);
        byte[] SignedBytes = Cms.Encode();

        MailMessage Msg = new MailMessage();
        Msg.To.Add(new MailAddress(To));
        Msg.From = new MailAddress(sender);
        Msg.Subject = Subject;

        //MemoryStream ms = new MemoryStream(EncryptedBytes);
        MemoryStream ms = new MemoryStream(SignedBytes);
        AlternateView av = new AlternateView(ms,
         "application/pkcs7-mime; smime-type=signed-data;name=smime.p7m");
             //"application/pkcs7-mime; smime-type=enveloped-data;name=smime.p7m");
        Msg.AlternateViews.Add(av);

        SmtpClient smtp = new SmtpClient(emailServer, 25);

       smtp.UseDefaultCredentials = false;
      smtp.Credentials = new System.Net.NetworkCredential(sender,"xxxx"));

        smtp.Send(Msg);
    }

ThunderBird收到的电子邮件如下 enter image description here

然而,我改为

   MemoryStream ms = new MemoryStream(EncryptedBytes);

我有

enter image description here

我如何加密和签名?

由于

0 个答案:

没有答案