Encriptar cadenas utilizando Triple DES

Encriptar cadenas utilizando Triple DES

October 11, 2019

DES es un algoritmo de encriptación en bloque de clave simétrica, es decir, se utiliza la misma clave para encriptar como para desencriptar un mensaje.

Encriptar un mensaje utilizando DES con las librerías de.NET (`System.Security.Cryptography^) es bastante sencillo, prácticamente se reduce a seleccionar el proveedor específico y llamar a los métodos adecuados.

Inicializando el proveedor criptográfico

El primer paso antes de cifrar o descifrar un mensaje es inicializar el proveedor TripleDES con la clave:

private static TripleDES GetInstance(string strKey)
{ 
	TripleDES objProvider = new TripleDESCryptoServiceProvider();
	
	// Inicializa el proveedor
	objProvider.Key = Encoding.Unicode.GetBytes(strKey);
	objProvider.IV = new byte[objProvider.BlockSize / 8];
	// Devuelve el proveedor
	return objProvider;
}

Encriptación de un mensaje

El método de encriptación de una cadena en un array de bytes es:

public static byte[] Encrypt(string strMessage, string strKey)
{ 	
	TripleDES objProvider = GetInstance(strKey);
	ICryptoTransform objCrypto = objProvider.CreateEncryptor();
	byte[] arrBytBuffer = Encoding.Unicode.GetBytes(strMessage);
	
	// Devuelve el arry de bytes encriptado
	return objCrypto.TransformFinalBlock(arrBytBuffer, 0, arrBytBuffer.Length);
}

Dado que lo que se nos devuelve es un array de bytes, podemos pasarlo a una cadena. Dado que este array de bytes está encriptado y por tanto puede contener caracters no imprimibles, normalmente al pasarlo a una cadena se utiliza una codificación en base 64:

public static string EncryptToBase64(string strMessage, string strKey)
{ 	
	return Convert.ToBase64String(Encrypt(strMessage, strKey))
}

Desencriptar una cadena

Para desencriptar una cadena la función es igualmente sencilla (el método espera que el mensaje sea una cadena codificada en base 64, por eso la primera línea es la instrucción Convert.FromBase64String):

public static string Decrypt(string strMessage, string strKey)
{	
	byte[] arrBytBuffer = Convert.FromBase64String(strMessage);
	TripleDES objProvider = GetInstance(strKey);
	ICryptoTransform objCrypto = objProvider.CreateDecryptor(); 
	
	// Devuelve la cadena desencriptada
	return Encoding.Unicode.GetString(objCrypto.TransformFinalBlock(arrBytBuffer, 0, arrBytBuffer.Length));
}

Vulnerabilidades

La mayor vulnerabilidad de los algoritmos de clave simétrica está en la clave. Si la clave es demasiado corta puede que sea fácil descifrarlo, sin embargo, los usuarios no son demasiado amigos de utilizar claves de más de 8 caracteres.

Para evitar utilizar en el cifrado una clave demasiado corta se puede emplear en lugar de la clave proporcionada por el usuario un hash MD5 de la clave lo que nos dará una cadena más larga que podemos usar con mayor confianza.