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());
}
Interface
En el ejemplo utilizamos la siguiente interface de usuario para proveer
los datos para la encripción.
|