Comment faire pour chiffrer et déchiffrer un fichier à l'aide de Visual C#

Traductions disponibles Traductions disponibles
Numéro d'article: 307010 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F307010
Pour obtenir une version Microsoft Visual Basic .NET de cet article, reportez-vous à la section. 301070.
Cet article fait référence à la suivant Microsoft .NET Espaces de noms bibliothèque de classes Framework :
  • System.IO
  • System.Security
  • System.Security.Cryptography
Remarque : Cet article ne s'applique pas pour le Microsoft.NET Framework 2.0.
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article décrit comment utiliser les classes de chiffrement qui sont fournies par le.NET Framework de Microsoft pour crypter un fichier texte à un illisible, puis à décrypter ce fichier texte à son original format.

Configuration requise

La liste suivante met en évidence le matériel recommandé, logiciel, infrastructure de réseau et les service packs dont vous avez besoin :
  • Microsoft Windows 2000 Professionnel, Windows 2000 Server, Windows 2000 Advanced Server, Windows NT 4.0 Server ou Microsoft Windows XP Professionnel
  • Microsoft Visual Studio 2005 ou Microsoft Visual Studio .NET

Cryptage et décryptage

L'espace de noms System.Security.Cryptographic dans le Microsoft.NET Framework propose un certain nombre de outils pour vous aider avec cryptage et décryptage. La classe CryptoStream est une des nombreuses classes fournies. La classe CryptoStream est conçue pour crypter ou à déchiffrer le contenu tel qu'il est transféré vers un fichier.

Crypter un fichier

Pour crypter un fichier, procédez comme suit :
  1. Démarrez Visual Studio 2005 ou Visual Studio .NET.
  2. Cliquez sur Visual C# sousProjets, puis cliquez sur Application de consolesous Modèles. Visual C# .NET crée une classe statique pour vous, ainsi qu'une procédure Main() vide.
  3. Utilisez l'instruction using (comme indiqué dans l'exemple de code qui suit) sur le espaces de noms suivants :
    • Système
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    afin que vous n'êtes pas obligé de qualifier les déclarations de ces espaces de noms ultérieurement dans votre code. Vous devez utiliser ces instructions avant toute autre déclarations.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Générer une clé secrète pour crypter et décrypter les données. Le DESCryptoServiceProvider est basé sur un algorithme de chiffrement symétrique. Le symétrique le cryptage requiert une clé et un vecteur d'initialisation (IV) pour chiffrer le données. Pour décrypter les données, vous devez avoir la même clé et le même vecteur d'initialisation. Vous devez également utiliser le même algorithme de cryptage. Vous pouvez générer les clés à l'aide une des méthodes suivantes :
    • Méthode 1 Vous pouvez inviter l'utilisateur à un mot de passe. Ensuite, utilisez le mot de passe en tant que la clé et le vecteur d'initialisation.
    • Méthode 2 Lorsque vous créez une nouvelle instance de la symétrique cryptographique classes, une nouvelle clé et IV sont créés automatiquement pour la session. Utilisez le Key et IV qui sont générés par les classes de chiffrement symétriques managées à crypter et décrypter le fichier.

      Pour plus d'informations sur la façon générer et distribuer des clés, consultez le Kit de développement Microsoft.NET Framework Documentation, ou consultez le site Web Microsoft Developer Network (MSDN) suivant site :
      Génération de clés de cryptage et décryptage
  5. Ajoutez la fonction suivante pour générer une nouvelle clé pour un session (comme indiqué dans la méthode 2 de l'étape 4) :
    //  Call this function to remove the key from memory after use for security.
    [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
    public static extern bool ZeroMemory(ref string Destination, int Length);
    		
    // Function to Generate a 64 bits Key.
    static string GenerateKey() 
    {
    	// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
    	DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
    
    	// Use the Automatically generated key for Encryption. 
    	return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
    }
  6. Créez une méthode dans votre classe est nommée EncryptFile. La classe EncryptFile doit avoir trois paramètres suivants :
    • sInputFilename
    • sOutputFilename
    • sKey (La clé secrète est utilisée pour chiffrer et déchiffrer le fichier.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. Dans la procédure EncryptFile , créez un objet FileStream d'entrée et une sortie objet FileStream . Ces objets peuvent être lues et écrites dans la cible fichiers.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Déclarez une instance de la classe DESCryptoServiceProvider . Cela représente au cryptage proprement dit et le réel technologie de décryptage qui est utilisée sur les fichiers. À ce stade, vous pouvez créer un fournisseur différent si vous préférez utiliser RSAsecutiry ou une autre cryptographique technique.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Le fournisseur cryptographique doit être fourni avec votre clé secrète sous la forme d'un tableau d'octets. L'espace de noms System.Text fournit une fonction nommée GetBytes(). Dans le cadre de ses fonctions de codage, la fonction GetBytes() prend une chaîne et renvoie ensuite un tableau d'octets. Le taille de la clé est différente pour chaque technique cryptographique. Par exemple, Data Encryption Standard (DES) prend une clé de 64 bits qui est égale à 8 octets ou à 8 caractères.

    Si vous ne fournissez pas une clé, le fournisseur de manière aléatoire génère un. Il crypte avec succès le fichier, mais il n'y a aucun moyen de décrypter le fichier. Notez que vous devez également fournir le vecteur d'initialisation (IV). cette valeur est utilisée dans le cadre du cryptage. Comme la clé, est le vecteur d'initialisation généré de façon aléatoire si vous ne fournissez pas la valeur. Étant donné que les valeurs doivent être le même pour le chiffrement et le déchiffrement, vous devez autoriser pas aléatoire génération de ces valeurs.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Créer une instance de la classe CryptoStream en utilisant le fournisseur de services cryptographiques pour obtenir un cryptage objet (CreateEncryptor) et les fichiers de sortie objet FileStream dans le cadre du constructeur.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Lisez le fichier d'entrée et puis écrire sur la sortie fichier. Passer par le biais de l'objet CryptoStream où le fichier est crypté à l'aide de la clé que vous avez fourni.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Décrypter un fichier

Pour décrypter un fichier, procédez comme suit :
  1. Créez une méthode et lui donner le nomDecryptFile. Le processus de décryptage est similaire à la processus de cryptage, toutefois, la procédure DecryptFile a deux différences essentielles à la procédure EncryptFile .
    • Au lieu de CreateEncryptor , CreateDecryptor permet de créer l'objet CryptoStream , qui spécifie comment l'objet peut être utilisé.
    • Lorsque le texte décrypté est écrit dans la destination fichier, l'objet CryptoStream est maintenant la source au lieu de la destination flux de données.
    static void DecryptFile(string sInputFilename, 
    	                string sOutputFilename,
    	                string sKey)
    {
    	DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    	//A 64 bit key and IV is required for this provider.
    	//Set secret key For DES algorithm.
    	DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    	//Set initialization vector.
    	DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    
    	//Create a file stream to read the encrypted file back.
    	FileStream fsread = new FileStream(sInputFilename, 
    		                           FileMode.Open, 
    		                           FileAccess.Read);
    	//Create a DES decryptor from the DES instance.
    	ICryptoTransform desdecrypt = DES.CreateDecryptor();
    	//Create crypto stream set to read and do a 
    	//DES decryption transform on incoming bytes.
    	CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
    		                                         desdecrypt,
    		                                         CryptoStreamMode.Read);
    	//Print the contents of the decrypted file.
    	StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
    	fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
    	fsDecrypted.Flush();
    	fsDecrypted.Close();
    }
    					
  2. Ajoutez les lignes suivantes à la procédure Main() pour appeler EncryptFile et DecryptFile:
    static void Main()
    {
          // Must be 64 bits, 8 bytes.
          // Distribute this key to the user who will decrypt this file.
          string sSecretKey;
             
          // Get the key for the file to encrypt.
          sSecretKey = GenerateKey();
    
          // For additional security pin the key.
          GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
             
          // Encrypt the file.        
          EncryptFile(@"C:\MyData.txt", 
             @"C:\Encrypted.txt", 
             sSecretKey);
    
          // Decrypt the file.
          DecryptFile(@"C:\Encrypted.txt", 
             @"C:\Decrypted.txt", 
             sSecretKey);
    
          // Remove the key from memory. 
          ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
          gch.Free();
    }
  3. Enregistrez le fichier. Exécutez votre application. Veillez à ce que le chemin d'accès qui est utilisé pour les points de nom de fichier d'entrée à un objet existant fichier.

La procédure d'essai

Testez ce code avec un fichier texte (.txt) pour confirmer que le code crypté et décrypté le fichier correctement. Assurez-vous que vous décryptez le fichier dans un nouveau fichier (comme dans la procédure Main() dans cet article) et non dans le fichier d'origine. Examinez le fichier décrypté et puis de le comparer au fichier d'origine.

Intégralité du code

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

namespace CSEncryptDecrypt
{
   class Class1
   {
      //  Call this function to remove the key from memory after use for security
      [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
      public static extern bool ZeroMemory(IntPtr Destination, int Length);
		
      // Function to Generate a 64 bits Key.
      static string GenerateKey() 
      {
         // Create an instance of Symetric Algorithm. Key and IV is generated automatically.
         DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

         // Use the Automatically generated key for Encryption. 
         return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
      }

      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();
         //A 64 bit key and IV is required for this provider.
         //Set secret key For DES algorithm.
         DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
         //Set initialization vector.
         DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

         //Create a file stream to read the encrypted file back.
         FileStream fsread = new FileStream(sInputFilename, 
            FileMode.Open, 
            FileAccess.Read);
         //Create a DES decryptor from the DES instance.
         ICryptoTransform desdecrypt = DES.CreateDecryptor();
         //Create crypto stream set to read and do a 
         //DES decryption transform on incoming bytes.
         CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
            desdecrypt,
            CryptoStreamMode.Read);
         //Print the contents of the decrypted file.
         StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
         fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
         fsDecrypted.Flush();
         fsDecrypted.Close();
      } 

      static void Main()
      {
         // Must be 64 bits, 8 bytes.
         // Distribute this key to the user who will decrypt this file.
         string sSecretKey;
         
         // Get the Key for the file to Encrypt.
         sSecretKey = GenerateKey();

         // For additional security Pin the key.
         GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
         
         // Encrypt the file.        
         EncryptFile(@"C:\MyData.txt", 
            @"C:\Encrypted.txt", 
            sSecretKey);

         // Decrypt the file.
         DecryptFile(@"C:\Encrypted.txt", 
            @"C:\Decrypted.txt", 
            sSecretKey);

         // Remove the Key from memory. 
         ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
         gch.Free();
      }
   }
}

Références

Pour plus d'informations sur la cryptographie et sur l'utilisation de la fonctions cryptographiques de .NET, consultez les sites Web MSDN suivants :
Espace de noms System.Security.Cryptography
Centre de développement Microsoft.NET Framework

Propriétés

Numéro d'article: 307010 - Dernière mise à jour: jeudi 15 novembre 2012 - Version: 2.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Initiation
  • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 307010
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.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com