Criptografía Simétrica - Parte 1[System.Security.Cryptography]
Fecha: 04/Feb/2006 (03-02-06)
|
Desde hace algun tiempo he querido aportar más a la comunidad de desarrollo, ahora que estoy trabajando en el tema de criptografía me doy cuenta que no hay mucho material sobre este tema en panoramabox. Aqui consigno algunas de las cosas que he aprendido sobre criptografía y espero les sea de utilidad.
La criptografía simétrica nos permite protección de datos, la encripción y desencripción de datos previene que usuarios no autorizados hagan uno de la información. Para hacer criptografía simétrica requerimos un algorítmo de encripción y una clave secreta (key), que se comparten entre los usuarios que comparten los datos.
Los algorítmos simétricos usados con mayor frecuencia son: DES, 3DES, RC2, Rijndael, estos algoritmos permiten tener diferentes niveles se seguridad por que unos son más fuertes que otros y ofrecen mayor resistencia a ataques de fuerza bruta, el algoritmo Rijndael es el más aceptado y recomendado en este momento por que permite utilizar claves mas grandes y complejas y se recomienda para encriptar informamación sencible, este es mas complejo y flexible que DES.
Para implementar criptografia en .NET podemo utilizar varias clases incorporadas en el Framework, en este artículo mostraré el uso de la clase SymmetricAlgorithm provista en el namespase System.Security.Cryptography. Esta clase incorpora inplementaciones de los algoritmos simétricos DES, 3DES, RC2, Rijndael. Adicionamente genera las claves(key) y el vector de inicializacion (IV) adecuadas para cada algoritmo automaticamente. Por medio del método Create genera una instancia del algoritmo simétrico.
Para encriptar y desecriptar los datos el SymmetricAlgorithm delega la responsabilidad la interface ICryptoTransform. Una instancia de esta interface permite tomar los datos originales y encriptarlos o vicersa. Al crear la instancia de la interace se utiliza los metodos CreateEncryptor o CreateDecryptor para definir el modo de transformacion.
Utilizaremos la Clase CryptoStream para generar la secuencia de bytes de la transformacion y los escribiremos en una instancia de la clase MemoryStream. .
Esta metodología de encripción solo validez practica si almacenas el Key el IV generado por el SymmetricAlgorithm para usuarla en la desencripción de los datos. Este lo abordaremos en la segunda parte de este articulo que publicare proximamente.
A continuación sigue código en C#:
SymmetricAlgorithm saEnc;
private void btnEncriptar_Click(object sender, System.EventArgs e)
{
byte[] dataorg = Encoding.Default.GetBytes(txtTextoOriginal.Text);saEnc = SymmetricAlgorithm.Create(cmbAlgoritmos.SelectedItem.ToString());
ICryptoTransform ct = saEnc.CreateEncryptor();
txtKeyGenerado.Text = Encoding.Default.GetString(saEnc.Key);
txtIVGenerado.Text = Encoding.Default.GetString(saEnc.IV);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(dataorg,0,dataorg.Length);
cs.FlushFinalBlock();
txtTextoEncrypado.Text = Encoding.Default.GetString(ms.ToArray());
lblTextoEncLen.Text = txtTextoEncrypado.Text.Length.ToString();
}
private void btnDesencriptar_Click(object sender, System.EventArgs e)
{
SymmetricAlgorithm saDEnc = SymmetricAlgorithm.Create(cmbAlgoritmos.SelectedItem.ToString());
byte[] textoEncriptado = Encoding.Default.GetBytes(txtTextoEncrypado.Text);
MemoryStream ms = new MemoryStream(textoEncriptado);
ICryptoTransform cto = saDEnc.CreateDecryptor(saEnc.Key, saEnc.IV);
MemoryStream mso = new MemoryStream();
CryptoStream cso = new CryptoStream(mso,cto,CryptoStreamMode.Write);
cso.Write(ms.ToArray(),0,ms.ToArray().Length);
cso.FlushFinalBlock();
txtTextoDesecriptado.Text = Encoding.Default.GetString(mso.ToArray());
}
En el ejemplo utilizamos la siguiente interface de usuario para proveer los datos para la encripción.
No es mas por el momento, Exitos!!!.
System.Security.Crytography
System..Text
System..IO
Fichero con el código de ejemplo: ericeec_CriptografiaSimetricaParte1.zip - 10.50 KB
(MD5 checksum: 6D3558D7312F341266C9A285DEE1AE72)