domingo, 10 de septiembre de 2017

Cifrado XOR

El cifrado XOR es un algoritmo de cifrado basado en el operador binario XOR, el cual es una operacion OR exclusiva (XOR).

El operador XOR

Para entender que hacer el operador XOR podemos observar la siguiente imagen:



Ademas se cumple que:

Si aplicamos a una cadena A XOR 0 = A , nos dará como resultado la misma cadena.
Si aplicamos a una cadena B XOR A = C y a este resultado le volvemos a aplicar C XOR A = B , nos dará como resultado la cadena inicial, es decir B.

Ejemplo


Cifrado cadena-clave (8bits = 1byte = 1 caracter)

Por ejemplo si de entrada tenemos la palabra "FISI" (01000110 01001001 01010011 01001001) y la ciframos con la clave (01010101) que su valor en Ascii es 85 y esta representado como "U", entonces tenemos asi:

01000110 01001001 01010011 01001001

01010101 01010101 01010101 01010101
-----------------------------------------------------------
00010011 00011100 00000110 00011100


Cifrado cadena-clave ( n caracteres)

Si tenemos una cadena de entrada "FISI" (01000110 01001001 01010011 01001001) y clave "1234" (00110001 00110010 00110011 00110100)

01000110 01001001 01010011 01001001

00110001 00110010 00110011 00110100
-----------------------------------------------------------
01110111 01111011 01100000 01111101

En esto consiste basicamente el cifrado XOR, el cual tenemos como entrada el texto a cifrar "FISI" (B) y la clave de cifrado "1234" (A) , para descifrar el texto solamente tendriamos que volver a aplicar un XOR al texto cifrado "w{`}" (C) , que nos dara como resultado la cadena inicial "FISI" (B).

Descifrado cadena-clave ( n caracteres)

Tenemos como entrada el texto cifrado "w{`}" (01110111 01111011 01100000 01111101) y la clave utilizada anteriormente "1234" (00110001 00110010 00110011 00110100) y le aplicamos XOR:


01110111 01111011 01100000 01111101

00110001 00110010 00110011 00110100
-----------------------------------------------------------
01000110 01001001 01010011 01001001

Como resultado hemos obtenido la cadena "FISI" (01000110 01001001 01010011 01001001) que es la cadena que inicialmente ingresamos.


Implementación


En el cifrado de feistel utilizamos una función en la cual se aplicaba un XOR entre 2 caracteres. En este ultimo ejemplo es casi lo mismo, realizaremos un pequeño programa el cual aplicara el cifrado XOR a un texto y clave ingresadas por parámetros.

Pueden ver el código desde aqui.

El código:


/**
 Autor: PaoloRamirez
 Tema: Aplicar XOR a una cadena con una clave de N bytes
 Link: https://www.facebook.com/PaoloProgrammer/
**/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
 if(argc!=3)
 {
  perror("Insertar 2 parametros (p1:texto, p2:clave)");
  exit(0);
 }

 int len_texto,len_clave;
 len_texto=strlen(argv[1]);
 len_clave=strlen(argv[2]);

 /**
  Texto inicial
  Clave de cifrado
 **/
 //Tamaño de cadena = len+fincadena \0
 char texto[len_texto+1]; //L+R
 char clave[len_clave+1]; //Ki

 //Format
 memset(texto,0,sizeof(texto));
 memset(clave,0,sizeof(clave));

 //Copiar a variables
 strcpy(texto,argv[1]);
 strcpy(clave,argv[2]);

 printf("Texto: %s\n", texto);
 printf("Clave: %s\n\n", clave);

 //Aplicando XOR;  texto[i] XOR clave[0]
 int i;
 for (i = 0; i < len_texto; i++)
 {
  /* code */
  texto[i] = texto[i]^clave[i]; //Iteramos tanto en el texto[i] como en la clave[i]
 }

 printf("Texto cifrado: %s\n", texto);
}


Clave 8 bits (1 byte):

Para el primer ejemplo solo tomo el primer caracter del segundo parametro, es decir, clave[0].
En la imagen podemos ver como parametros "FISI" y "0" que al aplicar XOR nos da como resultado la cadena "vycy".

Nota: No ingrese que como clave "U" como en el ejemplo porque nos da como resultado caracteres que no se pueden mostrar. Debo agregar que la clave ingresada "0" es el carácter '0' y no el valor 0.

Como paso final aplicamos XOR a la cadena resultante y obtenemos el texto ingresado inicialmente "FISI".

Clave N bytes:

En la imagen podemos ver como parámetros "FISI" y "1234" que al aplicar XOR nos da como resultado la cadena "w{`}".

Nota: Como se logra visualizar antes de la comilla ' agrego el simbolo \ pues es un caracter especial y no podemos pasarlo como parametro directamente.

Como vemos al aplicar un XOR a la cadena cifrada y la misma clave utilizada para cifrar, obtenemos como resultado la cadena inicialmente ingresada, para nuestro ejemplo "FISI". 

El operador XOR es muy común como parte de cifrados mas complejos. Sin embargo, por si solo el cifrado XOR es muy vulnerable y es fácil de obtener la clave a través del analisis de varios mensajes cifrados con la misma clave.


Enlaces


https://github.com/phaoliop/Programming_C-Cplus/blob/master/C/Cifrado/xor_8bits.c

https://github.com/phaoliop/Programming_C-Cplus/blob/master/C/Cifrado/xor_nbytes.c

https://github.com/phaoliop/Programming_C-Cplus/blob/master/C/Cifrado/xor.c

Referencias

No hay comentarios.:

Publicar un comentario