martes, 2 de julio de 2013

Reporte 1 - Protocolo Diffie-Hellman

El protocolo Diffie-Hellman es un metodo para intercambiar llaves criptográficas. Éste es uno de los primeros ejemplos de intercambio de llaves que se implementaron en el área de la criptografía y permite a dos participantes de alguna comunicación crear una llave simetrica para el cifrado y descifrado de mensajes, esto sin ser necesario el conocimiento de la otra persona para que de esta manera sea seguro poder mandar los mensajes a través de medios no seguros.

 La seguridad de este protocolo depende de el método que se utilice para generar las llaves,es decir, que para los participantes de la comunicación debe ser facil y sencillo generar las llaves a partir de valores que se intercambian entre ellos. Por el contrario, si alguien logra interceptar los valores con los que se generaron la llaves, debe ser una manera difícil (o al menos muy tardada) encontrar de dónde vinieron esos valores para poder así obtener el valor de la llave.

 Para este reporte, la implementación que se realizó utiliza un cierto número primo p y un generador g de Zp, que son generados públicamente. De manera privada, uno de los participantes de la comunicación(Alice) genera un valor f(x) representado de la siguiente manera: f(x) = gx mod p ,así mismo, el otro participante(Bob) genera un valor f(y) de la siguiente manera: f(y) = gy mod p, dónde x y y son número al azar.

 Estos valores f(x) y f(y) son enviados a la parte contraria,es decir, Alice manda su valor a Bob y viceversa para poder generar su llave (que como ya se mencionó,es simétrica). Para la generación de esta llave (k) Alice debe realizar la siguiente operación: k = f(y)x mod p, mientras que Bob deberá realizar: k = f(x)y mod p.

 Por último, en el caso de que hubiera un tercero escuchando esa comunicación los único valores que podría obtener serían los valores de p,g,f(x) y f(y), de tal manera que la dificultad con la que este tercero pueda lograr "hackear" este protocolo depende directamente de la función que se utilizó para generar los valores de f(x) y f(y), que en nuestro caso es el módulo p de una potencia.

 A continuación se presenta la manera en la que se utiliza el programa realizado para este reporte:



Donde primo es un número primo y generador es un número que sea generador para Zprimo

Lo siguiente que se muestra es un ejemplo de el protocolo junto con un intento de "hackeo", demostrando que con números pequeños es muy sencillo realizarlo:



Se trató de realizar un ejemplo utilizando el número primo 982,451,653 y eligiendo uno de sus generadores; comprobandose que generar las llaves teniendo las funciones no tomó mucho tiempo pero,al tratar de "hackearlo", el programa empezó a demorar mucho por lo cual se interrumpió la ejecución del mismo.

La parte interesante del programa es la rutina encargada de "hackear" el protocolo, que se puede observar a continuación:



Es algo muy sencillo, lo único que se realiza es repetir la función que realizan Alice y Bob variando el valor del exponente hasta que se obtengan los mismos valores de f(x) y f(y) que,obviamente, será más tardado entre más grande sea el valor del número primo.

El código completo se puede ver en la siguiente liga.

Debido a que no se realizaron una buena cantidad de pruebas, lo único que se puede concluir es que entre mayor sea valor del número primo mayor debería ser el tiempo que se tardaría en poder "hackear" el protocolo aunque no solo depende de este valor. Otro factor importante es el exponente que se utiliza para obtener f(x) y f(y) ya que si estos valores son aleatorios hay que tener cuidado ya que en el peor de los casos ambos podrían ser 1 , lo cuál sería algo muy grave ya que sería muy fácil de "hackear".
Algo se puede observar es que al ser g un generador, si el exponente que se utiliza es mayor al número primo, es posible encontrar el mismo resultado del modulo con un número dentro del rango de 1 al valor de número primo.

Trabajo pendiente:

  • Para poder automatizar las pruebas todo debería poder ser aleatorio (el valor del número primo,el generador, y los exponentes x y y)
  • Al aleatorizar estos valores se debe tener en cuenta diversas validaciones, por ejemplo, que el número primo sea de alguna longituda considerablemente grande, que los exponentes de igual manera sean diferentes y con una distancia considerable entre uno y otro.

Referencias.

La rutina para realizar el módulo de la potencia fue realizada en clase.

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: