Como criptografar e descriptografar um arquivo usando o Visual C#

Traduções deste artigo Traduções deste artigo
ID do artigo: 307010 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi publicado anteriormente em BR307010
Para obter uma versão deste artigo do Microsoft Visual Basic .NET, consulte 301070.
Este artigo refere-se para o Microsoft .NET a seguir Namespaces da biblioteca de classes do Framework:
  • System. IO
  • System. Security
  • System.Security.Cryptography
Observação Este artigo não se aplica para o Microsoft.NET Framework 2.0.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve como usar as classes de criptografia que são fornecidos com o Microsoft.NET Framework para criptografar um arquivo de texto para um estado ilegível e, em seguida, descriptografar esse arquivo de texto volta para seu original formato.

Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você deve 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 Microsoft Visual Studio .NET

Criptografia e descriptografia

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

Criptografar um arquivo

Para criptografar um arquivo, execute estas etapas:
  1. Inicie o Visual Studio 2005 ou Visual Studio .NET.
  2. Clique em O Visual C# emProjetose, em seguida, clique em Aplicativo de consoleem Modelos. O Visual C# .NET cria uma classe estática para você, juntamente com um procedimento Main () vazio.
  3. Usar a instrução using (conforme indicado no código de exemplo que segue) sobre o namespaces a seguir:
    • Sistema
    • System. Security
    • System.Security.Cryptography
    • System. Text
    • System. IO
    para que você não precise qualificar declarações dos seguintes espaços para nome posteriormente no seu código. Você deve usar estas instruções antes de qualquer outro declarações.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Gere uma chave secreta para criptografar e descriptografar os dados. O DESCryptoServiceProvider é baseado em um algoritmo de criptografia simétrica. A simétrica a criptografia requer uma chave e um vetor de inicialização (IV) para criptografar o dados. Para descriptografar os dados, você deve ter a mesma chave e o mesmo IV. Você deve também use o mesmo algoritmo de criptografia. Você pode gerar as chaves usando qualquer 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 do simétrica criptografia classes, uma nova chave e IV são criados automaticamente para a sessão. Use o chave e IV gerados pelas classes de criptografia simétricas gerenciadas para criptografar e descriptografar o arquivo.

      Para obter mais informações sobre como gerar e distribuir chaves, consulte o Microsoft.NET Framework SDK Ou a documentação, consulte a seguinte Web Microsoft Developer Network (MSDN) site:
      Geração de chaves para criptografia e descriptografia
  5. Adicione a seguinte função para gerar uma nova chave para um sessão (conforme indicado no método 2 da etapa 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 que é nomeada EncryptFile. A classe EncryptFile deve ter três parâmetros a seguir:
    • sInputFilename
    • sOutputFilename
    • sKey (A chave secreta que é usada para criptografar e descriptografar o arquivo.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. No procedimento EncryptFile , crie um objeto FileStream de entrada e saída de uma objeto FileStream . Esses objetos podem ser lidos a partir e gravados no destino arquivos.
    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 . Isso representa o valor real e a criptografia real tecnologia de decodificação que é usada nos arquivos. Neste ponto, você pode criar um provedor diferente se você preferir usar RSAsecutiry ou outra criptografia técnica.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. O provedor de criptografia deve ser fornecido com seu chave secreta como uma matriz de bytes. O namespace System. Text fornece uma função chamada GetBytes(). Como parte de seus recursos de codificação, a função GetBytes() leva uma seqüência de caracteres e, em seguida, retorna uma matriz de bytes. O tamanho da chave é diferente para cada técnica de criptografia. Por exemplo, Data Encryption Standard (DES) usa uma chave de 64 bits que é igual a 8 bytes ou para 8 caracteres.

    Se você não fornecer uma chave, o provedor aleatoriamente gera uma. Ele criptografa o arquivo com êxito, mas não é possível para descriptografe o arquivo. Observe que você também deve fornecer o vetor de inicialização (IV). esse valor é usado como parte da criptografia. Assim como a chave, o IV é gerado aleatoriamente se você não fornecer o valor. Porque os valores devem ser o mesmo para a criptografia e a descriptografia, você não deve permitir aleatória geração desses valores.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Criar uma instância da classe CryptoStream usando o provedor criptográfico para obter uma criptografia objeto FileStream como parte do construtor de saída do objeto (CreateEncryptor) e o existente.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Leia no arquivo de entrada e, em seguida, escreverá na saída arquivo. Passar através do objeto CryptoStream onde o arquivo é criptografado usando a chave que você fornecido.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Descriptografar um arquivo

Para descriptografar um arquivo, execute estas etapas:
  1. Crie um método e nomeie-aDecryptFile. O processo de descriptografia é semelhante do processo de criptografia, no entanto, o procedimento DecryptFile tem duas diferenças principais 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 para o destino arquivo, o objeto CryptoStream agora é a fonte em vez do destino fluxo.
    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 () para chamar EncryptFile e 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. Salve o arquivo. Execute o aplicativo. Certifique-se de que o caminho que é usado para os pontos de nome de arquivo de entrada para um existente arquivo.

O procedimento de teste

Testar esse código com um arquivo de texto (. txt) para confirmar que o código criptografados e descriptografados corretamente o arquivo. Certifique-se de que você descriptografa o arquivo. para um novo arquivo (como no procedimento Main () neste artigo) em vez de para o arquivo original. Examine o arquivo descriptografado e, em seguida, compará-lo com o arquivo original.

Lista completa de código

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 obter mais informações sobre criptografia e sobre como usar o recursos de criptografia do .NET, consulte os seguintes sites da MSDN:
Espaço para nome System.Security.Cryptography
Microsoft.NET Framework Developer Center

Propriedades

ID do artigo: 307010 - Última revisão: quinta-feira, 27 de dezembro de 2012 - Revisão: 39.0
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: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 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: 307010

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