Làm th? nào đ? m? hóa và gi?i m? t?p tin b?ng cách s? d?ng Visual C#

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 307010 - Xem s?n ph?m mà bài này áp d?ng vào.
Đ? 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.
Bung t?t c? | Thu g?n t?t c?

? Trang này

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:
      T?o ra các phím cho m? hóa và gi?i m?
  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:
Không gian tên System.Security.Cryptography
Trung tâm nhà phát tri?n Microsoft Khuôn kh? .NET

Thu?c tính

ID c?a bài: 307010 - L?n xem xét sau cùng: 15 Tháng Mười Một 2012 - Xem xét l?i: 4.0
Áp d?ng
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
T? khóa: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtvi
Máy d?ch
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

Cung cấp Phản hồi

 

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