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

- SharePoint 2007 : Nouvelle version du Stramit SharePoint 2007 Caml Viewer sur Codeplex par Philippe Sentenac [MVP SharePoint] le il y a 4 minutes

- ASP.NET AJAX 4.0 par Le blog technique de Loïc Bar le il y a 10 minutes

- [WPF] Comment déclencher un évènement sur un contrôle ? par Thomas Lebrun le il y a 1 heure et 40 minutes

- [Expression Web] Astuce de la Semaine : Utilisation et Configuration des Extraits de Code par Chronos, Blog d'un Intégrateur .NET le il y a 16 heures et 59 minutes

- Faire de l'AJAX sans restrictions de domaine par Kévin Gosse le il y a 19 heures et 28 minutes

- [IronPython] : IronPython & Silverlight 2 - Part II par Kim's Blog le 07-22-2008, 14:50

- [WPF] Des requêtes NDepend pour analyser vos projets WPF par Thomas Lebrun le 07-21-2008, 09:27

- Liste de jeux pour Silverlight par Pierrick's Blog le 07-20-2008, 14:37

- T_PAAMAYIM_NEKUDOTAYIM par MadMatt le 07-19-2008, 16:16

- Et je mets le son.... par Pierrick's Blog le 07-19-2008, 12:09