martes, 16 de agosto de 2011

Encriptar Información Parte IIa (Usted no lo haga)



Continuando con esta serie de post sobre la encriptación de datos o como me corrigió mi amigo Mario el termino correcto sería codificación de información, antes de entrar en tierra firme y explicar todos los tipos de encriptación voy a ahondar en las malas practicas utilizadas por muchos desarrolladores que piensan que están haciendo sus sitios seguros y protegiendo la información cuando en realidad solo están agregando líneas de código inservibles para el fin que se está solicitando, ¿Por qué les pasa esto?, muy simple, les pasa por que no entienden y no se dan el tiempo de tratar de entender lo que están haciendo, sin ir mas lejos he conocido programadores que logran entregar productos y que no saben explicar cosas tan básicas como lo que significa una clase, una interfaz, herencia, para ellos es hablar otro idioma cuando se les consulta por el patrón singleton o clases abstractas.

Al momento de encriptar información una de las malas prácticas más comunes es la codificación XOR, sin ir más lejos una empresa que empieza con servi…. la ocupaba hace poco en sus url, ésta codificación ocupa la lógica matemática del “o exclusivo” la cual dice que es un tipo de disyunción lógica de dos operandos que es verdad si solo un operando es verdad pero no ambos. En programación el manejo se hace tomando el universo no incluido en los binarios a comparar.

Si en c# realizáramos un XOR entre los enteros 10 y 12, este nos devolvería un 6 y la logica que ocurriría sería la siguiente

int A = 10 ^ 12;

donde

10 = 1010

12 = 1110

A = 110

Es fácil reconocer que lo que se realizó fue una suma de números binarios, explicado esto vamos a un ejemplo de este tipo de codificación.

Como codificar:

public static byte[] Codificar(byte[] cadena)

{

for (int _i = 0; _i < cadena.Length; _i++)

cadena [_i] = (byte)(15 ^ bytACodificar[_i]);

return cadena;

}

Si se fijan a cada elemento del vector de byte le realizó un XOR con un número fijo (en este caso es 15) el cual ocuparé para decodificar la cadena como se ve en la siguiente función:

public static byte[] DeCodificar(byte[] cadena)

{

for (int _i = 0; _i < cadena.Length; _i++)

cadena[_i] = (byte)(15 ^ cadena[_i]);

return cadena;

}

No hay diferencia en las funciones solo se aplica una simple conmutatividad, ¿cuanto se demora un atacante en descifrar esto?, menos de lo que te has demorado en leer el artículo, si aplicáramos esto en un código lo haríamos de la siguiente forma:

String text = "Pablo Hormazabal rlz.";

System.Text.ASCIIEncoding codificador = new System.Text.ASCIIEncoding();

byte[] texto = Codificar(codificador.GetBytes(text));

System.Console.WriteLine(codificador.GetString(texto));

texto = DeCodificar(texto);

System.Console.WriteLine(codificador.GetString(texto));

System.Console.ReadKey();

El resultado es el siguiente:


No hay comentarios: