22 de agosto de 2010

Encriptar y Desencriptar con C# (Método Simple)

El post de hoy es muy directo, porque cuento con poco tiempo. La idea es la de postear una clase con varios métodos que suelo usar cuando necesito encriptar y desencriptar cadenas de texto.

C# Encriptar y Desencriptar (Clase)

La clase contiene 4 métodos:

  • 2 métodos para encriptar. Uno de ello simple que solo le pasamos el texto a encriptar y usando el resto de los valores por defecto devolvemos el texto ya encriptado. El segundo método hace exactamente lo mismo pero necesita que le pasemos por parámetro todos los datos necesarios para obtener la clave de encriptación.
  • Otros 2 métodos para desencriptar. Uno de ello simple que solo le pasamos el texto encriptado y usando el resto de los valores por defecto devolvemos el texto ya desencriptado. El segundo método hace exactamente lo mismo pero necesita que le pasemos por parámetro todos los datos necesarios para obtener la clave de encriptación.

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text; 

namespace dllObjetosComunes.Utiles

{

  public static class Encriptador

  {

    public static class RijndaelSimple

    {

      #region Encriptar

      /// <summary>

      /// Método para encriptar un texto plano usando el algoritmo (Rijndael).

      /// Este es el mas simple posible, muchos de los datos necesarios los

      /// definimos como constantes.

      /// </summary>

      /// <param name="textoQueEncriptaremos">texto a encriptar</param>

      /// <returns>Texto encriptado</returns>

      public static string Encriptar(string textoQueEncriptaremos)

      {

        return Encriptar(textoQueEncriptaremos,

          "pass75dc@avz10", "s@lAvz", "MD5", 1, "@1B2c3D4e5F6g7H8", 128);

      }  

      /// <summary>

      /// Método para encriptar un texto plano usando el algoritmo (Rijndael)

      /// </summary>

      /// <returns>Texto encriptado</returns>

      public static string Encriptar(string textoQueEncriptaremos,

        string passBase, string saltValue, string hashAlgorithm,

        int passwordIterations, string initVector, int keySize)

      {

        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);

        byte[] saltValueBytes  = Encoding.ASCII.GetBytes(saltValue);

        byte[] plainTextBytes  = Encoding.UTF8.GetBytes(textoQueEncriptaremos);  

        PasswordDeriveBytes password = new PasswordDeriveBytes(passBase,

          saltValueBytes, hashAlgorithm, passwordIterations);

        byte[] keyBytes = password.GetBytes(keySize / 8);

        RijndaelManaged symmetricKey = new RijndaelManaged() {

          Mode = CipherMode.CBC };

        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes,

          initVectorBytes);

        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 cipherText = Convert.ToBase64String(cipherTextBytes);      

        return cipherText;

      }

      #endregion  

      #region Desencriptar

      /// <summary>

      /// Método para desencriptar un texto encriptado.

      /// </summary>

      /// <returns>Texto desencriptado</returns>

      public static string Desencriptar(string textoEncriptado)

      {

        return Desencriptar(textoEncriptado, "pass75dc@avz10", "s@lAvz", "MD5",

          1, "@1B2c3D4e5F6g7H8", 128);

      }  

      /// <summary>

      /// Método para desencriptar un texto encriptado (Rijndael)

      /// </summary>

      /// <returns>Texto desencriptado</returns>

      public static string Desencriptar(string textoEncriptado, string passBase,

        string saltValue, string hashAlgorithm, int passwordIterations,

        string initVector, int keySize)

      {

        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);

        byte[] saltValueBytes  = Encoding.ASCII.GetBytes(saltValue);

        byte[] cipherTextBytes = Convert.FromBase64String(textoEncriptado);

        PasswordDeriveBytes password = new PasswordDeriveBytes(passBase,

          saltValueBytes, hashAlgorithm, passwordIterations);

        byte[] keyBytes = password.GetBytes(keySize / 8);

        RijndaelManaged symmetricKey = new RijndaelManaged() {

          Mode = CipherMode.CBC };

        ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes,

          initVectorBytes);

        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 plainText = Encoding.UTF8.GetString(plainTextBytes, 0,

          decryptedByteCount);

        return plainText;

      }

      #endregion

    }

  }

} 

 

Artículos Relacionados:

18 comentarios:

  1. muchas gracias, re util.
    Saludos

    ResponderEliminar
  2. pero komo se le hace para mandar llamalos y te aparezka encriptado y desencritado

    ResponderEliminar
  3. Muy bueno el codigo.
    Gracias.

    ResponderEliminar
  4. excelnte!!! gracias por la info =D

    ResponderEliminar
  5. 0LITAZ!!!!
    }0nde ta el MET0D0 MAIN??????..


    JIJJI.. PLIZZ!!!

    ResponderEliminar
    Respuestas
    1. ¡Escribe bien puto gañán! Así te cruja un rayo ¬¬

      Eliminar
  6. muy bueno, muchisimas gracias

    ResponderEliminar
  7. en la linea RijndaelManaged symmetricKey = new RijndaelManaged() {

    Mode = CipherMode.CBC }; me sale error

    ResponderEliminar
  8. En esas dos lineas pon:

    RijndaelManaged symmetricKey = new RijndaelManaged();
    symmetricKey.Mode = CipherMode.CBC;

    ResponderEliminar
  9. Muy buen aporte, pero, me puede hacer el favor de explicarme lo del namespace???
    es decir, dónde creo la clase Encriptador?
    gracias

    ResponderEliminar
  10. Exelente codigo me funciono muy bien en mi proyecto
    .....

    ResponderEliminar
  11. es muy sencillo:
    String password = Encriptador.RijndaelSimple.Encriptar("Texto");
    gracias me funcionó muy bien :)

    ResponderEliminar
  12. Tiene un error.... utilice el código por que necesito pasar valores enteros encriptados entre paginas asp.net por url pero me di cuenta que cuando ingreso para que me encripte ejemplo el numero 10 cuando lo quiero desencriptar truena... creo que te genera dentro de todos los caracteres un espacio en blanco y supongo que no puede hacer la conversion... Checalo... Ya he utilizado varios algoritmos de este tipo y surge el mismo error...

    ResponderEliminar
  13. Muy bueno, con el codigo, acabo de formar una dll. de 10.

    Saludos

    ResponderEliminar
  14. Muy bueno, me funcionó a la perfección. Gracias por el aporte.

    ResponderEliminar
  15. excelente aporte funciono al 100 graxias

    ResponderEliminar
  16. Muy util esta clase, siempre habia usado librerias en dll, pero es mucho mejor usar una clase interna, gracias

    ResponderEliminar
  17. No me acepta codigo con un "." punto osea un password por ejemplo abc.123 no me acepta desencriptar por el punto... que puedo hacer me sale error en esta línea byte[] cipherTextBytes = Convert.FromBase64String(textoEncriptado);

    ResponderEliminar