如何加密和解密檔案使用 Visual Basic.NET 或 Visual Basic 2005

文章翻譯 文章翻譯
文章編號: 301070 - 檢視此文章適用的產品。
本文章的有 Microsoft Visual C#.NET] 版本請參閱 307010
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,如何使用密碼編譯類別所提供的 Microsoft.NET Framework。您可以使用密碼編譯類別來加密文字檔案無法讀取的狀態。然後,您可以解密該回到其原始格式的文字檔。



需求

下列清單列出建議的硬體、 軟體、 網路基礎結構和您必須擁有 Service Pack:
  • Microsoft Windows XP、 Microsoft Windows Server 2003,Microsoft Windows 2000 專業版 Microsoft Windows 2000 Server Microsoft Windows 2000 進階伺服器或 Microsoft Windows NT 4.0 伺服器
  • Microsoft Visual Studio.NET 或 Microsoft Visual Studio 2005

使用加密和解密

System.Security.Cryptographic 命名空間,在.NET Framework 提供各種工具來幫助在加密和解密。CryptoStream 類別是許多類別所提供的其中之一。CryptoStream 類別被設計來加密或解密內容,如在傳送到檔案的內容串流出。

如果要加密檔案,請依照下列步驟執行:
  1. 執行 Visual Studio.NET 或 Visual Studio 2005。
  2. 在 Visual Basic.NET 或 Visual Basic 2005 中,請建立新的主控台應用程式。模組為您建立,搭配一個空的 Main () 程序。
  3. System 命名空間、 System.Security 命名空間、 System.Security.Cryptography 命名空間、 System.Text] 命名空間和 System.IO 命名空間上使用 Imports 陳述式。因此,您就不需限定這些命名空間在稍後的程式碼中的宣告,您必須進行這個動作。您必須使用這些陳述式,在任何其他宣告之前
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Runtime.InteropServices
    Imports System.Text
    					
  4. 產生一個秘密金鑰來加密和解密資料。 DESCryptoServiceProvider 類別是以對稱式加密演算法為基礎。對稱加密需要金鑰和初始化向量 (IV) 來加密資料。若要為資料的解密您必須相同的金鑰及相同的 IV。您也必須使用相同的加密演算法。您可以使用下列方法之一來產生金鑰:
    • 方法 1您可以提示使用者輸入密碼。然後,使用密碼金鑰和 IV。
    • 方法 2當您建立對稱密碼編譯類別的新執行個體時,新的金鑰和新的 IV 會自動建立工作階段。您可以使用索引鍵及受管理之對稱密碼編譯類別來加密和解密檔案所產生的 IV。

      如需有關如何產生和散佈金鑰,請造訪下列 Microsoft 網站,或參閱.NET Framework 軟體開發套件 (SDK) 文件的詳細資訊:

      http://msdn.microsoft.com/en-us/library/5e9ft273(VS.71).aspx
  5. 加入下列函式,如在方法 2 中記下的工作階段產生新的金鑰:
       ' Call this function to remove the key from memory after it is used for security.
       Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" _
                         (ByVal Destination As String, ByVal Length As Integer)
       
       ' Function to generate a key.
       Function GenerateKey() As String
          ' Create an instance of Symmetric Algorithm. The key and the IV are generated automatically.
          Dim desCrypto As DESCryptoServiceProvider = DESCryptoServiceProvider.Create()
    
          ' Use the automatically generated key for encryption. 
          Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)
       End Function 
  6. 在您的類別中名為 EncryptFile 建立方法。EncryptFile 方法必須有三個參數:
    • sInputFile
    • sOutputFile
    • sKey(這是秘密提示用來加密和解密檔案的索引鍵)。
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
    					
  7. EncryptFile] 程序中建立輸入的 FileStream 物件和一個輸出 FileStream 物件。這些物件可以讀取和寫入至目標檔案
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
    					
  8. 宣告 DESCryptoServiceProvider 類別的執行個體。這表示實際的加密和實際的解密技術用在檔案上。如果您想要使用 RSA 安全性或另一個密碼編譯技術您可以在此時建立不同的提供者
    Dim DES As 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),和現存的輸出 FileStream 物件建構函式的一部份
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
    					
  11. 在輸入檔中讀取,並再將寫出至輸出檔。通過 CryptoStream 物件檔案加密使用您所提供的索引鍵的地方
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    					
如果要解密檔案,請依照下列步驟執行:
  1. 建立名為 DecryptFile 的方法。解密程序很類似加密程序。 不過,DecryptFile 有兩個主要的差異,從 EncryptFile 程序。
    • CreateDecryptor 代替 CreateEncryptor 用以建立指定物件所能使用 [CryptoStream 物件。
    • 解密後的文字寫入目的地檔案時, CryptoStream 物件現在是而不是目的資料流的來源。
    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)
    
        Dim DES As New DESCryptoServiceProvider()
        'A 64-bit key and an IV are 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.
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'Create a DES Decryptor from your DES instance.
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        'Create a crypto stream set to read and to do a DES decryption transform on incoming bytes.
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        'Print out the contents of the decrypted file.
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub
    					
  2. 將下列幾行加入至 Main () 程序,以呼叫 EncryptFileDecryptFile
        Public Sub Main()      'Must be 64 bits, 8 bytes.
          Dim sSecretKey As String
    
          ' Get the key for the file to encrypt.
          ' You can distribute this key to the user who will decrypt the file.
          sSecretKey = GenerateKey()
    
          ' For additional security, pin the key.
          Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)
    
    
          ' Encrypt the file.        
          EncryptFile("%USERPROFILE%\MyData.txt", _
                          "%USERPROFILE%\Encrypted.txt", _
                          sSecretKey)
    
          ' Decrypt the file.
          DecryptFile("%USERPROFILE%\Encrypted.txt", _
                      "%USERPROFILE%\Decrypted.txt", _
                      sSecretKey)
    
          ' Remove the key from memory.
          ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2)
          gch.Free()
       End Sub
  3. 儲存檔案。執行您的應用程式。請確定用於輸入的檔案名稱的路徑指向現有的和不重要的檔案。

請確認加密和解密工作

測試此程式碼與文字 (.txt) 檔案,以確認檔案正確地加密並解密。請確定您是將檔案解密解密至新的檔案 (如本文章中 Sub Main () 程序) 而不是原始檔。 檢查解密的檔案,並比較原始解密的檔案。

完整的程式碼清單

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Runtime.InteropServices
Imports System.Text


Module Module1

   ' Call this function to remove the key from memory after it is used for security.
   <DllImport("kernel32.dll")> _
   Public Sub ZeroMemory(ByVal addr As IntPtr, ByVal size As Integer)
   End Sub

   ' Function to generate a 64-bit key.
   Function GenerateKey() As String
      ' Create an instance of a symmetric algorithm. The key and the IV are generated automatically.
      Dim desCrypto As DESCryptoServiceProvider = DESCryptoServiceProvider.Create()

      ' Use the automatically generated key for encryption. 
      Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)

   End Function

   Sub EncryptFile(ByVal sInputFilename As String, _
                  ByVal sOutputFilename As String, _
                  ByVal sKey As String)

      Dim fsInput As New FileStream(sInputFilename, _
                                  FileMode.Open, FileAccess.Read)
      Dim fsEncrypted As New FileStream(sOutputFilename, _
                                  FileMode.Create, FileAccess.Write)

      Dim DES As New DESCryptoServiceProvider()

      'Set secret key for DES algorithm.
      'A 64-bit key and an IV are required for this provider.
      DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

      'Set the initialization vector.
      DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

      'Create the DES encryptor from this instance.
      Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
      'Create the crypto stream that transforms the file stream by using DES encryption.
      Dim cryptostream As New CryptoStream(fsEncrypted, _
                                          desencrypt, _
                                          CryptoStreamMode.Write)

      'Read the file text to the byte array.
      Dim bytearrayinput(fsInput.Length - 1) As Byte
      fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
      'Write out the DES encrypted file.
      cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
      cryptostream.Close()
   End Sub

   Sub DecryptFile(ByVal sInputFilename As String, _
       ByVal sOutputFilename As String, _
       ByVal sKey As String)

      Dim DES As New DESCryptoServiceProvider()
      'A 64-bit key and an IV are required for this provider.
      'Set the secret key for the DES algorithm.
      DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
      'Set the initialization vector.
      DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

      'Create the file stream to read the encrypted file back.
      Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
      'Create the DES decryptor from the DES instance.
      Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
      'Create the crypto stream set to read and to do a DES decryption transform on incoming bytes.
      Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
      'Print out the contents of the decrypted file.
      Dim fsDecrypted As New StreamWriter(sOutputFilename)
      fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
      fsDecrypted.Flush()
      fsDecrypted.Close()
   End Sub

   Public Sub Main()
      'Must be 64 bits, 8 bytes.
      Dim sSecretKey As String

      ' Get the key for the file to encrypt.
      ' You can distribute this key to the user who will decrypt the file.
      sSecretKey = GenerateKey()

      ' For additional security, pin the key.
      Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)


      ' Encrypt the file.        
      EncryptFile("%USERPROFILE%\MyData.txt", _
                      "%USERPROFILE%\Encrypted.txt", _
                      sSecretKey)

      ' Decrypt the file.
      DecryptFile("%USERPROFILE%\Encrypted.txt", _
                  "%USERPROFILE%\Decrypted.txt", _
                  sSecretKey)

      ' Remove the key from memory. 
      ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2)
      gch.Free()
   End Sub

End Module

?考

如需有關如何使用.NET 的密碼編譯功能,以及關於密碼編譯的詳細資訊,請造訪下列 Microsoft 網站:

http://msdn.microsoft.com/net

http://code.msdn.microsoft.com/

屬性

文章編號: 301070 - 上次校閱: 2006年12月6日 - 版次: 5.6
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbmt kbvs2005swept kbvs2005applies kbsecurity kbio kbcrypt kbhowtomaster KB301070 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:301070
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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