miércoles, 12 de septiembre de 2012

Encriptar y Desencriptar en C#

Clase para encriptar y desencriptar cadena de texto

public class Encrypt
    {
        string key = "ABCDEFG54669525PQRSTUVWXYZabcdef852846opqrstuvwxyz";

        public string EncryptKey(string cadena)
        {
            //arreglo de bytes donde guardaremos la llave
            byte[] keyArray;
            //arreglo de bytes donde guardaremos el texto
            //que vamos a encriptar
            byte[] Arreglo_a_Cifrar =
            UTF8Encoding.UTF8.GetBytes(cadena);

            //se utilizan las clases de encriptación
            //provistas por el Framework
            //Algoritmo MD5
            MD5CryptoServiceProvider hashmd5 =
            new MD5CryptoServiceProvider();
            //se guarda la llave para que se le realice
            //hashing
            keyArray = hashmd5.ComputeHash(
            UTF8Encoding.UTF8.GetBytes(key));

            hashmd5.Clear();

            //Algoritmo 3DAS
            TripleDESCryptoServiceProvider tdes =
            new TripleDESCryptoServiceProvider();

            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            //se empieza con la transformación de la cadena
            ICryptoTransform cTransform =
            tdes.CreateEncryptor();

            //arreglo de bytes donde se guarda la
            //cadena cifrada
            byte[] ArrayResultado =
            cTransform.TransformFinalBlock(Arreglo_a_Cifrar,
            0, Arreglo_a_Cifrar.Length);

            tdes.Clear();

            //se regresa el resultado en forma de una cadena
            return Convert.ToBase64String(ArrayResultado,
                   0, ArrayResultado.Length);

        }

        public string DecryptKey(string clave)
        {
            byte[] keyArray;
             //convierte el texto en una secuencia de bytes
             byte[] Array_a_Descifrar =
             Convert.FromBase64String(clave);

             //se llama a las clases que tienen los algoritmos
             //de encriptación se le aplica hashing
             //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();
             //se regresa en forma de cadena
             return UTF8Encoding.UTF8.GetString(resultArray);
        }
    }

2 comentarios:

  1. el encriptado y desencriptado es MD5??? y como lo llamas mandandole la variable??

    ResponderEliminar
  2. Hola, el encriptado no es MD5, para llamarlo y pasarle la variable podes usar (Ya que es una clase):

    string Contrasenia = "ProgramandoDesdeCero";
    string Resultado = new Encrypt().EncryptKey(Contrasenia);

    //O

    Encrypt ClaseEncriptado = new Encrypt();
    Resultado = ClaseEncriptado.EncryptKey(Contrasenia);

    Si queres MD5 podes usar la siguiente función (MD5 = No se puede desencriptar):

    public string md5(string password)
    {
    //Declaraciones
    System.Security.Cryptography.MD5 md5;
    md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();

    //Conversion
    Byte[] encodedBytes = md5.ComputeHash(ASCIIEncoding.Default.GetBytes(password)); //genero el hash a partir de la password original

    //Resultado

    //return BitConverter.ToString(encodedBytes); //esto, devuelve el hash con "-" cada 2 char
    return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(encodedBytes).ToLower(), @"-", ""); //devuelve el hash continuo y en minuscula. (igual que en php)
    }

    Saludos!!

    ResponderEliminar