2010-12-01 17 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エンベロープデータである必要があります。メッセージには2つの部分があり、暗号化された部分には署名付きデータのコンテンツタイプが誤って表示されます。作成し、SignedCmsオブジェクトに署名します。それを符号化し、符号化された値をEnvelopedCmsオブジェクトのコンテンツとして使用します。それを暗号化し、コンテンツタイプ「application/pkcs7-mime; smime-type = enveloped-data」のMailMessageのコンテンツとしてエンコードされた値を使用します。

+1

だから、私は署名が暗号化の前に置かれた。しかし、それは依然として同じ効果です。署名+暗号化のみを送信するとうまく動作しません –

+1

私はあなたにこのようなことをすると信じていますか? http://pastebin.com/g1q6fkJL(申し訳ありませんがコメントはコードを取らない...) 私はこの方法を試して、メッセージの後に、私はスクランブル文字を取得... –

関連する問題