ID Artikel: 307010 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0

Cara mengenkripsi dan mendekripsi berkas dengan menggunakan Visual C#

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Untuk Microsoft Visual Basic.NET versi artikel ini, lihat 301070  (http://support.microsoft.com/kb/301070/ ) .
Artikel ini merujuk kepada Microsoft berikut.NET Kerangka perpustakaan kelas namespaces:
  • System.io
  • System.Security
  • System.Security.cryptography
Catatan Artikel ini tidak berlaku untuk Microsoft.NET Framework 2.0.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menjelaskan cara menggunakan kriptografi kelas yang disediakan oleh Microsoft.NET Framework untuk mengenkripsi file teks negara tidak terbaca, dan kemudian untuk mendekripsi berkas teks itu kembali ke aslinya format.

Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, dan paket layanan yang Anda harus:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows NT 4.0 Server atau Microsoft Windows XP Profesional
  • Microsoft Visual Studio 2005 atau Microsoft Visual Studio .NET

Enkripsi dan dekripsi

The System.Security.cryptographic namespace di Microsoft.NET Framework menyediakan berbagai alat untuk membantu Anda dengan enkripsi dan dekripsi. The CryptoStream kelas adalah salah satu dari banyak kelas yang disediakan. The CryptoStream kelas ini dirancang untuk mengenkripsi atau mendekripsi konten seperti yang mengalir keluar ke file.

Mengenkripsi berkas

Untuk mengenkripsi berkas, ikuti langkah berikut:
  1. Mulai Visual Studio 2005 atau Visual Studio.NET.
  2. Klik Visual C# di bawahProyek, lalu klik Aplikasi konsoldi bawah Pola acu. Visual C#.NET menciptakan Statis kelas untuk Anda, bersama dengan kosong Main() prosedur.
  3. Penggunaan menggunakan pernyataan (seperti yang ditunjukkan dalam kode contoh berikut) pada ruang nama berikut:
    • Sistem
    • System.Security
    • System.Security.cryptography
    • System.text
    • System.io
    sehingga Anda tidak harus memenuhi syarat Deklarasi dari ini namespaces kemudian dalam kode Anda. Anda harus menggunakan pernyataan-pernyataan ini sebelum yang lain Deklarasi.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Menghasilkan kunci rahasia untuk mengenkripsi dan mendekripsi data. The DESCryptoServiceProvider ini didasarkan pada algoritma enkripsi simetris. Simetris enkripsi memerlukan kunci dan vektor inisialisasi (IV) untuk mengenkripsi data. Untuk mendekripsi data, Anda harus memiliki tombol yang sama dan IV sama. Anda harus juga menggunakan algoritma enkripsi yang sama. Anda dapat menghasilkan kunci dengan menggunakan salah satu metode berikut:
    • Metode 1 Anda dapat meminta pengguna untuk password. Kemudian, gunakan sandi sebagai kunci dan IV.
    • Metode 2 Ketika Anda membuat contoh baru dari simetris kriptografi kelas, kunci baru dan IV otomatis diciptakan untuk sesi. Penggunaan kunci dan IV yang dihasilkan oleh kelas kriptografi simetrik dikelola untuk mengenkripsi dan mendekripsi berkas.

      Untuk informasi lebih lanjut tentang cara menghasilkan dan mendistribusikan kunci, lihat Microsoft.NET Framework SDK Dokumentasi, atau lihat Website Microsoft Developer Network (MSDN) berikut situs:
      Menghasilkan kunci untuk enkripsi dan dekripsi
      http://MSDN.Microsoft.com/Library/default.asp?URL=/Library/en-US/cpguide/HTML/cpcongeneratingkeysforencryptiondecryption.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp)
  5. Tambahkan fungsi berikut untuk menghasilkan sebuah kunci baru untuk sesi (seperti tercantum dalam metode 2 langkah 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. Menciptakan metode di kelas Anda yang bernama EncryptFile. The EncryptFile kelas harus memiliki tiga parameter berikut:
    • sInputFilename
    • sOutputFilename
    • sKey (Kunci rahasia yang digunakan untuk mengenkripsi dan mendekripsi berkas.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. Dalam EncryptFile prosedur, membuat input FileStream objek dan output FileStream objek. Objek ini dapat dibaca dari dan ditulis ke target file.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Menyatakan contoh DESCryptoServiceProvider kelas. Ini mewakili enkripsi sebenarnya dan sebenarnya dekripsi teknologi yang digunakan pada file. Pada titik ini, Anda dapat membuat penyedia berbeda jika Anda memilih untuk menggunakan RSAsecutiry atau lain kriptografi teknik.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Penyedia kriptografi harus disediakan dengan Anda kunci rahasia sebagai array byte. The System.text namespace menyediakan fungsi yang bernama GetBytes(). Sebagai bagian dari fitur encoding, GetBytes() fungsi mengambil tali, dan kemudian mengembalikan array byte. The ukuran tombol berbeda untuk setiap teknik kriptografi. Sebagai contoh, Data Encryption Standard (DES) mengambil 64-bit kunci yang sama dengan 8 byte atau untuk 8 karakter.

    Jika Anda tidak memberikan kunci, penyedia secara acak menghasilkan satu. Ini berhasil mengenkripsi file, tetapi ada cara untuk mendekripsi berkas. Catatan bahwa Anda juga harus memberikan vektor inisialisasi (IV). nilai ini digunakan sebagai bagian dari enkripsi. Seperti tombol, IV adalah acak yang dihasilkan jika Anda tidak memberikan nilai. Karena nilai-nilai harus yang sama untuk enkripsi dan dekripsi, Anda harus mengizinkan acak generasi dari nilai-nilai ini.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Membuat sebuah instance dari CryptoStream kelas dengan menggunakan penyedia kriptografi untuk mendapatkan enkripsi objek)CreateEncryptor) dan output ada FileStream objek sebagai bagian dari konstruktor.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Membaca di input file, dan kemudian menulis output file. Melewati CryptoStream objek di mana file telah dienkripsi dengan menggunakan tombol yang Anda disediakan.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Mendekripsi berkas

Untuk mendekripsi berkas, ikuti langkah berikut:
  1. Menciptakan metode, dan kemudian nama ituDecryptFile. Proses dekripsi mirip proses enkripsi, namun, DecryptFile prosedur memiliki dua perbedaan utama dari EncryptFile prosedur.
    • CreateDecryptor digunakan sebagai pengganti CreateEncryptor untuk membuat CryptoStream objek, yang menentukan cara objek dapat digunakan.
    • Ketika teks didekripsi ditulis ke tujuan file, CryptoStream objek sekarang adalah sumber bukan tujuan streaming.
    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. Tambahkan baris berikut ke Main() prosedur untuk memanggil kedua EncryptFile dan 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. Simpan berkas tersebut. Menjalankan aplikasi Anda. Pastikan bahwa jalan yang digunakan untuk nama input file poin untuk yang sudah ada file.

Menguji prosedur

Menguji kode ini dengan file teks (.txt) untuk mengkonfirmasi bahwa kode dienkripsi dan didekripsi file dengan benar. Pastikan bahwa Anda mendekripsi berkas untuk file baru (seperti dalam Main() prosedur dalam artikel ini) bukan ke file asli. Memeriksa dekripsi file, dan kemudian membandingkannya dengan file asli.

Daftar kode lengkap

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

REFERENSI

Untuk informasi lebih lanjut tentang kriptografi, dan tentang menggunakan kriptografi fitur.NET, melihat situs-situs Website MSDN berikut:
System.Security.cryptography namespace
http://MSDN.Microsoft.com/Library/default.asp?URL=/Library/en-US/cpref/HTML/frlrfsystemsecuritycryptography.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptography.asp)
Microsoft.NET Framework Developer Center
http://msdn2.Microsoft.com/en-US/netframework/default.aspx (http://msdn2.microsoft.com/en-us/netframework/default.aspx)
Untuk lebih banyak informasi umum tentang Visual C#.NET, lihat newsgroup Usenet berikut:
Microsoft.Public.DotNet.Languages.CSharp (http://go.microsoft.com/fwlink/?linkid=5217)

Berlaku bagi:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Kata kunci: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:307010  (http://support.microsoft.com/kb/307010/en-us/ )