El operador XOR
Para entender que hacer el operador XOR podemos observar la siguiente imagen:
Ademas se cumple que:
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.
/** 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
No hay comentarios.:
Publicar un comentario