Como encriptar e desencriptar um ficheiro utilizando o Visual Basic .NET ou Visual Basic 2005

Traduções de Artigos Traduções de Artigos
Artigo: 301070 - Ver produtos para os quais este artigo se aplica.
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 307010.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo descreve como utilizar as classes de criptografia que são fornecidas pelo Microsoft .NET Framework. Pode utilizar as classes de criptografia para encriptar um ficheiro de texto para um estado ilegível. Em seguida, pode desencriptar esse ficheiro de texto para o formato original.



Requisitos

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

Utilizar a encriptação e desencriptação

O espaço de nomes System.Security.Cryptographic no .NET Framework fornece uma variedade de ferramentas para ajudar a encriptação e desencriptação. A classe CryptoStream é uma das muitas classes que é fornecida. A classe CryptoStream foi concebida para encriptar e desencriptar o conteúdo, esse conteúdo transmitido em sequência sem um ficheiro.

Para encriptar um ficheiro, siga estes passos:
  1. Execução Visual Studio .NET ou Visual Studio 2005.
  2. Criar uma nova aplicação de consola no Visual Basic .NET ou no Visual Basic 2005. Um módulo é criado, juntamente com um procedimento Main() vazio.
  3. Utilize a instrução importa no espaço de nomes de sistema, o espaço de nomes System.Security, o espaço de nomes System.Security.Cryptography, o espaço de nomes System.Text e o espaço de nomes System.IO. Terá de o fazer para que o não tenham que qualificar declarações destes espaços de nomes mais tarde no código. Tem de utilizar estas instruções antes de quaisquer outras declarações.
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Runtime.InteropServices
    Imports System.Text
    					
  4. Gera uma chave secreta para encriptar e desencriptar os dados. A classe DESCryptoServiceProvider baseia-se um algoritmo de encriptação simétrica. A encriptação simétrica requer uma chave e um vector de inicialização (IV) para encriptar os dados. Para desencriptar os dados, tem de ter a mesma chave e o mesmo IV. Também tem de utilizar o mesmo algoritmo de encriptação. É possível gerar as chaves utilizando um dos seguintes métodos:
    • método 1 Pode pedir ao utilizador uma palavra-passe. Em seguida, utilize a palavra-passe como a chave e a IV.
    • método 2 Quando 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. Pode utilizar a chave e IV gerados pelo gerido simétricas criptográficas classes para encriptar e desencriptar o ficheiro.

      Para obter mais informações sobre como gerar e distribuir chaves, visite o seguinte Web site da Microsoft ou consulte a documentação do .NET Framework software development 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 indicado 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 chama EncryptFile . O método EncryptFile tem de ter três parâmetros:
    • sInputFile
    • sOutputFile
    • sKey (Esta é a chave secreta que é utilizada para encriptar e desencriptar o ficheiro.)
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
    					
  7. Procedimento EncryptFile , criar um objecto de FileStream entrado e saída de uma objecto de FileStream . Estes objectos podem ser lida a partir e escritos os ficheiros 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 . Isto representa a encriptação real e a tecnologia de desencriptação real utilizada nos ficheiros. Neste ponto, pode criar um fornecedor diferente se pretender utilizar RSA segurança ou outra técnica criptográfica.
    Dim DES As New DESCryptoServiceProvider()
    					
  9. Fornecedor criptográfico tem de ser fornecido com a chave secreta como uma matriz de bytes. O espaço de nomes System.Text fornece uma função que é denominada GetBytes() . Como parte das respectivas funcionalidades codificação, a função de GetBytes() assume uma cadeia e, em seguida, devolve uma matriz de bytes. O tamanho da chave é diferente para cada técnica criptográfica. Por exemplo, DES (Data Encryption Standard) tem uma chave de 64 bits que é igual para 8 bytes ou caracteres de 8.

    Se não fornecer uma chave, o fornecedor aleatoriamente gera um. Isto encripta o ficheiro com êxito, mas não existe nenhum método para desencriptar o ficheiro. Tenha em atenção que também tem de fornecer a IV. Este valor é utilizado como parte da encriptação. Como a chave de IV é gerado aleatoriamente se não fornecer o valor. Porque os valores tem de ser iguais para a encriptação e a desencriptação, não deve permitir aleatória geração destes valores.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    					
  10. Crie uma instância da classe CryptoStream . Utilizar o fornecedor criptográfico para obter um objecto de encriptação ( CreateEncryptor ) e os existentes saída FileStream objecto como parte do construtor.
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
    					
  11. Leia no ficheiro de entrada e, em seguida, escrever no ficheiro de saída. Passar o objecto CryptoStream onde o ficheiro está encriptado com a chave que forneceu.
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    					
Para desencriptar um ficheiro, siga estes passos:
  1. Crie um método denominado DecryptFile . O processo de desencriptação é semelhante ao processo de encriptação. No entanto, DecryptFile tem duas diferenças chaves do procedimento EncryptFile .
    • CreateDecryptor é utilizado em vez de CreateEncryptor para criar o objecto CryptoStream que especifica como o objecto pode ser utilizado.
    • Quando o texto desencriptado é escrito no ficheiro de destino, o objecto CryptoStream agora é a origem em vez da sequência 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() chamar tanto EncryptFile 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. Guarde o ficheiro. Execute a aplicação. Certifique-se que o caminho que é utilizado o nome de ficheiro de entrada aponta para um existente e um ficheiro não importante.

Certifique-se que a encriptação e a desencriptação funcionar

Teste este código com um ficheiro de texto (.txt) para confirmar que o ficheiro está correctamente encriptado e desencriptado. Certifique-se de que desencriptar o ficheiro para um novo ficheiro (como no procedimento Sub Main() neste artigo) em vez de ao ficheiro original. Examine o ficheiro desencriptado e compare o ficheiro desencriptado do 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 utilizar as funcionalidades criptográficas do .NET e criptografia, visite os seguintes Web sites da Microsoft:

http://msdn.microsoft.com/net

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

Propriedades

Artigo: 301070 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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