Lenguaje de programación Visual C# .Net
A
continuación mostramos las 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.
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:
private void formIndexarPDF_FormClosed(object sender, FormClosedEventArgs e) { cifrarAES cifradoAES = new cifrarAES(); proUtilidades.guardarValorConfiguracion("AjpdSoft"); proUtilidades.guardarValorConfiguracion("BD.Contraseña", cifradoAES.cifrarTextoAES (txtContrasena.Text, "AjpdSoft_Frase_Encriptado", "AjpdSoft_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.
* 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.
Un ejemplo de uso para descifrar:
private void formIndexarPDF_Load(object sender, EventArgs e) { cifrarAES cifradoAES = new cifrarAES(); txtUsuario.Text = "AjpdSoft"; txtContrasena.Text = cifradoAES.descifrarTextoAES(txtContrasena.Text, "AjpdSoft_Frase_Encriptado", "AjpdSoft_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 descrifrar 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.
No hay comentarios:
Publicar un comentario