[ Encriptación XOR ]
Por Black Fenix
La encriptación de datos es una de las mejores técnicas que podemos utilizar para proteger nuestras aplicaciones de los eventuales crackers. La encriptación XOR es uno de los métodos más sencillos que existen, su rapidez y fácil implementación la hacen ideal para los creadores de virus y para cualquiera que desee implementar un sencillo método de encriptación.
La encriptación XOR (exclusive OR) se basa en la propiedad lógica de dicha operación.
Cojamos dos valores 25h y 63h en binario:
00100101 -> 25h |
01100011 -> 63h |
Según el funcionamiento de la operación lógica XOR, los bits del primer operando que sean iguales a los del segundo, resultaran en 0 (false) y el resto de bits en 1 (true) por lo tanto si realizamos el XOR de 25h con 63h obtendremos:
01000110 -> 46h
Como podemos comprobar se cumple la lógica de esta instrucción. Si ahora cogemos este valor y volvemos a realizar un XOR con 63h.
01000110 -> 46h | XOR |
01100011 -> 63h |
obtendremos
00100101 -> 25h
! El dato original !, Esta es la base de la encriptación XOR, pongamos ahora un ejemplo genérico.
Si tenemos un dato A que deseamos encriptar y una llave de encriptación B, efectuaremos una operación XOR tal que así:
A XOR B = C
donde C será el valor encriptado. Si sustituimos las variables por datos:
25h XOR 63h = 46h
A = 25h
B = 63h
C = 46h
Posteriormente para recuperar el dato encriptado (A) haremos:
C XOR B = A
que usando los anteriores valores queda
46h XOR 63h = 25h
En este ejemplo se ha utilizado una llave (B) de 8 bits, el tamaño de la llave puede ser más grande 16,32 o más bits, si la llave es más grande, mayor seguridad, ya que hay más llaves posibles. Aquí tienes un resumen de las posibles combinaciones posibles según el tamaño de la llave.
Para una llave de 8bits tenemos un total de 256 = 2^8 llaves diferentes
Para una llave de 16bits tenemos un total de 65535 2^16 = llaves diferentes
Para una llave de 32bits tenemos un total de 4294967295 = 2^32 llaves diferentes.
Para una llave de 64bits tenemos un total de 18446744073709551616 = 2^64 llaves diferentes.
Para una llave de 128 bits tenemos 3.4028236692093846346337460743177e+38 = 2^128 llaves diferentes.
Hay que tener en cuenta esto si vamos a implementar una protección que utilice encriptación, ya que si se intenta un ataque por fuerza bruta sobre nuestra encriptación y nuestra llave es de 8 bits, el tiempo necesario para conseguir una llave válida será muy inferior que si por el contrario nuestra llave es de 32bits o superior. Todo esto no sirve de mucho si no se toman las medidas necesarias para ocultar la llave, para que me entiendas, no sirve de nada tener una super-puerta de seguridad anti-robo y a prueba de bombas y todo lo que tu quieras si nos dejamos la llave debajo del felpudo. Por lo tanto deberemos ocultar nuestra preciada llave de cualquier ladrón :-). Un último comentario, en la encriptación XOR siempre podemos encontrar la llave si tenemos los datos encriptados y los datos sin encriptar con un simple XOR de ambos valores:
B = A xor C
46h = 25h XOR 63h
Para encriptar un bloque de datos en assembler de 32 bits hariamos algo así:
....
....
mov esi,Original_Data_Ptr // carga puntero al buffer a encriptar
mov edi,Crypted_Data_Ptr // carga puntero al buffer donde guarda los datos
mov ecx,Data_Length // carga longitud del buffer a encriptar
or ecx,ecx // comprueba si es 0
jz @NoEncrypt // si es 0 no encripta
mov al,XORKey // carga la llave XOR en AL
@NextByte:
mov ah,byte ptr [esi] // lee byte a encriptar
xor ah,al // encripta
mov byte ptr [edi],ah // y guarda buffer destino
inc esi // pasa al siguiente byte del buffer
inc edi // pasa al siguiente byte del buffer
dec ecx // decrementa contador de bytes encriptados
jnz @NextByte // continua si aún quedan más
@NoEncrypt:
....
....
en 16 bits seriá:
....
....
les si,Original_Data_Ptr
lds di,Crypted_Data_Ptr
mov cx,Data_Length
or cx,cx
jz @NoEncrypt
mov al,XORKey
@NextByte:
mov ah, byte ptr es:[si]
xor ah,al
mov byte ptr ds:[di],ah
inc si
inc di
dec cx
jnz @NextByte
@NoEncrypt:
....
....
La desencriptación se realizaría de la misma manera pero pasando en Original_Data_Ptr el buffer encriptado y en Crypted_Data_Ptr el buffer donde desencriptar. Esta es una de las ventajas de la encriptación XOR, no hace falta escribir otra función que desencripte, ya que se puede utilizar la misma. Por eso muchos virus utilizan este tipo de encriptación: ocupa poco espacio, es rápida y sirve tanto para encriptar como para desencriptar.
You are inside Reversed Minds pages. por
Mr. Silver
/ WKT! |