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 2010 Genève : Retrouvez-moi pour une session sur la Haute disponibilité et le ScaleOut avec SQL Server par SQL Server vu par Christian Robert le il y a 2 heures et 58 minutes

- [MIX10] Keynote deuxième journée – Internet Explorer 9, Html5, Visual Studio 2010, OData par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 23 heures et 3 minutes

- Certifications beta .NET 4 par Kévin Gosse le il y a 23 heures et 9 minutes

- [Mix 2010] – Microsoft Translator Technology Preview V2 par RedoBlog - The .NET Gentleman !!! le il y a 23 heures et 50 minutes

- Lancement en Preview de Cyclone lors des TechDays 2010! par Blog de Frédéric Queudret le 03-17-2010, 16:30

- [WP7] Je ne veux pas d’un nouvel iPhone par Le blog de FremyCompany le 03-17-2010, 13:11

- [WF4] Pourquoi utiliser le ContentPresenter dans l’ActivityDesigner? par Blog de Jérémy Jeanson le 03-17-2010, 07:54

- [Mix 2010] – Telechargez Internet Explorer 9 en Preview ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:58

- [MIX 2010] – Keynote Day 2 online : Windows Internet Explorer 9, jQuery, OData et Dallas CTP2 ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:18

- [Mix 2010] – Retour d’expérience développement Seesmic sur Windows Phone 7 par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:44