Hola, este tema es un poco mas complicado que el pasado, pero también creo que es de mucha utilidad, mas que nada cuando quieres guardar usuarios en una base de datos y no quieres que nadie, ni si quiera tu pueda saber la contraseña de los usuarios con tan solo mirar la tabla o con alguna consulta desde cualquier manejador de base de datos sea cual sea este.
Este es un simple ejemplo hecho en C# de cómo encriptar y descencriptar texto utilizando una serie de clases provee el Framework, aquí una breve explicación de estas clases.
Clases y Espacios de nombres importantes para su implementación son:
using System.Text;
using System.Security.Cryptography;
MD5CryptoServiceProvider (Clase)
Calcula el valor de hash
MD5 (
Message-Digest Algorithm 5), de los datos de entrada utilizando la implementación proporcionada por el proveedor de servicios criptográfico (CSP). Esta clase no se puede heredar.
UTF8Encoding (Clase)
Representa una codificación UTF-8 de caracteres Unicode.
TripleDESCryptoServiceProvider (Clase)
Define un objeto contenedor para obtener acceso a la versión del proveedor de servicios criptográficos (CSP) del algoritmo TripleDES (algoritmo que hace triple cifrado del algoritmo Data Encryption Standard) No se puede heredar esta clase.
CipherMode (Enumeración)
Especifica el modo de cifrado de bloques que se utilizará para cifrar.
PaddingMode (Enumeración)
Especifica el tipo de relleno que se aplica cuando el bloque de datos del mensaje es más pequeño que el número total de bytes necesarios para una operación criptográfica.
ICryptoTransform (Interfaz)
Define las operaciones básicas de las transformaciones criptográficas.
Después de ver esto, creamos un proyecto de visual Studio de tipo Windows Application y ya una ves en el explorador de soluciones agregamos una nueva clase y ponemos el siguiente código de una clase que yo ocupo para encriptar texto en mis aplicaciones, se llama CcryptorEngine, que tiene un atributo “key” de tipo string que es la clave que se necesita para cifrar y descifrar el texto, solo dos métodos uno que encripta el texto y otro que lo descencripta, pero debemos recordar que el texto que sea cifrado con determinada clave solo se puede descifrar con la misma clave.
class CCryptorEngine
{
private string key;
//constructor
public CCryptorEngine()
{
/* Establecer una clave. La misma clave
debe ser utilizada para descifrar
los datos que son cifrados con esta clave.
pueden ser los caracteres que uno desee*/
key = "ABCDEFGHIJKLMÑOPQRSTUVWXYZ
abcdefghijklmnñopqrstuvwxyz";
}
public string Encriptar(string texto)
{
//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(texto);
//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 Desencriptar(string textoEncriptado)
{
byte[] keyArray;
//convierte el texto en una secuencia de bytes
byte[] Array_a_Descifrar =
Convert.FromBase64String(textoEncriptado);
//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);
}
}
Después diseñamos una Windows Form más o menos así.
Ponemos Tres cajas de texto, tres etiquetas, tres botones y unas imágenes PNG de flechas, lo que hace el programa es que al dar clic al botón encriptar cifra el texto del primer textbox y lo muestra en el segundo y al dar clic al botón descencriptar descifra el texto y lo muestra en el ultimo textbox, esto se muestra en el siguiente código.
private void button1_Click(object sender, EventArgs e)
{
//se agrega un bloque try catch
//para prevenir cualquier error
try
{
//se crea un objeto de la clase CCryptorEngine
CCryptorEngine crypto = new CCryptorEngine();
//se cifra la información del textbox1
textbox2.Text = crypto.Encriptar(textbox1.Text);
}
catch(Exception ex)
{
MessageBox.Show("Ocurrió un error: "
+ ex.Message);
}
}
private void button2_Click(object sender, EventArgs e)
{
//se agrega un bloque try catch para
//prevenir cualquier error
try
{
//se crea un objeto de la clase CCryptorEngine
CCryptorEngine crypto = new CCryptorEngine();
//se descifra la información del textbox2
textbox3.Text =
crypto.Desencriptar(textbox2.Text);
}
catch(Exception ex)
{
MessageBox.Show("Ocurrió un error: "
+ ex.Message);
}
}
Con esto ya tenemos una aplicación que cifra y descifra texto y no solo se puede usar en Windows Forms yo lo he utilizado en paginas web en ASP.net, en móviles y en servicios web XML, todo esto en .Net, bueno espero esto le sirva a alguien.
Saludos!!!
Aquí dejo en link de mi SkyDrive para que bajen esta aplicación con todo y su código fuente link
Etiquetas de Technorati:
cifrar y descifrar,
C#