Métodos para Encriptar y Desencriptar C#
En esta oportunidad presentamos 2 métodos para proteger los datos en sus desarrollos. Los métodos contienen una llave escrita en duro «qualityinfosolutions» que es la que nos permite Encriptar y luego Desencriptar nuestros datos, si las llaves no coinciden no podrán utilizar ambos métodos por lo que es recomendable manejar esta llave como una variable global.
Método de Encriptación
public static string Encriptar(string texto) { try{ string key = "qualityinfosolutions"; //llave para encriptar datos byte[] keyArray; byte[] Arreglo_a_Cifrar = UTF8Encoding.UTF8.GetBytes(texto); //Se utilizan las clases de encriptación MD5 MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); hashmd5.Clear(); //Algoritmo TripleDES TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateEncryptor(); byte[] ArrayResultado = cTransform.TransformFinalBlock(Arreglo_a_Cifrar,0,Arreglo_a_Cifrar.Length); tdes.Clear(); //se regresa el resultado en forma de una cadena texto = Convert.ToBase64String(ArrayResultado,0,ArrayResultado.Length); } catch (Exception) { } return texto; }
Método de Desencriptación
public static string Desencriptar(string textoEncriptado) { try { string key = "qualityinfosolutions"; byte[] keyArray; byte[] Array_a_Descifrar = Convert.FromBase64String(textoEncriptado); //algoritmo MD5 MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); hashmd5.Clear(); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(Array_a_Descifrar,0,Array_a_Descifrar.Length); tdes.Clear(); textoEncriptado = UTF8Encoding.UTF8.GetString(resultArray); } catch (Exception) { } return textoEncriptado; }
Saludos
Pensaba que entre este código y el de Android Studio eran compatibles… veo que no. una pena…
Si encriptas en Android y quierres desencriptar en c# salta error de datos incorrectos.
Estupendo!!!, me ha servido bastante, gracias
Estoy encriptando una cadena de 16 caracteres lo cual al parecer lo hace bien y lo guarda en un la BD. La cadena encriptada tiene una longitud de 10, pero al desencriptar me da el error: «Longitud no válida para una matriz o cadena de caracteres Base-64.»
Lo único diferente a tu código es que cambia mi key por una cadena de 16 caracteres.
El campo en la BD es un nvarchar de 150 en SQL y al recuperarlo lo obtiene sin ningún problema ni variaciones.
¿Hago algo más?
Estimado usas la misma clave para encriptar y desencriptar?
Así es, es la misma cadena.
¿Puede contener números y caracteres especiales?
Como te decía, encripta bien, el problema es desencriptar.
¿Podría interferir en algo que sea nvarchar de 150 en SQL?
Justamente te iba a preguntar como lo almacenas, no recuerdo en estos momentos el tamaño del string, pero si se que es mas de 150, prueba dejándolo en MAX.
Lo intenté pero no funcionó. La cadena encriptada se reduce de 16 a 10 y al desencriptar me da el error: «Longitud no válida para una matriz o cadena de caracteres Base-64».
¿Alguna sugerencia?
como extraigo el return textoEncriptado;
para pasárselo a un select.
Estimado supongamos que copiaste estos métodos en una clase llamada Util, en ese caso solo debes hacer lo siguiente.
string texto_encriptado = Util.Encriptar(«Esto es una prueba»);
string sql = «Select * FROM WHERE clave = ‘» + texto_encriptado + «‘»;
….
O bien directamente
string sql = «Select * FROM WHERE clave = ‘» + Util.Encriptar(«Esto es una prueba») + «‘»;
Saludos
muchas gracias
Al desencriptar los caracteres con acentos aparecen como caracteres raros. Hay manera de arreglar esto?