Bonjour à tous,

Je dois mettre en place un petit applicatif qui envoie des emails signés et cryptés avec une pièce jointe.
J'ai trouvé pas mal d'explications là-dessus, et j'arrive à envoyer un e-mail juste signé. J'arrive également à envoyer un e-mail uniquement crypté. Mais quand je veux combiner les deux, ça ne fonctionne pas.

Voici le code exécuté pour cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
//Construction du message
MailMessage message = new System.Net.Mail.MailMessage();
message.To.Add(destinataire);
message.From = new MailAddress(expediteur);
message.Subject = "OBJET";
 
StringBuilder UnsignedMessage = new StringBuilder();
UnsignedMessage.Append("MIME-Version: 1.0\r\n");
UnsignedMessage.Append("Content-Type: multipart/mixed; boundary=boundary-1; protocol=\"application/x-pkcs7-signature\"; micalg = sha1;\r\n");
UnsignedMessage.Append("\r\n");
UnsignedMessage.Append("This is an S/MIME signed message\r\n");
UnsignedMessage.Append("--boundary-1\r\n");
UnsignedMessage.Append("Content-Type : text/plain\r\n");
UnsignedMessage.Append("Content-Transfer-Encoding : 7Bit\r\n\r\n");
UnsignedMessage.Append("Body\r\n");
UnsignedMessage.Append("\r\n\r\n");
 
//Ajout de la pièce jointe			
FileInfo fileInfo = new FileInfo("ma piece jointe");
UnsignedMessage.Append("--boundary-1\r\n");
UnsignedMessage.Append("Content-Type : application/octet-stream; file = "+fileInfo.Name+"\r\n");
UnsignedMessage.Append("Content-Transfer-Encoding: base64\r\n");
UnsignedMessage.Append("Content-Disposition: attachment; filename="+fileInfo.Name+"\r\n\r\n");
 
byte[] buff = null;
FileStream fs = new FileStream("ma piece jointe", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
long numBytes = fileInfo.Length;
buff = br.ReadBytes((int)numBytes);
byte[] bytes = buff;
String filecontent = Convert.ToBase64String(bytes,Base64FormattingOptions.InsertLineBreaks);
 
UnsignedMessage.Append(filecontent);
UnsignedMessage.Append("\r\n");
 
byte[] messageData = Encoding.ASCII.GetBytes(UnsignedMessage.ToString());
 
//Signature du message
ContentInfo content = new ContentInfo(messageData);
 
SignedCms signedCms = new SignedCms(content);
CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, SenderCert);
 
signer.IncludeOption = X509IncludeOption.WholeChain;
 
signer.Certificates.Add(SenderCert);
 
Pkcs9SigningTime signingTime = new Pkcs9SigningTime();
signer.SignedAttributes.Add(signingTime);
 
signedCms.ComputeSignature(signer);
 
byte[] signedData = signedCms.Encode();
 
//Cryptage du message
content = new ContentInfo(signedData);
EnvelopedCms envelopedCms = new EnvelopedCms(content);
CmsRecipient recipients = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, RecipientCert);
envelopedCms.Encrypt(recipients);
 
byte[] encryptedBytes = envelopedCms.Encode();
 
//Envoi du message
MemoryStream encryptedStream = new MemoryStream(encryptedBytes);
AlternateView encryptedView = new AlternateView(encryptedStream, "application/x-pkcs7-mime; smime-type=enveloped-data; name=smime.p7m; content-disposition=attachment; fileName=smime.p7m");
message.AlternateViews.Add(encryptedView);
 
smtpClient.Send(message);
Si je ne laisse que la partie "Signature du message", j'ai le résultat attendu :

Nom : message_signe.png
Affichages : 1058
Taille : 25,6 Ko

Si je ne laisse que la partie "Cryptage du message", j'ai également le résultat attendu :

Nom : message_crypte.png
Affichages : 1103
Taille : 27,7 Ko

Mais en combinant les deux je n'ai pas le résultat escompté.

Est-ce que quelqu'un saurait éclairer ma lanterne et me dire ce que je ne fais pas correctement ?

En vous remerciant par avance de votre aide, je vous souhaite une bonne journée.