miércoles, 20 de agosto de 2014

Cifrado XOR y One-time pad


El método de cifrado XOR es un método que, como su nombre lo indica, utiliza el operador lógico XOR. El operador XOR devuelve 1 (o verdadero) siempre y cuando sólo uno de sus entradas es igual a 1, en caso contrario devuelve 0 (o falso).

La tabla de verdad del operador XOR para dos entradas quedaría así:


En el caso que se utilice este operador para dos cadenas binarias, se aplica el operador XOR para cada bit de las dos cadenas, resultando en una nueva cadena binaria, como se muestra en la siguiente imagen.


Este operador es muy útil en Criptografía, pues imaginemos que la cadena binaria A es el mensaje, la cadena binaria B es la llave y C = A XOR B es el mensaje criptado. Si se desea recuperar el mensaje original, sólo es necesario aplicar el operador XOR para la cadena C y la cadena B, por lo que resulta que A = C XOR B.

Si bien este método es muy sencillo de implementar también es cierto que es fácil de atacarlo, en especial si la llave siempre es la misma. Para evitar este problema el concepto de One-time pad (libreta de un sólo uso) viene muy bien al caso, ya que son como una especie colección de llaves aleatorias que dos usuarios comparten.

Imaginemos que tenemos dos usuarios, Alice y Bob y que se ha generado un one-time pad de 10 llaves y los dos tienen una copia de este one-time pad. Cada vez que un usuario envía un mensaje al otro, se encripta el mensaje utilizando una llave de su propio one-time pad, para proceder a eliminar dicha llave de su libreta. Luego, el receptor recibe el mensaje criptado y lo recupera utilizando la llave de su propia copia del one-time pad, procediendose a eliminarse dicha llave de la libreta del receptor. Nótese que la llave en ambos operaciones  siempre es la misma, aunque está almacenada en dos lugares distintos. En este ejemplo el proceso de comunicación se podría repetir hasta 10 veces, que es el número de llaves disponibles para los dos usuarios, y en teoría, si se utiliza llaves verdaderamente aleatorias es prácticamente imposible romper la seguridad de un sistema que implemente one-time pad.

Se implementó en Python una especie de sistema one-time pad, que consiste en dos programas principales: un generador de llaves pseudoaleatorias y un programa que encripte y desencripte mensajes. Antes de continuar, es necesario mencionar que nuestras llaves y nuestros mensajes pueden contener símbolos alfanuméricos, por lo que es necesario consentir un "protocolo" para trabajar únicamente con números, en mi caso decidí trabajar con números Unicode, es decir, el número entero que representa un caracter en Unicode. Entonces ya que queda claro que todos los caracteres de mis llaves y mensajes se pueden representar como números, procedo a mostrar un pequeño ejemplo de esto.






Para generar llaves pseudoaleatorias es necesario mandar como argumentos el número de llaves a generar así como el tamaño de las mismas.. Para empezar con "la comunicación" es necesario que existan los archivos de llaves para los dos usuarios y también un archivo de texto que contenga texto cualquiera, el cual va a ser nuestro mensaje original. En el programa de encriptación, por tanto, se manda como argumentos los nombres del archivo que va a servir como el mensaje y también los nombres de los archivos que contienen las llaves. Ya que esto es una simulación de como se podría implementar one-time pad, la desencriptación del mensaje lo realiza en automático, mostrando en pantalla el contenido del mensaje original.

Los resultados se muestran a continuación.




Referencias:

3 comentarios:

  1. junta referencias bibliográficas al final de la entrada (estilo wikipedia) e incluye ahí todo lo que ocupaste para preparar la tarea; pon el código completo en un repo (el jueves regreso aquí a calificar la tarea)

    ResponderEliminar
  2. capturas de pantalla no son una forma ideal de demostrar las ejecuciones ejemplo...

    ResponderEliminar
  3. + Control over key length as a parameter: ok
    + Control over the number of keys as a parameter: ok
    + Automatic key management: absent, keys are not stored (0)
    + Functional encryption/decryption: put together as a sequence, not shown as a callable subroutine (1/2)
    + Adequate use cases for example runs: screenshots of text in a terminal... (1/2)
    - Spelling: ok
    - Grammar: puntuación podría mejorarse
    - Structure and visual design of the report: DO NOT put screenshots of code; use a repo and embed main fragments (-1/2)
    - Reference management: simple links, missing info, not referenced within the text body (-1/2)
    - Programming style: ok
    x English: no
    => 2 out of 5 pts, but your extra ROT entry gives you a boost to 3 points total

    ResponderEliminar