Cum să cripta și decripta un fișier folosind Visual C#

Traduceri articole Traduceri articole
ID articol: 307010 - View products that this article applies to.
Pentru o versiune de Microsoft Visual Basic .NET din acest articol, a se vedea 301070.
Acest articol se referă la următoarele Microsoft .NET Cadru Biblioteca clasa spații de nume:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Notă Acest articol nu se aplică în cazul Microsoft .NET Framework 2.0.
Măriți totul | Reduceți totul

În această pagină

Rezumat

Acest articol descrie cum se utilizează clasele criptografie care sunt furnizate de Microsoft .NET Framework pentru a cripta un fișier text la un stat nu poate fi citită, și apoi pentru a decripta ca fișier text înapoi la originală formatul.

Cerințele

Listă tabel următoare evidențiază recomandat hardware, software-ul, infrastructura rețelei, și pachete de consolidare servicii, care trebuie să aveți:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Server Windows NT 4.0 sau Microsoft Windows XP Professional
  • Microsoft Visual Studio 2005 sau Microsoft Visual Studio .NET

Criptarea și decriptarea

Spațiul de nume la System.Security.Cryptographic în Microsoft .NET Framework oferă o varietate de instrumente pentru a vă ajuta cu criptare ?i decriptare. Clasa CryptoStream este una din mai multe clase, care este furnizat. Clasa CryptoStream este conceput pentru a cripta sau decripta conținutul așa cum este curge afară într-un fișier.

Cripta?i un fi?ier

Pentru a cripta un fișier, urmați acești pași:
  1. Începe Visual Studio 2005 sau Visual Studio .NET.
  2. Faceți clic pe Visual C# subProiecte, apoi faceți clic pe Consola cereresub Template-uri. Visual C# .NET creează o clasă statice pentru tine, împreună cu o procedură de Main() gol.
  3. Utilizează Instrucțiunea folosind (în conformitate cu mostre de cod care urmează) următoarele spații de nume:
    • Sistem
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    astfel încât să nu trebuie să se califice declarațiile din aceste spații de nume în codul dumneavoastră. Trebuie să utilizați aceste declarații înainte de orice alte declarațiile.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Genera o cheie secretă pentru a cripta și decripta datele. DESCryptoServiceProvider este bazat pe un algoritm de criptare simetrică. Simetrice criptare necesită o cheie si un vector de initializare (IV) pentru a cripta date. Pentru a decripta datele, trebuie să aibă aceeași cheie și aceeași IV. Trebuie să vă de asemenea, utilizează același algoritm de criptare. Puteți genera cheile utilizând oricare dintre următoarele metode:
    • Metoda 1 Poate solicita utilizatorului o parola. Apoi, utilizați parola ca cheie și IV.
    • Metoda 2 Atunci când creați un nou exemplu de simetrice criptografice cursuri, un nou cheie și IV sunt create automat pentru sesiune. Utilizarea cheie și IV generate de clasele criptografic simetric gestionate la cripta și decripta fișierul.

      Pentru mai multe informații despre cum să genera si distribui chei, a se vedea Microsoft .NET Framework SDK Documentația, sau a se vedea următoarele Web Rețea Microsoft pentru dezvoltatori (MSDN) site-ul:
      Generarea de chei pentru criptare ?i decriptare
  5. Adauga următoarea funcție pentru a genera un nou cheie pentru o sesiune (după cum sa menționat în metoda 2 din Pasul 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. Creați o metoda în clasa ta, care este numit EncryptFile. Clasa EncryptFile trebuie să aibă următoarele trei parametri:
    • sInputFilename
    • sOutputFilename
    • sKey (Cheia secretă, care este folosit pentru a cripta și decripta fișier.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. În procedura de EncryptFile , a crea un obiect de FileStream intrare si o iesire FileStream obiect. Aceste obiecte pot fi citite la și scris pentru a-țintă fișiere.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Declară o instanță a clasei DESCryptoServiceProvider . Aceasta reprezintă criptare reale și reale decriptare tehnologie care este folosit pe fișiere. În acest moment, aveți posibilitatea să creați un alt furnizor în cazul în care preferați să utilizați RSAsecutiry sau un alt criptografice tehnica.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Furnizorul criptografic, trebuie prevăzute cu dumneavoastră cheie secretă ca o matrice de octeți. Spațiul de nume la System.Text oferă o funcție care este numit GetBytes(). Ca parte din caracteristicile sale de codificare, în funcție de GetBytes() ia un șir și apoi întoarce o matrice de octeți. The Dimensiune cheie este diferit pentru fiecare tehnica criptografice. De exemplu, Data Encryption Standard (DES) ia o cheie de 64-bit, care este egală cu 8 octe?i sau la 8 caractere.

    Dacă nu furnizați o cheie, furnizorul aleatoriu generează unul. Acest lucru cu succes criptează dosar, dar nu există nici o modalitate pentru a decripta fișierul. Rețineți că, de asemenea, trebuie să furnizați vectorul de initializare (IV). această valoare este folosit ca parte de criptare. Ca cheia, IV este generate aleator dacă nu furnizați valoarea. Deoarece valorile trebuie să fie același lucru pentru criptare ?i decriptare, trebuie să nu permită aleatoare generație de aceste valori.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Crea o instanta a clasei CryptoStream utilizând Furnizorul criptografic pentru a obține o criptare obiect (CreateEncryptor) și cele existente de ieșire FileStream obiect ca parte a constructorului.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Citiți în fișierul de intrare, și apoi scrie la ieșire fișier. Trece prin intermediul CryptoStream obiect în cazul în care fișierul este criptat utilizând cheia care le furnizate.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Decriptarea unui fisier

Pentru a decripta un fișier, urmați acești pași:
  1. Creați o metodă, și apoi nume de sign-in acestaDecryptFile. Procesul de decriptare este similar cu procesul de criptare, cu toate acestea, procedura de DecryptFile a două diferențe cheie din procedura de EncryptFile .
    • CreateDecryptor este folosit în loc de CreateEncryptor pentru a crea obiectul CryptoStream , care specifică modul în care obiectul pot fi folosite.
    • Când decriptat textul este scris la destinație fișier, obiectul CryptoStream este acum sursa în loc de destinație flux.
    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. Adăugați următoarele linii la procedura Main() pentru a apela EncryptFile și de 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. Salvați fișierul. Executați aplicația. Asigurați-vă că calea care este folosit pentru punctele nume de intrare fișier existent fișier.

Procedura de testare

Acest cod de test cu un fișier text (.txt) pentru a confirma că codul criptat ?i decriptat fi?ierul corect. Asigurați-vă că vă decripta fișierul într-un nou fișier (ca în procedura Main() în acest articol) în loc de la fișierul original. Examinați fișierul decriptat, iar apoi comparati-l la fișierul original.

Completați codul listare

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();
      }
   }
}

Referințe

Pentru mai multe informații despre criptografie și despre utilizarea caracteristici criptografice de .NET, consultați următoarele site-uri MSDN Web:
System.Security.Cryptography namespace
Microsoft .NET Framework Developer Center

Proprietă?i

ID articol: 307010 - Ultima examinare: 20 iulie 2013 - Revizie: 2.0
Se aplică la:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Cuvinte cheie: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtro
Traducere automată
IMPORTANT: Acest articol este tradus cu ajutorul software-ului Microsoft de traducere automată ?i poate fi corectat prin intermediul tehnologiei Community Translation Framework (CTF). Microsoft oferă articole traduse automat, post-editate de comunitate ?i articole traduse de oameni, pentru a permite accesul la toate articolele din Baza noastră de cuno?tin?e în mai multe limbi. Articolele traduse automat ?i post-editate pot con?ine gre?eli de vocabular, sintaxă ?i/sau gramatică. Microsoft nu este responsabil de inexactită?ile, erorile sau daunele cauzate de traducerea gre?ită a con?inutului sau de utilizarea acestuia de către clien?i. Găsi?i mai multe informa?ii despre traducerea în colaborare la http://support.microsoft.com/gp/machine-translation-corrections/ro.
Face?i clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 307010

Trimite?i feedback

 

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