jueves, 27 de junio de 2013

Tarea Introductoria: One time pad

Primer tarea de la materia de seguridad de la información y criptografía que consiste en la
implementación de 'One time pad' en python, utilizando archivos para el manejo de las llaves.

Las partes importantes del código son tres: el encriptado, el descifrado y el borrado de las llaves utilizadas.

Encriptado:

Para realizar la función de encriptado, lo que se realiza es primero recorrer sobre cada pedazo del mensaje (cada pedazo depende de la longitud del mensaje y la longitud de las llaves) y luego,sobre cada elemento del pedazo:

  • Encontrar el valor numérico del caracter (posición en el alfabeto)
  • Sumar el valor de la llave dependiendo del índice que vayamos en nuestro pedazo de mensaje,es decir, si vamos en la primer letra del mensaje sumamos el primer número de la llave y así sucesivamente hasta terminar el pedazo de mensaje.
Cada nueva cifra se concatena a una sola cadena de caracteres, que terminara siendo una cadena con dígitos separados por un espacio.

Descifrado:

Para el descifrado se utiliza la misma lógica de cifrado, solo que a la inversa. El mensaje encriptado se parte en pedazos y se recorre cada elemento de cada pedazo. La diferencia en el descifrado es que en lugar de sumar el valor que hay en la llave, se resta y ese valor obtenido lo convertimos a una letra del alfabeto utilizando el valor obtenido como la posición en el alfabeto. Cada que encontramos ese caracter lo concatenamos a una sola cadena de caracteres.

Borrado de lineas:


El borrado de llaves es un proceso sencillo que consiste en primero guardar 'crudas' las llaves que se utilizaron (cada llave es una línea en el archivo,se guarda toda la línea incluyendo el salto de linea),en este caso, ese proceso se realiza durante la lectura de las llaves y se guarda en la variable 'rawLines'. Después se guardan todas las líneas del archivo y se itera sobre cada una de ellas, escribiendo la línea en el archivo si esa linea no fue utilizada en el proceso de encriptado o descifrado.

Descargar el código completo.

El programa se utiliza de la siguiente manera:

Donde:

  • nombre, es el nombre de la persona que va a utilizar el programa (alice o bob)
  • accion, es 0 (encriptado) o 1(descifrado)
  • 'mensaje', es el mensaje a encriptar o descifrar,debe ir entre comillas

El siguiente es un ejemplo de encriptación:

Se puede observar que si no existen los archivos con las llaves (bob.dat y alice.dat) el programa preguntara datos necesarios para su generación.

  • paginas, cantidad de lineas que contendrá el archivo
  • longitud de las llaves, longitud de cada linea (llave)

Los número impresos al final es el mensaje encriptado.

Haciendo el descifrado del mensaje anterior:

Se puede observar que se imprime el descifrado del mensaje.

Trabajo pendiente:

  • El hecho de tener que estar copiando cada mensaje encriptado a la hora de descifrar es algo que se puede automatizar escribiendo el mensaje encriptado en un archivo y descifrarlo. Lo mismo para encriptar, en vez de escribir todo el mensaje como argumento se puede escribir en un archivo y encriptar ese archivo. Obviamente, el último argumento ahora sería el archivo a encriptar o descifrar.
  • Dar la posibilidad que los usuarios no solo sean alice y bob. Se puede arreglar modificando la sección en donde se generan los archivos, recibiendo de parámetros los nombres con los que se crearan los archivos y creandolos.
  • Por lo anterior, el argumento del nombre del usuario deberia cambiar al archivo que se va a utilizar para encriptar o descifrar
  • Actualmente, la encriptación solo funciona con los 26 caracteres del alfabeto inglés (minúsculas) y espacios en blanco. Se podrían agregar los demás caracteres al alfabeto que se utiliza.
  • El programa no puede encriptar números o descifrar letras. Si bien el encriptado funciona utilizando números, la manera que está implementado este proceso no permite encriptar números, esto es porque al hacer la concatenación busca el índice de la letra; se podría validar que si son números no valla a buscar el índice si no que tome ese dígito como la posición en el alfabeto. Para descifrar letras es parecido, el proceso actual utiliza dígitos que utiliza como posición en el alfabeto, entonces, se puede agregar que si son letras primero obtenga el valor de su posición en el alfabeto.
Referencias:

1 comentario: