2010-12-01 4 views
2

타사 API를 사용하지 않고 암호화되고 서명 된 메일을 보내려고합니다. 서명이있는 대체보기 만 보내는 경우 Windows Mail에서 유효성을 검사 할 수 있습니다. 암호화 된 데이터가있는 다른보기로 만 보내면 Windows Mail에서 해독 할 수 있습니다. 그러나 두 가지를 모두 보내면 Windows Mail에 2 개의 첨부 파일이 생깁니다. encryptedBytes에 서명하고 해당 서명 된 바이트를 대체보기에 추가하면 서명의 유효성 만 검사되고 메시지는 비어 있습니다. 아이디어가 있으십니까?C#을 사용하여 암호화되고 서명 된 전자 메일 보내기

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("[email protected]", "XXXXXX"); 
SmtpClient client = new SmtpClient("smtp.xpto.com"); 

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

client.Send(message); 

Label2.Text = "Assinado e cifrado!"; 

답변

3

먼저 서명 한 다음 암호화해야합니다.

원본 CMS 및 S/MIME 사양을 사용하면 어느 순서로든 작업을 수행 할 수 있지만 나중에 읽을 수없는 문서에 서명하는 것은 정말 나쁜 생각입니다. 서명은 평문 위에 있어야합니다.


결과 MIME 메시지에는 S/MIME enveloped-data 여야하는 단일 부분 만 있어야합니다. 귀하의 메시지에는 두 부분이 있으며 암호화 된 부분은 서명 된 데이터 내용 유형으로 잘못 표시됩니다. 만들고 SignedCms 개체를 서명하십시오. 이를 인코딩하고 인코딩 된 값을 EnvelopedCms 객체의 내용으로 사용하십시오. 암호화하여 내용 유형이 "application/pkcs7-mime; smime-type = enveloped-data"인 MailMessage의 내용으로 인코딩 된 값을 사용하십시오.

+1

그래서 암호화 전에 서명을했는지 확인했습니다. 그러나 여전히 동일한 효과입니다. 서명 + 암호화 만 보내면 잘 작동하지 않습니다. –

+1

나는 이런 식으로 말하는 것을 믿습니다. http://pastebin.com/g1q6fkJL (미안 .. 주석은 코드를 취하지 않는다 ...) 나는이 방법을 시도해 보았고, 메시지 다음에 나는 불규칙한 문자를 얻는다. –