如何加密和解密使用 Visual Basic.net 或 Visual Basic 2005 的文件

文章翻译 文章翻译
文章编号: 301070 - 查看本文应用于的产品
为这篇文章的一个 Microsoft Visual C#.net 版本,请参阅 307010
展开全部 | 关闭全部

本文内容

概要

本文介绍如何使用所提供的 Microsoft.net 框架的加密类。您可以使用加密类来加密为不可读状态的文本文件。然后,您可以解密回到其原始格式的文本文件。



要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包所必需的:
  • Windows XP、 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

使用加密和解密

在.net 框架中,System.Security.Cryptographic 命名空间提供了多种工具来帮助在加密和解密。CryptoStream 类是一个提供的许多类。CryptoStream 类旨在对进行加密或解密内容,因为该内容出流式传输到一个文件。

若要对一个文件,请按照下列步骤操作:
  1. 运行 Visual Studio.net 或 Visual Studio 2005。
  2. 在 Visual Basic.net 中或 Visual Basic 2005 中,请创建一个新的控制台应用程序。为您,创建一个模块连同一个空的 main () 过程。
  3. 使用 Imports 语句上 System 命名空间、 System.Security 命名空间、 System.Security.Cryptography 命名空间、 System.Text 命名空间和 System.IO 命名空间。这样您不必非要限定从更高版本在代码中的这些命名空间的声明,您必须执行此操作。您必须使用这些语句在任何其他声明之前
    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 框架软件开发工具包 (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 过程中创建一个输入的 发现 对象和一个输出 发现 对象。这些对象可以读取和写入目标文件
            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) 将等于 8 个字节或 8 个字符的 64 位密钥。

    如果没有提供键,提供程序随机生成一个。这可以成功地加密文件,但没有方法来解密该文件。请注意您还必须提供将 IV。此值用作加密的一部分。像键,如果没有提供值是随机生成 IV。因为这些值必须是相同的加密和解密,您必须不允许随机生成的这些值
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    					
  10. 创建 CryptoStream 类的实例。获取一个加密对象 (CreateEncryptor) 使用加密提供程序和现有的构造函数的一部分输出 发现 的对象
    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 过程的两个主要区别。
    • CreateDecryptorCreateEncryptor 而不用于创建 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 标准版
  • Microsoft Visual .NET 2002 标准版
关键字:?
kbmt kbvs2005swept kbvs2005applies kbsecurity kbio kbcrypt kbhowtomaster KB301070 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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