Help and Support

Numéro d'article: 307010 - Dernière mise à jour: mardi 26 août 2003 - Version: 1.0

COMMENT FAIRE : Crypter et décrypter un fichier avec C# .NET

Ancien nº de publication de cet article : F307010

Sommaire

Agrandir tout | Réduire tout

Résumé

Cet article montre comment utiliser les classes de cryptage fournies par Microsoft .NET Framework pour crypter un fichier texte afin de le rendre illisible puis décrypter ces informations pour qu'elles reprennent leur format d'origine.

Configuration requise

La liste suivante présente le matériel, les logiciels, l'infrastructure réseau et les Service Packs dont vous aurez besoin :
  • Microsoft Windows 2000 Professionnel, Windows 2000 Server, Windows 2000 Advanced Server ou Windows NT 4.0 Server
  • Microsoft Visual Studio .NET

Cryptage et décryptage

L'espace de noms System.Security.Cryptographic dans Microsoft .NET Framework propose un éventail d'outils pour aider au cryptage et au décryptage. La classe CryptoStream est une des nombreuses classes fournies, elle est conçue pour crypter ou décrypter le contenu pendant qu'il est transmis en flux dans un fichier.

Pour crypter un fichier, procédez comme suit :
  1. Ouvrez Visual Studio .NET.
  2. Créez une nouvelle application de console dans Microsoft C# .NET. Visual C# .NET crée pour vous une classe statique, en même temps qu'une procédure Main() vide.
  3. Utilisez l'instruction using sur les espaces de noms System, System.Security, System.Security.Cryptography, System.Text et System.IO pour éviter de devoir effectuer des déclarations à partir de ces espaces de noms plus tard dans votre code. Vous devez placer ces instructions avant toute autre déclaration.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Text;
  4. Ajoutez une constante à votre classe, qui représente la clé secrète pour le cryptage/décryptage.
    //Doit être de 64 bits, 8 octets.
    private const string sSecretKey = "Password";
  5. Créez une méthode dans votre classe appelée EncryptFile, avec trois paramètres : sInputFile, sOutputFile et sKey (la clé secrète utilisée pour crypter ou décrypter le fichier).
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
  6. Dans la procédure EncryptFile, créez des objets d'entrée et de sortie FileStream pour traiter la lecture et l'écriture des fichiers cibles.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
  7. Déclarez une instance de la classe DESCryptoServiceProvider, laquelle représente la technologie de cryptage et de décryptage réelle utilisée sur les fichiers. À ce stade, vous pouvez créer un fournisseur différent si vous préférez utiliser RSA ou une autre technique cryptographique.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
  8. Le fournisseur cryptographique doit être fourni avec la clé secrète sous forme de tableau d'octets. L'espace de noms System.Text fournit une fonction GetBytes() qui, dans ses fonctions de codage, prend une chaîne et renvoie un tableau d'octets. La taille de la clé est différente pour chaque technique cryptographique ; DES (Data Encryption Standard) prend une clé de 64 bits, ce qui équivaut à 8 octets ou 8 caractères.

    Si vous ne fournissez pas de clé, le fournisseur en génère une de façon aléatoire, ce qui permet de crypter un fichier sans véritablement pouvoir le décrypter. Notez que vous devez également fournir le vecteur d'initialisation (IV) ; cette valeur est utilisée lors du cryptage et, comme la clé, est générée de façon aléatoire si vous ne le fournissez pas. Étant donné qu'il doit être identique pour le cryptage et le décryptage, il est préférable de le spécifier.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
  9. Créez une instance de la classe CryptoStream, en vous servant du fournisseur cryptographique pour obtenir un objet de cryptage (CreateEncryptor) et l'objet produit existant FileStream comme partie intégrante du constructeur.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    						desencrypt, 
    						CryptoStreamMode.Write); 
  10. Pour finir, lisez le fichier d'entrée et écrivez-le dans le fichier de sortie qui passe l'objet CryptoStream où il est crypté à l'aide de la clé que vous avez donnée.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
  11. Créez une méthode nommée DecryptFile. Le processus de décryptage est très proche du processus de cryptage, si ce n'est que DecryptFile présente deux différences clés par rapport à la procédure EncryptFile. Pour commencer, CreateDecryptor est utilisé à la place de CreateEncryptor lors de la création de l'objet CryptoStream, spécifiant la façon dont sera utilisé l'objet. Ensuite, lors de l'écriture du texte décrypté dans le fichier de destination, l'objet CryptoStream est le flux source et non plus le flux de destination.
    static void DecryptFile(string sInputFilename, 
    	                string sOutputFilename,
    	                string sKey)
    {
    	DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    	//Une clé 64 bits et IV est nécessaire pour ce fournisseur.
    	//Définit la clé secrète pour l'algorithme DES.
    	DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    	//Définit le vecteur d'initialisation.
    	DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    
    	//Crée un flux de fichier pour lire le fichier crypté.
    	FileStream fsread = new FileStream(sInputFilename, 
    		                           FileMode.Open, 
    		                           FileAccess.Read);
    	//Crée un décrypteur DES à partir de l'instance DES.
    	ICryptoTransform desdecrypt = DES.CreateDecryptor();
    	//Crée un flux crypto défini pour lire et effectue une
    	//transformation de cryptage DES sur les octets entrants.
    	CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
    
    		                                                desdecrypt,
    		                                                CryptoStreamMode.Read);
    	//Imprime le contenu du fichier décrypté.
    	StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
    	fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
    	fsDecrypted.Flush();
    	fsDecrypted.Close();}
  12. Ajoutez des lignes à la procédure Main() pour appeler EncryptFile et DecryptFile.
    static void Main(string[] args)
    {
        EncryptFile("c:\\temp\\test.txt", 
                "c:\\temp\\Encrypted.txt", 
                sSecretKey);
    
    	DecryptFile("c:\\temp\\Encrypted.txt", 
            "c:\\temp\\Decrypted.txt", 
            sSecretKey);}
  13. Enregistrez l'application puis exécutez-la en vous assurant que le chemin utilisé pour le nom du fichier d'entrée pointe vers un fichier existant (et pas trop important).

Vérification du bon fonctionnement

Testez ce code avec un fichier texte (.txt) pour confirmer qu'il a bien crypté et décrypté le fichier. Assurez-vous de décrypter le fichier dans un nouveau fichier (comme dans la procédure Main() de l'article) plutôt que dans l'original. Examinez le fichier décrypté et comparez-le à l'original.

Exemple complet de code

using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Text;

namespace CSEncryptDecrypt
{
   <summary>
   Description récapitulative pour Class1.
   </summary>
  class Class1
  {
    //Doit être de 64 bits, 8 octets.
    private const string sSecretKey = "Password";

    static void Main(string[] args)
    {
      EncryptFile("c:\\temp\\test.txt", 
        "c:\\temp\\Encrypted.txt", 
        sSecretKey);

      DecryptFile("c:\\temp\\Encrypted.txt", 
        "c:\\temp\\Decrypted.txt", 
        sSecretKey);
    } 

    static void EncryptFile(string sInputFilename,
                            string sOutputFilename,
                            string sKey)
    {
      FileStream fsInput = new FileStream(sInputFilename, 
                                          FileMode.Open, 
                                          FileAccess.Read);

      FileStream fsEncrypted = new FileStream(sOutputFilename, 
                                              FileMode.Create, 
                                              FileAccess.Write);
      DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
      DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
      DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
      ICryptoTransform desencrypt = DES.CreateEncryptor();
      CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
                                                   desencrypt, 
                                                   CryptoStreamMode.Write); 

      byte[] bytearrayinput = new byte[fsInput.Length];
      fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
      cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
      cryptostream.Close();
      fsInput.Close();
      fsEncrypted.Close();
    }

    static void DecryptFile(string sInputFilename, 
                            string sOutputFilename,
                            string sKey)
    {
      DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
      //Une clé 64 bits et IV est nécessaire pour ce fournisseur.
      //Définit la clé secrète pour l'algorithme DES.
      DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
      //Définit le vecteur d'initialisation.
      DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

      //Crée un flux de fichier pour lire le fichier crypté.
      FileStream fsread = new FileStream(sInputFilename, 
                                         FileMode.Open, 
                                         FileAccess.Read);
      //Crée un décrypteur DES à partir de l'instance DES.
      ICryptoTransform desdecrypt = DES.CreateDecryptor();
      //Crée un flux crypto défini pour lire et effectue une
      //transformation de cryptage DES sur les octets entrants.
      CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
                                                       desdecrypt,
                                                    CryptoStreamMode.Read);
      //Imprime le contenu du fichier décrypté.
      StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
      fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
      fsDecrypted.Flush();
      fsDecrypted.Close();
    } 

  }
}

RÉFÉRENCES

Pour plus d'informations sur l'utilisation des fonctions cryptographiques de .NET, et sur la cryptographie en général, reportez-vous aux sites Web Microsoft Developer Network (MSDN) :

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbhowto kbhowtomaster KB307010
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Traductions disponibles