Вы находитесь на странице: 1из 7

Cmo cifrar y descifrar un archivo mediante Visual C#

Id. de artculo: 307010 - Ver los productos a los que se aplica este artculo

Advertencia: Artculo de Traduccin Automtica, vea la exencin de responsabilidad. Haga clic aqu para ver en paralelo el artculo de traduccin automtica y el artculo original en ingls. En este artculo se public anteriormente en Q307010 Para obtener una versin de Microsoft Visual Basic .net de este artculo, consulte 301070. En este artculo hace referencia a los espacios de nombres de biblioteca de clases de.NET Framework de Microsoft siguiente: System.IO System.Security System.Security.Cryptography Nota En este artculo no se aplica a la.NET Framework de Microsoft 2.0. Expandir todo | Contraer todo

En esta pgina Resumen


Este artculo describe cmo utilizar las clases de cifrado proporcionadas por el.NET Framework de Microsoft para cifrar un archivo de texto a un estado ilegible y para descifrar ese archivo de texto vuelva a su formato original.

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

Cifrado y descifrado
El espacio de nombres System.Security.Cryptographic en el.NET Framework de Microsoft proporciona una 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 est diseada para cifrar o descifrar el contenido, se transfiere a un archivo.

Cifrar un archivo
Para cifrar un archivo, siga estos pasos: 1. Iniciar Visual Studio .net o Visual Studio de 2005. 2. Haga clic en Visual C# en proyectosy, a continuacin, haga clic en Aplicacin de consola en plantillas. Visual C# .net crea una clase esttica , junto con un procedimiento Main() vaco. 3. Utilice la instruccin using (tal y como se indica en el siguiente cdigo de ejemplo) en los espacios de nombres siguientes:

o Sistema o System.Security o System.Security.Cryptography o System.Text o System.IO para que no tiene que suministrar declaraciones de estos espacios de nombres ms adelante en el cdigo. Debe utilizar estas instrucciones antes de cualquier otra declaracin. using System; using System.IO; using System.Security; using System.Security.Cryptography; using System.Runtime.InteropServices; using System.Text; 4. Generar una clave secreta para cifrar y descifrar los datos. DESCryptoServiceProvider se basa en un algoritmo de cifrado simtrico. El cifrado simtrico requiere una clave y un vector de inicializacin (IV) para cifrar los datos. Para descifrar los datos, debe tener la misma clave y el mismo IV. Tambin se debe utilizar el mismo algoritmo de cifrado.Puede generar las claves mediante cualquiera de los mtodos siguientes: o Mtodo 1 Puede solicitar al usuario una contrasea. A continuacin, utilice la contrasea como la clave y el IV. o Mtodo 2 Cuando se crea una nueva instancia de las clases criptogrficas simtricas, se crean automticamente una nueva clave y un IV para la sesin. Utilice las teclas y el IV generados por las clases de cifrado simtricas administradas para cifrar y descifrar el archivo.

Para obtener ms informacin acerca de cmo generar y distribuir claves, consulte la documentacin de SDK de Microsoft.NET Framework o visite el siguiente sitio Web de Microsoft Developer Network (MSDN): Generacin de claves de cifrado y descifrado 5. Agregue la siguiente funcin para generar una nueva clave para una sesin (como se indica en el mtodo 2 del paso 4): 6. // Call this function to remove the key from memory after use for security. 7. [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")] 8. public static extern bool ZeroMemory(ref string Destination, int Length); 9. 10. // Function to Generate a 64 bits Key. 11. static string GenerateKey() 12. { 13. // Create an instance of Symetric Algorithm. Key and IV is generated automatically. 14. DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create(); 15. 16. // Use the Automatically generated key for Encryption. 17. return ASCIIEncoding.ASCII.GetString(desCrypto.Key); } 18. Cree un mtodo en la clase que se denomina EncryptFile. La clase de EncryptFile debe tener los siguientes tres parmetros: o sInputFilename o sOutputFilename

o sKey (La clave secreta que se utiliza para cifrar y descifrar el archivo.) 19. static void EncryptFile(string sInputFilename, 20. string sOutputFilename, 21. string sKey) 22. En el procedimiento EncryptFile , crear un objeto FileStream de entrada y salida de un objeto FileStream . Estos objetos pueden leer y escritos en los archivos de destino. 23. FileStream fsInput = new FileStream(sInputFilename, 24. FileMode.Open, 25. FileAccess.Read); 26. 27. FileStream fsEncrypted = new FileStream(sOutputFilename, 28. FileMode.Create, 29. FileAccess.Write); 30. Declare una instancia de la clase DESCryptoServiceProvider . Esto representa el cifrado en S y la tecnologa de descifrado real que se utiliza en los archivos. En este momento, puede crear un proveedor diferente si prefiere utilizar RSAsecutiry u otra tcnica de cifrado. 31. DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 32. El proveedor de cifrado debe proporcionarle la clave secreta como una matriz de bytes. El espacio de nombresSystem.Text proporciona una funcin que se denomina GetBytes(). Como parte de sus caractersticas de codificacin, el mtodo GetBytes() toma una cadena y, a continuacin, devuelve una matriz de bytes. El tamao de la clave es diferente para cada tcnica de cifrado. Por ejemplo, el estndar de cifrado de datos (DES) toma una clave de 64 bits que es igual a 8 bytes o a 8 caracteres. Si no proporciona ninguna clave, el proveedor genera aleatoriamente una. Esto cifra correctamente el archivo, pero no es posible descifrar el archivo. Tenga en cuenta que tambin debe proporcionar el vector de inicializacin (IV).Este valor se utiliza como parte del cifrado. Al igual que la clave, el IV se genera aleatoriamente si no se proporciona el valor. Debido a que los valores deben ser los mismos para el cifrado y el descifrado, no debe permitir la generacin aleatoria de estos valores. 33. DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 34. DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 35. Crear una instancia de la clase CryptoStream con el proveedor de cifrado para obtener un objeto de cifrado (CreateEncryptor) y el de salida existente objeto FileStream como parte del constructor. 36. ICryptoTransform desencrypt = DES.CreateEncryptor(); 37. CryptoStream cryptostream = new CryptoStream(fsEncrypted, 38. desencrypt, 39. CryptoStreamMode.Write); 40. Leer del archivo de entrada y, a continuacin, escribir en el archivo de salida. Pasar a travs del objeto CryptoStreamdonde el archivo est cifrado con la clave que proporcion. 41. byte[] bytearrayinput = new byte[fsInput.Length - 1]; 42. fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); 43. cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

Descifrar un archivo

Para descifrar un archivo, siga estos pasos: 1. Cree un mtodo y, a continuacin, asgnele el nombre DecryptFile. El proceso de descifrado es similar al proceso de cifrado, sin embargo, el procedimiento de DecryptFile tiene dos diferencias respecto al procedimiento EncryptFile . . o CreateDecryptor se utiliza en lugar de CreateEncryptor para crear el objeto CryptoStream , que especifica cmo se puede utilizar el objeto. o Cuando el texto descifrado se escribe en el archivo de destino, el objeto CryptoStream ahora es el origen en lugar de la secuencia de destino. 2. static void DecryptFile(string sInputFilename, 3. string sOutputFilename, 4. string sKey) 5. { 6. DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 7. //A 64 bit key and IV is required for this provider. 8. //Set secret key For DES algorithm. 9. DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 10. //Set initialization vector. 11. DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 12. 13. //Create a file stream to read the encrypted file back. 14. FileStream fsread = new FileStream(sInputFilename, 15. FileMode.Open, 16. FileAccess.Read); 17. //Create a DES decryptor from the DES instance. 18. ICryptoTransform desdecrypt = DES.CreateDecryptor(); 19. //Create crypto stream set to read and do a 20. //DES decryption transform on incoming bytes. 21. CryptoStream cryptostreamDecr = new CryptoStream(fsread, 22. desdecrypt, 23. CryptoStreamMode.Read); 24. //Print the contents of the decrypted file. 25. StreamWriter fsDecrypted = new StreamWriter(sOutputFilename); 26. fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd()); 27. fsDecrypted.Flush(); 28. fsDecrypted.Close(); 29. } 30. Agregue las siguientes lneas al procedimiento Main() para llamar tanto a EncryptFile como a DecryptFile: 31. static void Main() 32. { 33. // Must be 64 bits, 8 bytes. 34. // Distribute this key to the user who will decrypt this file. 35. string sSecretKey; 36. 37. // Get the key for the file to encrypt. 38. sSecretKey = GenerateKey(); 39. 40. // For additional security pin the key. 41. GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned ); 42.

43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. }

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

56. Guarde el archivo. Ejecute la aplicacin. Asegrese de que la ruta de acceso que se utiliza para el nombre de archivo de entrada seala a un archivo existente. El procedimiento de ensayo Pruebe este cdigo con un archivo de texto (.txt) para confirmar que el cdigo cifr y descifr el archivo correctamente.Asegrese de que descifra el archivo en un archivo nuevo (como en el procedimiento Main() en este artculo) en lugar de en el archivo original. Examine el archivo descifrado y comprelo con el archivo original.

Cdigo completo
using using using using using using System; System.IO; System.Security; System.Security.Cryptography; System.Runtime.InteropServices; 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(); } } } Volver al principio | Propocionar comentarios

Referencias
Para obtener ms informacin acerca de la criptografa y acerca de cmo utilizar las caractersticas de cifrado de .net, consulte los siguientes sitios Web de MSDN: Espacio de nombres System.Security.Cryptography

Вам также может понравиться