Funciones cifrarTextoAES y descifrarTextoAES para cifrar/descifrar (encriptar/desencriptar) una cadena de texto usando el método Advanced Encryption Standard (AES) ó Rijndael. Mostramos el código completo de la clase cifrarAES.cs. Las funciones de cifrado y descifrado permitirán elegir el algoritmo hash de encriptación (MD5, SHA1) y el tamaño de la clave: 128, 192 o 256.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
using System; using System.Security.Cryptography; using System.Text; using System.IO; namespace AjpdSoftIndexarTextoFicherosPDF { class cifrarAES { public string cifrarTextoAES (string textoCifrar, string palabraPaso, string valorRGBSalt, string algoritmoEncriptacionHASH, int iteraciones, string vectorInicial, int tamanoClave) { try { byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(vectorInicial); byte[] saltValueBytes = Encoding.ASCII.GetBytes(valorRGBSalt); byte[] plainTextBytes = Encoding.UTF8.GetBytes(textoCifrar); PasswordDeriveBytes password = new PasswordDeriveBytes(palabraPaso, saltValueBytes, algoritmoEncriptacionHASH, iteraciones); byte[] keyBytes = password.GetBytes(tamanoClave / 8); RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC; ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, InitialVectorBytes); MemoryStream memoryStream = new MemoryStream(); CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); cryptoStream.FlushFinalBlock(); byte[] cipherTextBytes = memoryStream.ToArray(); memoryStream.Close(); cryptoStream.Close(); string textoCifradoFinal = Convert.ToBase64String(cipherTextBytes); return textoCifradoFinal; } catch { return null; } } public string descifrarTextoAES (string textoCifrado, string palabraPaso, string valorRGBSalt, string algoritmoEncriptacionHASH, int iteraciones, string vectorInicial, int tamanoClave) { try { byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(vectorInicial); byte[] saltValueBytes = Encoding.ASCII.GetBytes(valorRGBSalt); byte[] cipherTextBytes = Convert.FromBase64String(textoCifrado); PasswordDeriveBytes password = new PasswordDeriveBytes(palabraPaso, saltValueBytes, algoritmoEncriptacionHASH, iteraciones); byte[] keyBytes = password.GetBytes(tamanoClave / 8); RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC; ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, InitialVectorBytes); MemoryStream memoryStream = new MemoryStream(cipherTextBytes); CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); byte[] plainTextBytes = new byte[cipherTextBytes.Length]; int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); memoryStream.Close(); cryptoStream.Close(); string textoDescifradoFinal = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); return textoDescifradoFinal; } catch { return null; } } } } |
Un ejemplo de uso para cifrar:
1 2 3 4 5 6 7 8 |
private void formIndexarPDF_FormClosed(object sender, FormClosedEventArgs e) { cifrarAES cifradoAES = new cifrarAES(); proUtilidades.guardarValorConfiguracion("ProyectoA"); proUtilidades.guardarValorConfiguracion("BD.Contraseña", cifradoAES.cifrarTextoAES (txtContrasena.Text, "ProyectoA_Frase_Encriptado", "ProyectoA_Frase_Encriptado", "MD5", 22, "1234567891234567", 128)); } |
En el ejemplo vemos que los argumentos que hay que pasar a la función cifrarTextoAES son:
- Texto a cifrar: el texto que queramos cifrar o encriptar con AES.
- Contraseña o palabra de paso: texto que se usará para generar el algoritmo de cifrado.
- valorRGBSalt: una cadena de texto cualquiera para aumentar la seguridad del cifrado.
- Algoritmo de cifrado: puede ser «MD5» ó «SHA1».
- Iteraciones: número de iteraciones.
- Vector inicial: un texto o número de 16 bytes (16 caracteres).
- Tamaño clave: puede ser 128, 192 o 256 bits.
Un ejemplo de uso para descifrar:
1 2 3 4 5 6 7 8 |
private void formIndexarPDF_Load(object sender, EventArgs e) { cifrarAES cifradoAES = new cifrarAES(); txtUsuario.Text = "ProyectoA"; txtContrasena.Text = cifradoAES.descifrarTextoAES(txtContrasena.Text, "ProyectoA_Frase_Encriptado", "ProyectoA_Frase_Encriptado", "MD5", 22, "1234567891234567", 128); } |
En el ejemplo vemos que los argumentos que hay que pasar a la función descifrarTextoAES son:
- Texto a descifrar: el texto cifrado previamente a descifrar por la función.
- Contraseña o palabra de paso: texto que se usará para generar el algoritmo de descifrado, debe coincidir con el que se usó para el cifrado.
- valorRGBSalt: una cadena de texto cualquiera, debe coincidir con el que se usó para el cifrado.
- Algoritmo de cifrado: puede ser «MD5» ó «SHA1», debe coincidir con el que se usó para el cifrado.
- Iteraciones: número de iteraciones, debe coincidir con el que se usó para el cifrado.
- Vector inicial: un texto o número de 16 bytes (16 caracteres), debe coincidir con el que se usó para el cifrado.
- Tamaño clave: puede ser 128, 192 o 256, debe coincidir con el que se usó para el cifrado.