Jak šifrovat a dešifrovat soubor pomocí Visual C#

Překlady článku Překlady článku
ID článku: 307010 - Produkty, které se vztahují k tomuto článku.
Microsoft Visual Basic .NET verzi tohoto článku v tématu 301070.
Tento článek se týká následujících rozhraní Microsoft. Rámec oborů názvů knihovny tříd:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Poznámka: Tento článek se nevztahuje na Microsoft rozhraní.NET Framework 2.0.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek popisuje způsob použití třídy kryptografie jsou poskytované Microsoft rozhraní.NET Framework k zašifrování textového souboru do nečitelný státu a následně k dešifrování tohoto textového souboru zpět na původní formát.

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a aktualizace service Pack, které musí mít:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Systém Windows 2000 Advanced Server, Windows NT 4.0 Server nebo Microsoft Windows XP Professional
  • Microsoft Visual Studio 2005 nebo Microsoft Visual Studio .NET

Šifrování a dešifrování

Obor názvů System.Security.Cryptographic v Microsoft rozhraní.NET Framework poskytuje celou řadu nástroje, které vám pomohou s šifrování a dešifrování. Třída CryptoStream je jedním z mnoha tříd, které je k dispozici. Třída CryptoStream je určen k šifrování nebo dešifrování obsahu, jako je datovým proudem mimo soubor.

Zašifrování souboru

Chcete-li zašifrovat soubor, postupujte takto:
  1. Spusťte aplikaci Visual Studio 2005 nebo Visual Studio .NET.
  2. Klepněte Visual C# ve skupinovém rámečkuProjektya potom klepněte na tlačítko Konzolová aplikaceve skupinovém rámečku Šablony. Visual C# .NET vytvoří statické třídy, spolu s prázdné procedury Main() .
  3. Použijte příkaz using (jak je uvedeno v ukázkovém kódu, který následuje) v Následující obory názvů:
    • Systém
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    takže není nutné kvalifikovat deklarace z těchto Chcete-li obory názvů později v kódu. Musíte použít tyto příkazy před jinými prohlášení.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Generují tajný klíč k šifrování a dešifrování dat. DESCryptoServiceProvider je založena na symetrický šifrovací algoritmus. Symetrické vyžaduje šifrování klíče a inicializační vektor (IV) k zašifrování data. Chcete-li dešifrovat data, musí mít stejný klíč a IV stejné. Je nutné také pomocí stejného algoritmu šifrování. Při generování klíčů pomocí jedním z následujících způsobů:
    • Metoda 1 Výzvu k zadání hesla. Potom použijte heslo jako klíč a IV.
    • Metoda 2 Když vytvoříte novou instanci symetrické šifrování třídy, nový klíč a IV jsou automaticky vytvořeny relace. Použití klíče a IV, které jsou generovány pomocí spravovaných symetrických kryptografických tříd na šifrování a dešifrování souboru.

      Další informace o tom, jak generování a distribuce klíčů naleznete v tématu Microsoft SDK pro rozhraní.NET Framework Dokumentaci nebo v tématu následující Web společnosti Microsoft Developer Network (MSDN) Web:
      Generování klíčů pro šifrování a dešifrování
  5. Přidat následující funkce, kterou chcete vygenerovat nový klíč pro relace (jak je uvedeno v metodě 2 krok 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. Vytvořte metodu ve třídě s názvem EncryptFile. EncryptFile třída musí mít následující tři parametry:
    • sInputFilename
    • sOutputFilename
    • sKey (Tajný klíč, který slouží k šifrování a dešifrování soubor.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. V EncryptFile postup vytvoření vstupní objekt FileStream a výstup FileStream objekt. Tyto objekty lze číst a zapisovat do cíle soubory.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Deklarujte instanci třídy DESCryptoServiceProvider . To představuje skutečné šifrování a skutečné dešifrování technologie, která se používá u souborů. V tomto okamžiku můžete vytvořit Pokud dáváte přednost použití RSAsecutiry nebo jiného kryptografického jiného zprostředkovatele technika.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Musí být vybaveny zprostředkovatele kryptografických služeb vaší tajný klíč jako pole bajtů. Obor názvů System.Text poskytuje funkci s názvem GetBytes(). Jako součást jeho kódování funkce funkci GetBytes() přijímá řetězec a vrátí pole bajtů. Na velikost klíče je různá pro každý kryptografické techniky. Například Data Encryption (Standard DES) přebírá 64bitový klíč, který je roven 8 bajtů nebo 8 znaků.

    Pokud není poskytnut klíč, zprostředkovatel náhodně generuje jeden. To úspěšně zašifruje soubor, ale neexistuje žádný způsob, jak dešifrování souboru. Všimněte si, že je nutné zadat také inicializační vektor (IV). Tato hodnota se používá jako součást šifrování. Podobně jako klíč IV je náhodně generované, pokud nezadáte hodnotu. Protože hodnoty musí být stejné pro šifrování a dešifrování, nesmí dovolit náhodné generování těchto hodnot.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Vytvořit instanci třídy CryptoStream pomocí zprostředkovatele kryptografických služeb získat šifrování objekt (CreateEncryptor) a stávající výstup FileStream objekt jako součást konstruktoru.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Čtení vstupního souboru a poté se zapsat do výstupu soubor. Průchod CryptoStream objekt kde je soubor šifrován pomocí klíče, které k dispozici.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Dešifrování souboru

Chcete-li dešifrovat nějaký soubor, postupujte takto:
  1. Vytvořte metodu s názvemDecryptFile. Proces dešifrování je podobný proces šifrování, avšak procedura DecryptFile má dva hlavní rozdíly z EncryptFile postup.
    • CreateDecryptor se používá místo CreateEncryptor k vytvoření objektu CryptoStream , který určuje, jak lze objekt.
    • Při zápisu dešifrované text do cílového umístění soubor objektu CryptoStream je nyní zdroj, místo určení datový proud.
    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. Přidejte následující řádky Main() postup volání EncryptFile a 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. Uložte soubor. Spusťte aplikaci. Ujistěte se, že cesta, která se používá pro body název vstupního souboru do existujícího soubor.

Zkušební postup

Testování tento kód textového souboru (TXT) Chcete-li potvrdit, že kód šifrovat a dešifrovat soubor správně. Ujistěte se, dešifrovat soubor do nového souboru (jako v případě Main() v tomto článku) namísto původního souboru. Prohlédněte si dešifrovaný soubor a poté je porovnejte s původním souborem.

Úplný výpis kódu

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

Odkazy

Další informace o kryptografii a o použití kryptografické funkce rozhraní .NET, naleznete na následujících webech MSDN:
Obory názvů System.Security.Cryptography
Microsoft rozhraní.NET Framework Developer Center

Vlastnosti

ID článku: 307010 - Poslední aktualizace: 27. prosince 2012 - Revize: 11.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Klíčová slova: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku: 307010

Dejte nám zpětnou vazbu

 

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