16. januar 2010 by Thomas Stern
Topic: How to encrypt and sign mail c#.
Signed mail in c#, signing c#, c# send encrypted mail, signed
encrypted mail c#, S/MIME messages
Lets get startet with the real stuff on how to encrypt mail with
c#
Now we have created the certificats and we have the methods for
retrieving them. So before we can sign and encrypt the mail we need
to prepare there content for security operations. When sending
encrypted mail with attachment the content should be included as a
part of the content. If add an attahcment to an email with
using the normal "System.net.mail - message.attachments.add() "
breaks the encryption. To overcome this the attachments are added
to the maincontent of message but seprated with boundries.
Link to part
1,
part 2
Since there are different ways to fetch filecontent and
bodycontent i've have focused only on howto message data should be
build, so there are left some work for you to do. Implementing
functions for retrieving filecontent into byte[] fx.
To make the next couple of step easier to connecto to this one
which is the backbone in encrypting the mail, I will make a simple
builcontent() function that builds a simple text/plain mail and
adds an attachment called snebar.jpg placed on the root of my c
drive.
public string buildMessageContent()
{
string messageBoundry = "--PTBoundry=2";
StringBuilder message = new StringBuilder();
message.Append("\r\n");
message.Append("\r\n");
message.Append("--");
message.Append(messageBoundry + "\r\n");
message.Append("Content-Type: text/plain; charset=us-ascii\r\n");
//could use text/html as well here if you want a html message
message.Append("Content-Transfer-Encoding: ");
message.Append(TransferEncoding.QuotedPrintable);
message.Append("\r\n\r\n");
message.Append("TEST AF kryptering")//BODY TEXT GOES HERE
message.Append("\r\n");
//ADD file section
//could be filename or whatever
//foreach (string filename in attachments){
//Read file part implement your own
byte[] buff = null;
FileStream fs = new
FileStream("c:\\snebaer.jpg", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
long numBytes = new FileInfo("c:\\snebaer.jpg").Length;
buff = br.ReadBytes((int)numBytes);
byte[] bytes = buff;
//Setup filecontent
String filecontent =
Convert.ToBase64String(bytes,Base64FormattingOptions.InsertLineBreaks);
message.Append("--");
message.Append(messageBoundry);
message.Append("\r\n");
message.Append("Content-Type: ");
message.Append("application/octet-stream;");
message.Append("name=c:\\snebaer.jpg");
message.Append("\r\n");
message.Append("Content-Transfer-Encoding: base64\r\n\r\n");
message.Append(filecontent);
message.Append("\r\n\r\n");
//} //END FILSECTION
message.Append("--");
message.Append(messageBoundry);
message.Append("--\r\n");
return message.ToString();
}
Note that there isout comment foreach loop which could added if
you need to add multiple attachments. I will also be a good idee to
ad at method for building unique boundaries that could be used you
can use Guid or what ever you like. I use theese static one so it
easier to refence them in the next post. the string returned here
is now readyto be signed. Look