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

También te podría gustar...

39 Respuestas

  1. Killer dice:

    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.

  2. Victor Concha dice:

    Estupendo!!!, me ha servido bastante, gracias

  3. Sam dice:

    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?

      • Sam dice:

        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.

          • Sam dice:

            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?

  4. mario dice:

    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

  5. grover dice:

    muchas gracias

  6. Ric_Flo dice:

    Al desencriptar los caracteres con acentos aparecen como caracteres raros. Hay manera de arreglar esto?