Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C发送加密和签名的电子邮件#_C#_Email_Encryption_Mime_Digital Signature - Fatal编程技术网

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

C# 使用C发送加密和签名的电子邮件#,c#,email,encryption,mime,digital-signature,C#,Email,Encryption,Mime,Digital Signature,我想在不使用任何第三方API的情况下发送加密和签名邮件。 如果我只发送带有签名的备用视图,Windows Mail可以对其进行验证。如果我只发送带有加密数据的备用视图,Windows Mail可以对其进行解密。但是如果我同时发送这两个,Windows Mail会收到两个附件。如果我对encryptedBytes进行签名,并将这些签名的字节添加到备选视图中,则只验证签名,消息为空。 有什么想法吗 MailMessage message = new MailMessage(); message.Fr

我想在不使用任何第三方API的情况下发送加密和签名邮件。 如果我只发送带有签名的备用视图,Windows Mail可以对其进行验证。如果我只发送带有加密数据的备用视图,Windows Mail可以对其进行解密。但是如果我同时发送这两个,Windows Mail会收到两个附件。如果我对
encryptedBytes
进行签名,并将这些签名的字节添加到备选视图中,则只验证签名,消息为空。 有什么想法吗

MailMessage message = new MailMessage();
message.From = new MailAddress(lblMail.Text);
message.Subject = txtSubject.Text;

string body = "Content-Type: text/plain\r\nContent-Transfer-Encoding: 7Bit\r\n\r\n" + structForm();

byte[] messageData = Encoding.ASCII.GetBytes(body);
ContentInfo content = new ContentInfo(messageData);
EnvelopedCms envelopedCms = new EnvelopedCms(content);

message.To.Add(new MailAddress(provMail));

CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.SubjectKeyIdentifier, this.certificate);
envelopedCms.Encrypt(recipient);

byte[] encryptedBytes = envelopedCms.Encode();

SignedCms Cms = new SignedCms(new ContentInfo(encryptedBytes));
CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, new X509Certificate2(@"c:\serv.pfx","123"));

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

MemoryStream encryptedStream = new MemoryStream(encryptedBytes);
AlternateView encryptedView = new AlternateView(encryptedStream, "application/pkcs7-mime; smime-type=signed--data;name=smime.p7m");
message.AlternateViews.Add(encryptedView);
MemoryStream signedStream = new MemoryStream(SignedBytes);
AlternateView signedView = new AlternateView(signedStream, "application/pkcs7-mime; smime-type=signed-data;name=sig.p7m");
message.AlternateViews.Add(signedView);


System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("emailaddress@xpto.com", "XXXXXX");
SmtpClient client = new SmtpClient("smtp.xpto.com");

client.UseDefaultCredentials = false;
client.Credentials = SMTPUserInfo;

client.Send(message);

Label2.Text = "Assinado e cifrado!";

你应该先签名,然后加密

虽然最初的CMS和S/MIME规范允许您按任意顺序进行操作,但后来的工作指出,对无法阅读的文档进行签名是一个非常糟糕的主意。签名应该在纯文本上



生成的MIME消息应该只有一个部分,即S/MIME封装的数据。您的消息有两个部分,加密部分被错误地标记为签名数据内容类型。创建并签署
SignedCms
对象。对其进行编码,并将编码后的值用作
EnvelopedCms
对象的内容。对其进行加密,并将其编码值用作
邮件消息的内容,内容类型为“application/pkcs7 mime;smime type=envelled data”。

因此,我确实将正在进行的签名放在加密之前。然而,它仍然是相同的效果。如果我只发送签名+加密,它不会正常工作我相信你是说这样做?(抱歉..注释不接受代码…)我尝试了这种方式,在消息之后,我得到了筛选字符。。。