Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để mã hóa và giải mã tập tin bằng cách sử dụng Visual C#

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 307010
Để một Microsoft Visual Basic.net Phiên bản của bài viết này, hãy xem 301070.
Bài viết này đề cập đến Microsoft .NET sau Không gian tên thư viện lớp khuôn khổ:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Lưu ý Bài viết này không áp dụng cho Microsoft Khuôn khổ .NET 2.0.
Tóm tắt
Bài viết này mô tả làm thế nào để sử dụng các lớp học mật mã học đó được cung cấp bởi Microsoft Khuôn khổ .NET để mã hóa một tập tin văn bản để một không thể đọc được nhà nước, và sau đó để giải mã tập tin văn bản đó quay lại ban đầu của nó định dạng.

Yêu cầu

Danh sách sau đây phác thảo được đề nghị phần cứng, phần mềm, cơ sở hạ tầng mạng, và các gói bản ghi dịch vụ bạn phải:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 nâng cao máy chủ, máy chủ Windows NT 4.0, hoặc Microsoft Windows XP Chuyên nghiệp
  • Microsoft Visual Studio 2005 hoặc Microsoft Visual Studio .NET

Mã hóa và giải mã

Không gian tên System.Security.Cryptographic trong Microsoft Khuôn khổ .NET cung cấp một loạt các công cụ để giúp bạn với mã hóa và giải mã. Các lớp học CryptoStream là một trong nhiều các lớp học được cung cấp. Lớp CryptoStream được thiết kế để mã hóa hoặc giải mã nội dung như nó là trực tiếp vào một tập tin.

Mật mã hóa tệp

Để mã hóa tập tin, hãy làm theo các bước sau:
  1. Bắt đầu Visual Studio 2005 hoặc Visual Studio net.
  2. Bấm chuột Visual C# theoDự án, và sau đó nhấp vào Giao diện điều khiển ứng dụngtheo Mẫu. Visual C# .NET tạo ra một lớp học tĩnh cho bạn, cùng với một thủ tục Main() có sản phẩm nào.
  3. Sử dụng các báo cáo bằng cách sử dụng (như được chỉ ra trong các mẫu mã sau) trên các không gian tên sau đây:
    • Hệ thống
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    do đó bạn không cần phải vượt qua vòng loại tuyên bố từ những không gian tên sau đó trong mã của bạn. Bạn phải sử dụng các báo cáo trước khi bất kỳ khác khai báo.
    using System;using System.IO;using System.Security;using System.Security.Cryptography;using System.Runtime.InteropServices;using System.Text;					
  4. Tạo ra một chìa khóa bí mật mã hóa và giải mã dữ liệu. DESCryptoServiceProvider được dựa trên một thuật toán mã hóa đối xứng. Các đối xứng mật mã yêu cầu một phím và một véc tơ khởi tạo (IV) để mã hóa các dữ liệu. Để giải mã dữ liệu, bạn phải có cùng một phím và IV cùng. Bạn phải cũng sử dụng các thuật toán mã hóa tương tự. Bạn có thể tạo các phím bằng cách sử dụng một trong những phương pháp sau đây:
    • Phương pháp 1 Bạn có thể nhắc người dùng mật khẩu. Sau đó, sử dụng mật khẩu như chìa khóa và các IV.
    • Phương pháp 2 Khi bạn tạo ra một trường hợp mới của các đối xứng mật mã lớp học, khóa mới và IV được tự động tạo ra cho kỳ họp này. Sử dụng các chìa khóa và IV được tạo ra bởi các lớp học mã hóa đối xứng được quản lý để mã hóa và giải mã tập tin.

      Để biết thêm thông tin về làm thế nào để tạo ra và phân phối các phím, hãy xem Microsoft Khuôn khổ .NET SDK Tài liệu, hoặc số xem theo web site Microsoft Developer Network (MSDN) sau đây Trang web:
  5. Thêm các chức năng sau đây để tạo ra một chìa khóa mới cho một Phiên làm việc (như đã nêu trong phương pháp 2 bước 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. Tạo ra một phương pháp trong các lớp học của bạn được đặt tên EncryptFile. Các lớp học EncryptFile phải có ba tham số sau đây:
    • sInputFilename
    • sOutputFilename
    • sKey (Khóa bí mật được sử dụng để mã hóa và giải mã các tập tin.)
    static void EncryptFile(string sInputFilename,		string sOutputFilename,		string sKey)					
  7. Trong thủ tục EncryptFile , tạo ra một đối tượng FileStream đầu vào và đầu ra một đối tượng FileStream . Các đối tượng có thể được đọc từ và ghi vào các mục tiêu tập tin.
    FileStream fsInput = new FileStream(sInputFilename, 				FileMode.Open, 				FileAccess.Read);FileStream fsEncrypted = new FileStream(sOutputFilename, 				FileMode.Create, 				FileAccess.Write);					
  8. Tuyên bố một thể hiện của lớp DESCryptoServiceProvider . Điều này đại diện cho các mã hóa thực tế và thực tế công nghệ giải mã được sử dụng trên các tập tin. Tại thời điểm này, bạn có thể tạo một nhà cung cấp khác nhau nếu bạn muốn sử dụng RSAsecutiry này hay cách khác mật mã kỹ thuật.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();					
  9. Các nhà cung cấp mã hóa phải được cung cấp của bạn chìa khóa bí mật như là một mảng byte. Không gian tên System.Text cung cấp một chức năng mà được đặt tên GetBytes(). Như một phần của tính năng mã hóa của nó, các chức năng GetBytes() mất một chuỗi, và sau đó trở về một loạt các byte. Các Kích thước của phím là khác nhau cho mỗi kỹ thuật mã hóa. Ví d ụ, Dữ liệu mã hóa tiêu chuẩn (DES) diễn một chìa khóa 64-bit tương đương với 8 byte hoặc 8 kí tự đại diện.

    Nếu bạn không cung cấp một khóa, các nhà cung cấp ngẫu nhiên tạo ra một. Điều này thành công mã hóa tập tin, nhưng có không có cách nào để giải mã tập tin. Lưu ý rằng bạn cũng phải cung cấp các véc tơ khởi tạo (IV). giá trị này được sử dụng như một phần của mã hóa. Giống như chìa khóa, các IV là ngẫu nhiên tạo ra nếu bạn không cung cấp giá trị. Bởi vì các giá trị phải tương tự cho mã hóa và giải mã, bạn phải cho phép ngẫu nhiên thế hệ của các giá trị.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);					
  10. Tạo một thể hiện của lớp CryptoStream bằng cách sử dụng các nhà cung cấp mật mã để có được một mã hóa đối tượng (CreateEncryptor) và hiện tại ra FileStream các đối tượng như là một phần của các nhà xây dựng.
    ICryptoTransform desencrypt = DES.CreateEncryptor();CryptoStream cryptostream = new CryptoStream(fsEncrypted, 					desencrypt, 					CryptoStreamMode.Write);					
  11. Đọc trong các tập tin đầu vào, và sau đó viết ra đến đầu ra tập tin. Đi qua các đối tượng CryptoStream nơi các tập tin được mã hóa bằng cách sử dụng các phím mà bạn cung cấp.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);					

Giải mã tập tin

Để giải mã tập tin, hãy làm theo các bước sau:
  1. Tạo ra một phương pháp, và sau đó đặt tên nóDecryptFile. Quá trình giải mã này là tương tự như các quá trình mã hóa, Tuy nhiên, thủ tục DecryptFile có hai sự khác biệt quan trọng từ các thủ tục EncryptFile .
    • CreateDecryptor được sử dụng thay vì CreateEncryptor để tạo ra các đối tượng CryptoStream , trong đó xác định như thế nào đối tượng có thể được sử dụng.
    • Khi đoạn giải mã được viết đến đích tập tin, các đối tượng CryptoStream bây giờ là nguồn thay vì các điểm đến dòng.
    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. Thêm dòng sau vào thủ tục Main() để gọi cho EncryptFileDecryptFile:
    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. Lưu tệp. Chạy ứng dụng của bạn. Hãy chắc chắn rằng các đường dẫn được sử dụng cho tập đã đặt tên tin đầu vào điểm hiện tại tập tin.

Kiểm tra các thủ tục

Kiểm tra mã này với một tập tin văn bản (txt) để xác nhận rằng mã mã hóa và giải mã tập tin một cách chính xác. Hãy chắc chắn rằng bạn giải mã tập tin cho một tập tin mới (như trong thủ tục Main() trong bài viết này) thay vì các tập tin ban đầu. Kiểm tra các tập tin giải mã, và sau đó so sánh nó với các tập tin ban đầu.

Danh sách mã hoàn chỉnh

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();      }   }}
Tham khảo
Để biết thêm thông tin về mật mã, và về việc sử dụng các Các tính năng mã hóa của .NET, xem MSDN Web site sau:

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 307010 - Xem lại Lần cuối: 11/15/2012 07:29:00 - Bản sửa đổi: 4.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 KbMtvi
Phản hồi
mp;t=">