Artigo: 307010 - Última revisão: quarta-feira, 27 de Dezembro de 2006 - Revisão: 7.5

Como encriptar e desencriptar um ficheiro utilizando o Visual C#

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 301070  (http://support.microsoft.com/kb/301070/ ) .
Este artigo faz referência à seguinte Microsoft .NET Framework Class Library espaços de nomes:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Nota Este artigo não se aplica para o Microsoft .NET Framework 2.0.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve como utilizar as classes de criptografia que são fornecidos pelo Microsoft .NET Framework para encriptar um texto do ficheiro para um estado Ilegível e, em seguida, para desencriptar esse ficheiro de texto novamente para o seu formato original.

Requisitos

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

Encriptação e desencriptação

O espaço de nomes System.Security.Cryptographic no Microsoft .NET Framework fornece uma variedade de ferramentas para o ajudar com 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 à medida que é transmitido em sequência fora para um ficheiro.

Encriptar um ficheiro

Para encriptar um ficheiro, siga estes passos:
  1. Inicie o Visual Studio .NET ou o Visual Studio 2005.
  2. Clique em Visual C# em projectos e clique em Aplicação de consola em modelos . O Visual C# .NET cria uma classe estática , juntamente com um procedimento Main() vazio.
  3. Utilize a instrução a utilizar (como indicado no código de exemplo que se segue) em espaços de nomes seguintes:
    • sistema
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    para que não tenham de qualificar as declarações destes espaços de nomes mais tarde no código. Tem de utilizar estas instruções antes de qualquer outros declarações
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Gera uma chave secreta para encriptar e desencriptar os dados. 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 IV são criados automaticamente para a sessão. Utilize a chave pública e IV geradas pelo gerido simétricas criptográficas classes para encriptar e desencriptar o ficheiro.

      Para mais informações sobre como gerar e distribuir chaves, consulte a documentação do Microsoft .NET Framework SDK ou consulte o seguinte Web site da Microsoft Developer Network (MSDN):
      Geração de chaves de encriptação e desencriptação
      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp)
  5. Adicione a seguinte função para gerar uma nova chave para uma sessão (tal como indicado no método 2 do passo 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. Crie um método na sua classe chama EncryptFile . A classe EncryptFile tem de ter os seguintes três parâmetros:
    • sInputFilename
    • sOutputFilename
    • sKey (A chave secreta que é utilizada para encriptar e desencriptar o ficheiro.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  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 a ficheiros de destino.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = 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 preferir utilizar RSAsecutiry ou técnica criptográfica noutra.
    DESCryptoServiceProvider DES = 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 GetBytes() tem 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 deve fornecer o vector de inicialização (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 ter o mesmo para a encriptação e a desencriptação, não deve permitir aleatória geração estes valores.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Crie uma instância da classe CryptoStream utilizando o fornecedor criptográfico para obter um objecto de encriptação ( CreateEncryptor ) e os existentes saída FileStream objecto como parte do construtor.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = 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.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Desencriptar um ficheiro

Para desencriptar um ficheiro, siga estes passos:
  1. Criar um método e atribua o nome DecryptFile . O processo de desencriptação é semelhante ao processo de encriptação, no entanto, o procedimento 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.
    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. Adicione as seguintes linhas ao procedimento Main() chamar tanto EncryptFile 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. Guarde o ficheiro. Execute a aplicação. Certifique-se de que o caminho que é utilizado o nome de ficheiro de entrada aponta para um ficheiro existente.

Testar o procedimento

Teste este código com um ficheiro de texto (.txt) para confirmar que o código de encriptar e desencriptar o ficheiro correctamente. Certifique-se de que desencriptar o ficheiro para um novo ficheiro (como no procedimento Main() neste artigo) em vez de ao ficheiro original. Examine o ficheiro desencriptado e, em seguida, compará-la para o ficheiro original.

Listagem de código completo

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();
      }
   }
}

Referências

Para mais informações sobre criptografia e sobre como utilizar as funcionalidades criptográficas do. NET, consulte os seguintes Web sites da MSDN:
Espaço de nomes System.Security.Cryptography
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptography.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptography.asp)
Microsoft .NET Framework Developer Center
http://msdn2.microsoft.com/en-us/netframework/default.aspx (http://msdn2.microsoft.com/en-us/netframework/default.aspx)
Para obter informações mais gerais sobre Visual C#. NET, consulte a newsgroups Usenet seguinte:
microsoft.public.dotnet.languages.csharp (http://go.microsoft.com/fwlink/?linkid=5217)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbsecurity kbio kbcrypt kbhowtomaster KB307010 KbMtpt
Tradução automáticaTraduçã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: 307010  (http://support.microsoft.com/kb/307010/en-us/ )