Framework .NET – Cryptage symétrique

Présentation
Les classes du Framework .NET, permettant de crypter des données en utilisant un algorithme de cryptage symétrique, héritent de la classe System.Security.Cryptography.SymmetricAlgorithm du Framework .NET. Cette classe propose des données qui seront utilisés pour créer un objet de cryptage / décryptage :

  • Un vecteur d’initialisation (propriété IV) permettant d’initialiser le cryptage et le décrytage des données
  • Une clé (propriété Key) permettant de crypter et décrypter les données

Les méthodes CreateEncryptor() et CreateEncryptor() créent des objets permettant respectivement de crypter / décrypter des données.

Algorithmes de cryptage
Les classes de cryptage proposées par le Framework .NET sont les suivantes :

  • Cryptage de type AES : AesManaged, AesCryptoServiceProvider
  • Cryptage de type DES : DesCryptoServiceProvider
  • Cryptage de type RC2 : RC2CryptoServiceProvider
  • Cryptage de type Rijndael : RijndaelManaged
  • Cryptage de type TripleDES : TripleDESCryptoServiceProvider

Cryptage / décryptage de chaînes de caractères
Dans la classe que je vous propose ci-dessous, j’utilise l’algorithme de cryptage Rijndael pour crypter / décrypter des chaînes de caractères :

[cc lang= »csharp »]
public class CryptoString
{
private SymmetricAlgorithm CryptoAlgorithme { get; set; }

public CryptoString(byte[] aCle, byte[] aVecteurInitialisation)
{
this.CryptoAlgorithme = new RijndaelManaged();
this.CryptoAlgorithme.Key = aCle;
this.CryptoAlgorithme.IV = aVecteurInitialisation;
this.CryptoAlgorithme.Mode = CipherMode.CBC;
}

public string Crypter(string aTexte)
{
// Variables locales.
byte[] oTab;
ICryptoTransform oEncryptor;
string sResult;

// Initialisation.
oTab = Encoding.UTF8.GetBytes(aTexte);
oEncryptor = this.CryptoAlgorithme.CreateEncryptor();

// Cryptage.
using (MemoryStream ms = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ms, oEncryptor, CryptoStreamMode.Write))
{
cs.Write(oTab, 0, oTab.Length);
cs.FlushFinalBlock();
oTab = ms.ToArray();
sResult = Convert.ToBase64String(oTab);
}

// Retour.
return sResult;
}

public string Decrypter(string aTexte)
{
// Variables locales.
byte[] oTab;
ICryptoTransform oDecryptor;
string sResult;
int iNombreBytes;

// Initialisation.
oTab = Convert.FromBase64String(aTexte);
oDecryptor = this.CryptoAlgorithme.CreateDecryptor();

// Décryptage.
using (MemoryStream ms = new MemoryStream(oTab))
using (CryptoStream cs = new CryptoStream(ms, oDecryptor, CryptoStreamMode.Read))
{
oTab = new byte[oTab.Length];
iNombreBytes = cs.Read(oTab, 0, oTab.Length);
sResult = Encoding.UTF8.GetString(oTab, 0, iNombreBytes);
}

// Retour.
return sResult;
}

public static void GetCleEtVecteurInitialisation(string aMotDePasse, out Byte[] aCle, out Byte[] aVecteurInitialisation)
{
// Variables locales.
Rfc2898DeriveBytes rfcDb;

// Initialisation.
rfcDb = new Rfc2898DeriveBytes(aMotDePasse, 16);

// Génération.
aCle = rfcDb.GetBytes(16);
aVecteurInitialisation = rfcDb.GetBytes(16);
}

}
[/cc]

Utilisation

[cc lang= »csharp »]
// Variables locales.
string sTexteClair, sTexteCrypte;
Byte[] oCle, oVecteurInitialisation;
CryptoString oCryptoString;

// Initialisation.
sTexteClair = « Vive le langage C# ! »;
CryptoString.GetCleEtVecteurInitialisation(« MotDePasse », out oCle, out oVecteurInitialisation);
oCryptoString = new CryptoString(oCle, oVecteurInitialisation);

// Cryptage.
sTexteCrypte = oCryptoString.Crypter(sTexteClair);

// Décryptage.
sTexteClair = oCryptoString.Decrypter(sTexteCrypte);
[/cc]

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j'alterne les missions de formation et d'ingénierie avec cette plateforme. J'écris ce blog pour transmettre mes connaissances à tout développeur, qu'il soit débutant ou expérimenté.