Como criptografar e descriptografar um arquivo usando o Visual Basic .NET ou Visual Basic 2005

Traduções deste artigo Traduções deste artigo
ID do artigo: 301070 - Exibir os produtos aos quais esse artigo se aplica.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 307010.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve como usar as classes de criptografia que são fornecidas pelo Microsoft .NET Framework. Você pode usar as classes de criptografia para criptografar um arquivo de texto para um estado ilegível. Em seguida, você pode descriptografar esse arquivo de texto volta para o seu formato original.



Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você deve ter:
  • Microsoft Windows XP, Microsoft Windows Server 2003, Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server ou Microsoft Windows NT 4.0 Server
  • Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005

Usar criptografia e descriptografia

O namespace System.Security.Cryptographic no .NET Framework fornece uma variedade de ferramentas para ajudar em criptografia e descriptografia. A classe CryptoStream é uma das muitas classes que é fornecido. A classe CryptoStream é projetada para criptografar ou descriptografar o conteúdo como esse conteúdo é transmitido check-out para um arquivo.

Para criptografar um arquivo, execute estas etapas:
  1. Execução Visual Studio .NET ou Visual Studio 2005.
  2. Crie um novo aplicativo de console no Visual Basic .NET ou em Visual Basic 2005. Um módulo é criado para você, juntamente com um procedimento vazio Main() .
  3. Use a declaração Imports no namespace System, o espaço para nome System.Security, espaço para nome System.Security.Cryptography, o namespace System.Text e namespace System.IO. Você deve fazer isso para que não seja necessário que qualificar declarações desses namespaces posteriormente no seu código. Você deve usar estas instruções antes de qualquer outra declaração.
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Runtime.InteropServices
    Imports System.Text
    					
  4. Gere uma chave secreta para criptografar e descriptografar os dados. A classe DESCryptoServiceProvider é baseada em um algoritmo de criptografia simétrica. A criptografia simétrica requer uma chave e um vetor de inicialização (IV) para criptografar os dados. Para descriptografar os dados, você deve ter a mesma chave e o mesmo IV. Você também deve usar o mesmo algoritmo de criptografia. Você pode gerar as chaves usando um dos seguintes métodos:
    • método 1 Você pode solicitar ao usuário uma senha. Em seguida, use a senha como a chave e o IV.
    • método 2 Quando você cria uma nova instância das classes de criptografia simétricas, uma nova chave e um novo IV são criados automaticamente para a sessão. Você pode usar a chave e o IV são gerados pelas simétricas criptografia classes gerenciadas para criptografar e descriptografar o arquivo.

      Para obter mais informações sobre como gerar e distribuir chaves, visite o seguinte site ou consulte a documentação do .NET Framework software desenvolvimento kit (SDK):

      http://msdn.microsoft.com/en-us/library/5e9ft273(VS.71).aspx
  5. Adicione a seguinte função para gerar uma nova chave para uma sessão conforme observado no método 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. Crie um método na sua classe será EncryptFile . O método EncryptFile deve ter três parâmetros:
    • sInputFile
    • sOutputFile
    • sKey (Isso é a chave secreta que é usada para criptografar e descriptografar o arquivo.)
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
    					
  7. No procedimento EncryptFile , crie um objeto FileStream de entrada e uma saída objeto FileStream . Esses objetos podem ser lidos a partir e gravados os arquivos de destino.
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
    					
  8. Declare uma instância da classe DESCryptoServiceProvider . Isso representa a criptografia real e a tecnologia de descriptografia real que é usada nos arquivos. Neste ponto, você pode criar um provedor diferente se você deseja usar outra técnica de criptografia de segurança do RSA ou.
    Dim DES As New DESCryptoServiceProvider()
    					
  9. O provedor de criptografia deve ser fornecido com a chave secreta como uma matriz de bytes. O namespace System.Text fornece uma função que é chamada GetBytes() . Como parte de seus recursos de codificação, a função GetBytes() leva uma seqüência de caracteres e retorna uma matriz de bytes. O tamanho da chave é diferente para cada técnica de criptografia. Por exemplo, o padrão de criptografia de dados (DES) tem uma chave de 64 bits que é igual a 8 bytes ou 8 caracteres.

    Se você não fornecer uma chave, o provedor gera aleatoriamente um. Isso criptografa o arquivo com êxito, mas não há nenhuma maneira para descriptografar o arquivo. Observe que você também deve fornecer o IV. Esse valor é usado como parte da criptografia. Como a chave, o IV é gerado aleatoriamente se você não fornecer o valor. Como os valores devem ser as mesmas para a criptografia e a descriptografia, você não deve permitir geração aleatória desses valores.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    					
  10. Crie uma instância da classe CryptoStream . Usar o provedor criptográfico para obter um objeto com criptografia ( CreateEncryptor ) e o existente saída objeto FileStream como parte do construtor.
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
    					
  11. Leia no arquivo de entrada e, em seguida, gravar no arquivo de saída. Passar o objeto CryptoStream onde o arquivo está criptografado usando a chave que você forneceu.
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    					
Para descriptografar um arquivo, execute estas etapas:
  1. Crie um método chamado DecryptFile . O processo de descriptografia é semelhante ao processo de criptografia. No entanto, DecryptFile tem duas diferenças chaves do procedimento EncryptFile .
    • CreateDecryptor é usado em vez de CreateEncryptor para criar o objeto CryptoStream que especifica como o objeto pode ser usado.
    • Quando o texto descriptografado é gravado no arquivo de destino, o objeto CryptoStream agora é a fonte em vez do fluxo de destino.
    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. Adicione as seguintes linhas ao procedimento Main() para chamar EncryptFile e DecryptFile .
        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. Salve o arquivo. Execute o aplicativo. Certifique-se que o caminho que é usado para o nome do arquivo de entrada aponta para um existente e um arquivo não importante.

Verifique se que a criptografia e a descriptografia funcionar

Teste esse código com um arquivo de texto (.txt) para confirmar que o arquivo é criptografado e descriptografado corretamente. Certifique-se de que você descriptografa o arquivo para um novo arquivo (como no procedimento Sub Main() neste artigo) em vez de para o arquivo original. Examine o arquivo descriptografado e compare o arquivo descriptografado ao original.

Uma lista completa de código

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

Referências

Para obter mais informações sobre como usar os recursos de criptografia do .NET e sobre criptografia, visite os seguintes sites:

http://msdn.microsoft.com/net

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

Propriedades

ID do artigo: 301070 - Última revisão: quarta-feira, 6 de dezembro de 2006 - Revisão: 5.6
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbvs2005swept kbvs2005applies kbsecurity kbio kbcrypt kbhowtomaster KB301070 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 301070

Submeter comentários

 

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