Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

CrazyHT Blog

Ex-MVP C#.NET
Cryptage simple

On a toujours besoin a un moment ou a un autre de crypter des valeurs dans nos application (par exemple dans le fichier de configuration).

En général, je fais comme tout le monde, j'ouvre Google et lance une recherche, le petit souci c'est que de temps en temps (comme cette fois) je prends un code un peu vérollé. Pour une fois, j'ai donc décider de taper quelques lignes de code a la main pour effectuer le cryptage/décryptage d'un string dans un string :)

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using System.Configuration;

namespace Technical.Utils
{
public static class Crypto
{
public static string Encrypt (string clearText, string password, bool useHashing)
{
byte[] key;
byte[] dataToEncrypt = UTF8Encoding.UTF8.GetBytes(clearText);


if (useHashing || password.Length < 16)
{
MD5CryptoServiceProvider hashmd5 = null;
try
{
hashmd5 = new MD5CryptoServiceProvider();
key = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(password));
}
finally
{
hashmd5.Clear();
}
}
else
{
key = UTF8Encoding.UTF8.GetBytes(password.Substring(0,16));
}

TripleDESCryptoServiceProvider tdes = null;
try
{
tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;

ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] result = cTransform.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
return Convert.ToBase64String(result, 0, result.Length);
}
finally
{
tdes.Clear();
}
}

public static string Encrypt (string clearText, bool useHashing)
{
string pwd = ConfigurationManager.AppSettings["SecurityKey"];
return Encrypt (clearText, pwd, useHashing);
}

public static string Decrypt (string encryptedText, string password, bool useHashing)
{
byte[] key;
byte[] dataToDecrypt = Convert.FromBase64String(encryptedText);

if (useHashing || password.Length < 16)
{
MD5CryptoServiceProvider hashmd5 = null;
try
{
hashmd5 = new MD5CryptoServiceProvider();
key = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(password));
}
finally
{
hashmd5.Clear();
}
}
else
{
key = UTF8Encoding.UTF8.GetBytes(password.Substring(0,16));
}

TripleDESCryptoServiceProvider tdes = null;
try
{
tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;

ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] result = cTransform.TransformFinalBlock(dataToDecrypt, 0, dataToDecrypt.Length);
return UTF8Encoding.UTF8.GetString(result);
}
finally
{
tdes.Clear();
}

}

public static string Decrypt (string encryptedText, bool useHashing)
{
string pwd = ConfigurationManager.AppSettings["SecurityKey"];
return Decrypt(encryptedText, pwd, useHashing);
}
}
}

Voila rien de trés compliqué mais ca sert toujours :)

Vous trouverez en attachement un petit tools tout bète vous permettant de crypter/décrypter une chaîne vite fait

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mercredi 23 mai 2007 13:00 par crazyht
Classé sous :

Attachment(s): Crypto.zip

Commentaires

white_mage a dit :

Intéressent. Par contre, Il peut-être intéressent d'utiliser DPAPI (avec une librairie pour du code managé) si c'est pour stocker une chaîne de connexion par exemple.

http://blogs.msdn.com/shawnfa/archive/2004/05/05/126825.aspx

http://www.obviex.com/samples/dpapi.aspx

Car là, étant donnée que le clé est dans AppSettings, ça ne sert pas à grand chose mais le code est très instructif...

# mai 23, 2007 13:56

white_mage a dit :

Petite précision pour ces liens. Ils sont peut-être un peut vieux mais toujours (en tout cas le 1er) d'actualités.

# mai 23, 2007 14:03

Bidou a dit :

Oui, cependant pour les fichiers de configurations on peut utiliser la méthode ProtectSection de la classe SectionInformation

http://msdn2.microsoft.com/en-us/library/system.configuration.sectioninformation.protectsection.aspx

# mai 23, 2007 14:34

white_mage a dit :

Effectivement mais il ne faut pas oublier de le faire...

D'ailleurs, quand on lis ton article, on voit qu'on peut protéger la section à l'aide de DPAPI. Ce qui revient à pousser le cryptage de DPAPI sur la section. Excellente méthode ! Le code est beacoup plus facile à maintenir...

# mai 23, 2007 14:47

crazyht a dit :

Si mes souvenir sont exacts, ProtectSection fonctionne a partir de .NET 2.0 alors que cette methode fonctionne aussi en 1.1 (voir 1.0). De plus, si un seul parametre doit être crypter (par exemple que le parametre est un AppSettings) ProtectSection ne peut rien pour nous.

En effet DAPI est sympa, cependant, il est inutilisable pour des configurations multiposte (genre un fichier de conf sur le reseau)

Dernier détail, la classe crypte pas forcement dans le fichier de config (c'était juste un exemple)

# mai 25, 2007 11:09
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le il y a 13 heures et 52 minutes

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le il y a 16 heures et 25 minutes

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39