Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 307010
Pour obtenir une version Microsoft les .NET de Visual Basic de cet article, reportez-vous à la section. 301070.
Cet article fait référence aux espaces de noms bibliothèque de classes.NET Framework de la Microsoft suivant :
  • System.IO
  • System.Security
  • System.Security.Cryptography
Remarque Cet article ne s'applique pas dans le.NET Framework de la Microsoft 2.0.
Résumé
Cet article décrit comment utiliser les classes de chiffrement qui sont fournies par le Microsoft .NET Framework pour chiffrer des fichier de texte sous forme illisible, puis pour déchiffrer ce fichier texte vers son format d'origine.

Configuration requise

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

Chiffrage et Déchiffrage

L'espace de noms System.Security.Cryptographic dans le.NET Framework de la Microsoft fournit une gamme d'outils pour vous aider avec le cryptage et le décryptage. La classe CryptoStream est une des nombreuses classes fournies. La classe CryptoStream est conçue pour crypter ou décrypter le contenu tel qu'il est transmis en flux dans un fichier.

Chiffrer 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# dans lesprojets, puis cliquez sur Application 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 les espaces de noms réticules du centre :
    • System
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    afin que vous n'êtes pas obligé de qualifier les déclarations de thesenamespaces ultérieurement dans votre code. Vous devez utiliser ces instructions avant toute otherdeclarations.
    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ée sur un algorithme de cryptage symétrique. La symmetricencryption requiert une clé et un vecteur d'initialisation (IV) pour chiffrer thedata. Pour décrypter les données, vous devez disposer de la même clé et le même vecteur d'initialisation. Mustalso vous utilisez le même algorithme de chiffrement. Vous pouvez générer les clés par usingeither des méthodes suivantes :
    • Méthode 1 Vous pouvez demander un mot de passe à l'utilisateur. 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 des classes de chiffrement symétriques, une nouvelle clé et un IV sont créés automatiquement pour la session. Utiliser la clé et le vecteur d'initialisation qui sont générés par les classes de chiffrement symétriques managées pour crypter et décrypter le fichier.

      Pour plus d'informations sur la façon de générer et de distribuer des clés, reportez-vous à la Documentation du Kit de développement logiciel.NET Framework de la Microsoft ou consultez le site Web de Microsoft Developer Network (MSDN) à l'adresse suivante :
  5. Ajoutez la fonction suivante pour générer une nouvelle clé pour asession (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éer une méthode dans votre classe nommée EncryptFile. La classe EncryptFile doit avoir trois paramètres suivants :
    • sInputFilename
    • sOutputFilename
    • sKey (La clé secrète utilisée pour crypter et décrypter 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 le targetfiles.
    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 la technologie actualdecryption qui est utilisée sur les fichiers. À ce stade, vous pouvez créerune autre fournisseur si vous préférez utiliser RSAsecutiry ou cryptographictechnique une autre.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();					
  9. Le fournisseur cryptographique doit être fourni avec clé d'yoursecret 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 retourne un tableau d'octets. Thesize de la clé est différente pour chaque technique cryptographique. Par exemple, la norme DES (Data Encryption) prend une clé de 64 bits qui est égale à 8 octets orto 8 caractères.

    Si vous ne fournissez pas de clé, les randomlygenerates fournisseur une. Crypte le fichier correctement, mais il n'y a aucun moyen todecrypt le fichier. Notez que vous devez également fournir le vector(IV) de l'initialisation. Cette valeur est utilisée dans le cadre du cryptage. Comme la clé, l'israndomly IV généré si vous ne fournissez pas la valeur. Étant donné que les valeurs doivent bethe même pour le cryptage et le décryptage, vous ne devez permettre la randomgeneration de ces valeurs.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);					
  10. Créez une instance de la classe CryptoStream à l'aide du fournisseur de services cryptographiques pour obtenir un encryptingobject (CreateEncryptor) et existant de sortie objet FileStream en tant que partie du constructeur.
    ICryptoTransform desencrypt = DES.CreateEncryptor();CryptoStream cryptostream = new CryptoStream(fsEncrypted, 					desencrypt, 					CryptoStreamMode.Write);					
  11. Lisez le fichier d'entrée et puis écrire dans le fichier de sortie. Passer l'objet CryptoStream où le fichier est crypté à l'aide de la clé de ce youprovided.
    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, puis donnez-lui un nomDecryptFile. Le processus de décryptage est similaire à theencryption, toutefois, la procédure DecryptFile présente deux différences clés avec la procédure EncryptFile .
    • CreateDecryptor est utilisé au lieu de CreateEncryptor pour créer l'objet CryptoStream , qui spécifie la manière dont l'objet peut être utilisé.
    • Lorsque du texte décrypté est écrit dans le fichier de destination, l'objet CryptoStream est désormais la source au lieu du flux de destination.
    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. Assurez-vous que thepath qui est utilisé pour les points de nom de fichier d'entrée à un existingfile.

Test de la procédure

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

Listing complet 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 le chiffrement et sur l'utilisation des fonctions cryptographiques de .NET, consultez les sites Web MSDN suivants :

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 307010 - Dernière mise à jour : 04/23/2016 02:49:00 - Révision : 6.0

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2003 Initiation, Microsoft Visual C# .NET 2002 Initiation

  • kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtfr
Commentaires