Cara mengenkripsi dan mendekripsi berkas dengan menggunakan Visual C#

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 307010 - Melihat produk di mana artikel ini berlaku.
Untuk versi Microsoft Visual Basic .NET artikel ini, lihat 301070.
Artikel ini merujuk kepada berikut Microsoft .NET Ruang-nama perpustakaan kelas kerangka:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Catatan Artikel ini tidak sahih untuk Microsoft .NET Framework 2.0.
Perbesar semua | Perkecil semua

Pada Halaman ini

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 tersebut kembali ke aslinya format.

Persyaratan

Daftar berikut menguraikan fitur peranti penangkap keras, peranti penangkap lunak, infrastruktur jaringan, dan Service Pack yang Anda harus memiliki:
  • 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

Namespace System.Security.Cryptographic di Microsoft .NET Framework menyediakan berbagai alat untuk membantu Anda dengan enkripsi dan dekripsi. Kelas CryptoStream adalah salah satu dari banyak kelas yang disediakan. Kelas CryptoStream 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 Template. Visual C# .NET menciptakan kelas statis untuk Anda, bersama dengan prosedur Main() kosong.
  3. Menggunakan 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 lainnya Deklarasi.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Menghasilkan bukti kunci rahasia untuk mengenkripsi dan mendekripsi data. DESCryptoServiceProvider didasarkan pada algoritma enkripsi simetris. Simetris enkripsi memerlukan bukti kunci dan vektor inisialisasi (IV) untuk mengenkripsi data. Untuk mendekripsi data, Anda harus memiliki tombol tekan yang sama dan IV yang sama. Anda harus juga menggunakan algoritma enkripsi yang sama. Anda dapat menghasilkan bukti kunci dengan menggunakan salah satu metode berikut:
    • Metode 1 Anda dapat meminta pengguna untuk password. Kemudian, gunakan password sebagai bukti kunci dan IV.
    • Metode 2 Bila Anda membuat contoh baru dari simetris kriptografi kelas, bukti kunci baru dan IV otomatis diciptakan untuk sesi. Penggunaan bukti kunci dan IV yang dihasilkan oleh kelas kriptografi simetrik dikelola untuk mengenkripsi dan mendekripsi berkas.

      Untuk selengkapnya tentang cara menghasilkan dan mendistribusikan bukti kunci, lihat Microsoft .NET Framework SDK Dokumentasi, atau lihat Web Microsoft Developer Network (MSDN) berikut situs:
      Menghasilkan bukti kunci untuk enkripsi dan dekripsi
  5. Tambahkan fungsi berikut untuk menghasilkan sebuah bukti 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. Kelas EncryptFile 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 prosedur EncryptFile , membuat objek FileStream input dan output objek FileStream . 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 sebuah instance dari kelas DESCryptoServiceProvider . Ini mewakili enkripsi aktual dan aktual 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 bukti kunci rahasia sebagai array byte. System.Text namespace menyediakan fungsi yang bernama GetBytes(). Sebagai bagian dari fitur encoding, fungsi GetBytes() mengambil tali, dan kemudian gulung balik array byte. The ukuran bukti kunci berbeda untuk masing-masing teknik kriptografi. Misalnya, Standar Enkripsi Data (DES) mengambil 64-bit bukti kunci yang sama dengan 8 byte atau untuk 8 karakter.

    Jika Anda tidak memberikan bukti kunci, penyedia secara acak menghasilkan satu. Ini berhasil mengenkripsi file, tetapi ada cara untuk mendekripsi berkas. Catatan bahwa Anda juga harus memberikan inisiasi vektor (IV). nilai ini digunakan sebagai bagian dari enkripsi. Seperti bukti kunci, 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 nilai-nilai ini.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Membuat sebuah instance dari kelas CryptoStream menggunakan penyedia kriptografi untuk memperoleh enkripsi objek (CreateEncryptor) dan yang ada output objek FileStream sebagai bagian dari konstruktor.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Membaca di input file, dan kemudian menulis ke output file. Melewati objek CryptoStream mana file telah dienkripsi dengan menggunakan tombol tekan 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, prosedur DecryptFile memiliki dua perbedaan utama dari prosedur EncryptFile .
    • CreateDecryptor digunakan sebagai pengganti CreateEncryptor membuat CryptoStream obyek, yang menentukan bagaimana objek dapat digunakan.
    • Ketika teks didekripsi ditulis ke tujuan file, objek CryptoStream sekarang adalah sumber bukan tujuan Stream.
    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 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 file. Menjalankan aplikasi Anda. Pastikan bahwa path 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 prosedur Main() dalam artikel ini) bukan berkas 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 menggunakan fitur kriptografi .NET, lihat Website MSDN berikut:
System.Security.Cryptography namespace
Pusat Pengembang Framework .NET Microsoft

Properti

ID Artikel: 307010 - Kajian Terakhir: 15 November 2012 - Revisi: 4.0
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 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

Berikan Masukan

 

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