Як для шифрування та дешифрування файлів за допомогою Visual C#

Переклади статей Переклади статей
Номер статті: 307010 - Показ продуктів, яких стосується ця стаття.
Microsoft Visual Basic .NET версії цієї статті див. 301070.
Ця стаття відноситься до наступних Microsoft .NET Рамках клас бібліотечного простору імен:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Примітка Ця стаття не застосовується до Microsoft .NET Framework 2.0.
Розгорнути все | Згорнути все

На цій сторінці

Підсумки

У цій статті описується сценарій виконання криптографії класи що надаються Microsoft .NET Framework зашифрувати текстового файлу для що неможливо прочитати держави а потім, щоб розшифрувати цей файл назад до її початкового формат.

Вимоги

У цьому списку описано Рекомендоване обладнання, Підтримка програмного забезпечення, Мережева інфраструктура та пакети оновлень, які потрібно мати:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000, розширений, сервер, сервер Windows NT 4.0 або Microsoft Windows XP професійно оформлений
  • Microsoft Visual Studio 2005 або Microsoft Visual Studio .NET

Шифрування та дешифрування

Microsoft .NET Framework, імен System.Security.Cryptographic надає різноманітні інструменти, щоб допомогти вам з шифрування та дешифрування. CryptoStream клас є одним з багатьох класів, які надаються. CryptoStream клас призначений, щоб зашифрувати або розшифрувати контент, як це потокові на файл.

Шифрування файлу

Щоб зашифрувати файл, виконайте такі дії:
  1. Почати Visual Studio 2005 або Visual Studio .NET.
  2. Натисніть кнопку Visual C# у розділіПроектиа потім натисніть кнопку Консольного застосуванняу розділі Шаблони. Visual C# .NET створити статичного класу, разом з пусту процедуру Main() .
  3. Використовувати за допомогою заяви (як зазначено в зразок коду, який слід) на в Наступні простори імен:
    • Система
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    так що вам не доведеться кваліфікувати заяви від цих простори імен пізніше у вашому коді. Ви повинні використовувати ці заяви, перш ніж будь-який інший декларації.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Генерувати секретний ключ для шифрування і дешифрування даних. DESCryptoServiceProvider на основі алгоритм симетричного шифрування. На симетричних шифрування потребує ключа і є вектор ініціалізації (IV) для шифрування на дані. Щоб дешифрувати дані, потрібно мати той же ключ та ж IV. Ви повинні також використовувати однакові алгоритм шифрування. Ви можете згенерувати ключі за допомогою будь-який з наступних методів:
    • Спосіб 1 Ви можете запрошення ввести пароль. Потім за допомогою пароля, як ключ і IV ст.
    • Спосіб 2 Під Вільний час створення новий екземпляр на симетричних криптографії класи, новий ключ і IV створюються автоматично для сеансу. сценарій виконання на ключ і IV, спричинені керованих симетричних криптографічні класи для шифрувати і дешифрувати файл.

      Для отримання додаткових відомостей про те, як генерувати і розповсюджувати ключі, див Microsoft .NET Framework SDK Документації, або див. нижче веб Microsoft Developer Network (MSDN) сайт:
      Генерації ключів для шифрування і дешифрування
  5. Додати таку функцію, щоб створити новий ключ для в сесія (як зазначено в способу 2 кроку 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. Створити метод у вашому класі, що називається EncryptFile. EncryptFile клас повинен мати такі три параметри:
    • sInputFilename
    • sOutputFilename
    • sKey (Секретний ключ, який використовується для шифрування та дешифрування на файл.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. У EncryptFile процедуру, створіть вхідного потоку об'єктів і виходу потоку об'єктів. Ці об'єкти можна читати і записувати до цільового файли.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Оголосити екземпляр класу DESCryptoServiceProvider . Це являє собою фактичні шифрування та фактичного дешифрування технологія, яка використовується на файли. У цей момент ви можете створити іншого провайдера, якщо ви віддаєте перевагу використовувати RSAsecutiry або інший криптографії техніка.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. постачальник послуг оренди застосунків шифрування повинні бути надані з вашого секретний ключ як масив байтів. Простір імен System.Text забезпечує функції, яка називається GetBytes(). У рамках його двопрохідне кодування функцій функція GetBytes() приймає рядок із і повертає масив байтів. На розмір ключа відрізняється для кожної криптографічні техніки. Наприклад, Шифрування даних стандартні (DES) приймає 64-розрядний ключ, який дорівнює 8 байт або до 8 символів.

    Якщо не ввести ключ, постачальник послуг оренди застосунків випадково створює один. Це успішно шифрує файл, але немає ніякого способу для дешифрувати файл. Зверніть увагу, що вам також необхідно надати вектор ініціалізації (IV). це значення використовується як частину шифрування. Як ключ є IV Випадкові, якщо ви не надаєте значення. Оскільки значення має бути те ж саме для шифрування і дешифрування на, ви не повинні дозволити випадкові покоління цих цінностей.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Створити екземпляр класу CryptoStream за допомогою постачальник послуг оренди застосунків шифрування для отримання із шифруванням об'єкт (CreateEncryptor) та існуючих вихідний об'єкт потоку як частина Конструктор.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Читати файла а потім написати виході файл. Пройти через об'єкт CryptoStream де файл зашифровано за допомогою ключа що ви умови.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Дешифрування файлів

Дешифрування файлів, виконайте такі дії:
  1. Створити метод а потім ім'я йогоDecryptFile. Процес шифрування схожа на криптографічний процес, однак, DecryptFile процедури має дві основні відмінності від EncryptFile процедури.
    • CreateDecryptor для створення CryptoStream об'єкта, який вказує, як можна використовувати об'єкт використовується замість CreateEncryptor .
    • Коли розшифровані текст написаний до місця призначення файл, CryptoStream об'єкт тепер є джерело, а не пункт призначення потік.
    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. Додати наступні рядки до процедури Main() називати EncryptFile і 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. Збережіть файл. Запустити застосунок. Переконайтеся, що на шлях, який використовується для вхідного файлу ім'я точки на наявний файл.

Перевірка порядку

Перевірити цей код з файлу текстового (TXT), щоб підтвердити, що код зашифровані і розшифрувати файл належним чином. Переконайтеся, що ви дешифрувати файл до нового файлу (як у Main() процедури в цій статті) замість того щоб вихідний файл. Розшифрований файл і порівняйте його з вихідного файлу.

Повний код лістингу

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

Посилання

Для отримання додаткових відомостей про криптографії та сценарій виконання на криптографічні функції .NET, перегляньте такі MSDN веб-сайти:
System.Security.Cryptography простір імен
Microsoft .NET Framework Центр розробників Office

Властивості

Номер статті: 307010 - Востаннє переглянуто: 15 листопада 2012 р. - Редакція: 2.0
Застосовується до:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Ключові слова: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtuk
Машинний переклад
УВАГА! Цю статтю переклала програма машинного перекладу Microsoft, а не людина. Корпорація Microsoft пропонує вам як машинні переклади, так і переклади фахівців, щоб Ви мали доступ до всіх статей бази знань рідною мовою. Проте стаття, яку переклав комп’ютер, не завжди бездоганна. Вона може містити лексичні, синтаксичні або граматичні помилки. Так само помиляється іноземець, спілкуючись вашою рідною мовою. Корпорація Microsoft не несе відповідальність за жодні неточності, помилки або шкоду, завдану неправильним перекладом змісту або його використанням з боку користувачів. Крім того, корпорація Microsoft часто оновлює програму машинного перекладу.
Клацніть тут, щоб переглянути цю статтю англійською мовою: 307010

Надіслати відгук

 

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