Cómo cifrar y descifrar un archivo mediante el uso de Visual C#

Seleccione idioma Seleccione idioma
Id. de artículo: 307010 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E307010
Para obtener una versión de Microsoft Visual Basic .NET de este artículo, consulte 301070.
En este artículo se refiere a la siguiente Microsoft .NET Espacios de nombres de biblioteca de clases de Framework:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Nota En este artículo no se aplica a la de Microsoft.NET Framework 2.0.
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo describe cómo utilizar las clases de criptografía proporcionados por el de.NET Framework de Microsoft para cifrar un archivo de texto a un estado no se puede leer y, a continuación, para descifrar ese archivo de texto a su origen formato.

Requisitos

La lista siguiente describe el hardware recomendado, software, infraestructura de red y los service Pack que debe tener:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Windows 2000 Advanced Server, Windows NT 4.0 Server o Microsoft Windows XP Professional
  • Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET

Cifrado y descifrado

El espacio de nombres System.Security.Cryptographic en Microsoft.NET Framework proporciona una gran variedad de herramientas para ayudarle con el cifrado y descifrado. La clase CryptoStream es una de las numerosas clases que se proporciona. La clase CryptoStream se ha diseñado para cifrar o descifrar el contenido a medida es transmite en secuencias a un archivo.

Cifrar un archivo

Para cifrar un archivo, siga estos pasos:
  1. Inicie Visual Studio 2005 o Visual Studio. NET.
  2. Haga clic en C# bajoProyectosy, a continuación, haga clic en Aplicación de consolabajo Plantillas. Visual C# .NET crea una clase estática junto con un procedimiento Main() vacío.
  3. Utilice la instrucción using (como se indica en el código de ejemplo que aparece a continuación) en el espacios de nombres siguientes:
    • Sistema de
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    para que no es necesario calificar las declaraciones de estos espacios de nombres más adelante en el código. Debe utilizar estas instrucciones antes que cualquier otro declaraciones.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Genere una clave secreta para cifrar y descifrar los datos. DESCryptoServiceProvider se basa en un algoritmo de cifrado simétrico. El simétrico el cifrado requiere una clave y un vector de inicialización (IV) para cifrar la datos. Para descifrar los datos, debe tener la misma clave y el mismo vector de inicialización. Es necesario también utilizan el mismo algoritmo de cifrado. Puede generar las claves mediante el uso de uno de los métodos siguientes:
    • Método 1 Puede pedir al usuario una contraseña. A continuación, utilice la contraseña como la clave y el vector de inicialización.
    • Método 2 Al crear una nueva instancia de la simétrico criptográfica las clases, una nueva clave e IV se crean automáticamente para la sesión. Utilice el clave e IV que se generan mediante las clases criptográficas simétricas administradas a cifrar y descifrar el archivo.

      Para obtener más información acerca de cómo generar y distribuir claves, vea Microsoft.NET Framework SDK Documentación del sistema o consulte el siguiente Web de Microsoft Developer Network (MSDN) sitio:
      Generar claves para cifrar y descifrar
  5. Agregue la siguiente función para generar una nueva clave para un período de sesiones (como se indica en el método 2 del paso 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. Cree un método en la clase que se denomina EncryptFile. La clase EncryptFile debe tener los siguientes tres parámetros:
    • sInputFilename
    • sOutputFilename
    • sKey (La clave secreta que se utiliza para cifrar y descifrar el archivo.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. En el procedimiento EncryptFile , cree un objeto FileStream entrada y salida de un objeto FileStream . Estos objetos pueden leer y escritos en el destino archivos.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. Declare una instancia de la clase DESCryptoServiceProvider . Esto representa el cifrado en Sí y los datos reales tecnología de descifrado que se utiliza en los archivos. En este momento, puede crear un proveedor diferente si prefiere usar RSAsecutiry u otra criptográfica técnica.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. El proveedor de cifrado debe proporcionarle el clave secreta como una matriz de bytes. El espacio de nombres System.Text proporciona una función que se denomina GetBytes(). Como parte de sus características de codificación, el método GetBytes() toma una cadena y, a continuación, devuelve una matriz de bytes. El tamaño de la clave es diferente para cada técnica de cifrado. Por ejemplo, Estándar de cifrado de datos (DES) utiliza una clave de 64 bits que es igual a 8 bytes o a 8 caracteres.

    Si no se proporciona una clave, el proveedor de forma aleatoria genera uno. Esto cifra correctamente el archivo, pero no hay ninguna forma de descifrar el archivo. Tenga en cuenta que también debe proporcionar el vector de inicialización (IV). este valor se utiliza como parte del cifrado. Al igual que la clave es el vector de inicialización genera de forma aleatoria si no se proporciona el valor. Debido a que los valores deben ser el mismo para el cifrado y el descifrado, no debe permitir al azar generación de estos valores.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Crear una instancia de la clase CryptoStream utilizando el proveedor de cifrado para obtener un cifrado objeto (CreateEncryptor) y el existente objeto de salida FileStream como parte del constructor .
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Leer en el archivo de entrada y, a continuación, escribir en la salida archivo. Pasar a través del objeto CryptoStream donde el archivo está cifrado mediante el uso de la clave que usted proporciona.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Descifrar un archivo

Para descifrar un archivo, siga estos pasos:
  1. Cree un método y, a continuación, asígnele el nombreDecryptFile. El proceso de descifrado es similar a la proceso de cifrado, sin embargo, el procedimiento de DecryptFile tiene dos diferencias respecto al procedimiento EncryptFile .
    • CreateDecryptor se utiliza en lugar de CreateEncryptor para crear el objeto CryptoStream , que especifica cómo se puede utilizar el objeto.
    • Al escribir el texto descifrado en el destino archivo, el objeto CryptoStream ahora es el origen en lugar de destino secuencia.
    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. Agregue las siguientes líneas al procedimiento Main() para llamar tanto a EncryptFile como a 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 el archivo. Ejecute la aplicación. Asegúrese de que el ruta de acceso que se utiliza para los puntos de nombre de archivo de entrada a una existente archivo.

El procedimiento de prueba

Pruebe este código con un archivo de texto (.txt) para confirmar el código cifró y descifró el archivo correctamente. Asegúrese de que descifra el archivo en un nuevo archivo (al igual que en el procedimiento Main() en este artículo) en lugar de en el archivo original. Examine el archivo descifrado y compárelo con el archivo original.

Lista de código completa

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

Referencias

Para obtener más información acerca de la criptografía y sobre el uso de la características de cifrado de. NET, consulte los siguientes sitios Web de MSDN:
Espacio de nombres System.Security.Cryptography
Microsoft.NET Framework Developer Center

Propiedades

Id. de artículo: 307010 - Última revisión: jueves, 15 de noviembre de 2012 - Versión: 2.0
La información de este artículo se refiere a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palabras clave: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 307010

Enviar comentarios

 

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