miércoles, 10 de julio de 2013

Cifrado de flujo - SNOW

Cifrado de flujo.

Un sistema de cifrado de flujo, a diferencia del cifrado por bloque, realiza el cifrado de la información caracter por caracter.

Un flujo de cifrado binario, es un flujo de cifrado sincronizado entre el flujo de claves, el texto plano y el texto cifrado que son secuencias de dígitos binarios.

La salida de un generador de claves de flujo, llamado "running key", ej. z(1), z(2),... es "sumado"/"agregado" simbólicamente al la secuencia del texto m(1), m(2),..., dando como resultado el texto cifrado c(1), c(2),... . Cada clave secreta "k" es ingresada en el flujo generador de claves, que corresponde a la secuencia de salida. Una vez que la clave secreta "k" es compartida entre quien transmite y quien recibe, donde quien recibe puede descifrar "restando"/"quitando" la salida del flujo generador de claves al texto cifrado obteniendo la secuencia del mensaje.

Algoritmo SNOW.


El algoritmo SNOW, consta de una llave secreta de 128 o 256 bits y una variable de inicialización (IV0, IV1,…, IV3) de 128 bits de conocimiento público.

La operación del mismo está basada en una maquina de estados finitos (FSM) con 2
registros de 32 bits y un registro de desplazamiento con retroalimentación lineal (LFSR)
con un tamaño de palabra de 32 bits. El cifrador utiliza las operaciones de caja de
sustitución (S-BOX) como elemento no lineal que permite obtener la propiedad de
confusión y la transformación MixColumns del cifrador AES como elemento que
permite obtener difusión.


Cifrador SNOW


Para inicializar el cifrador es necesario introducir estados internos en cada una de las
palabras del LFSR (St0, St1,…, St15), para ello se siguen las siguientes fórmulas en el
caso de una llave (K0, K1,…, K7) de 256 bits:


Además de ello es necesario guardar un valor cero en cada uno de los registros de la
FSM:

R1= R2 = 0

Luego de esto se procede a actualizar 32 veces la salida del LFSR utilizando el

esquema de retroalimentación:

Retroalimentación al inicializar SNOW.

Finalmente se actualiza una vez más la salida del LFSR mediante el esquema (Cifrador SNOW).

Realizadas estas operaciones, el cifrador se encuentra listo para generar un flujo de llave (running key) que será añadido al texto plano mediante la operación XOR.
Para descifrar deberá inicializarse el algoritmo con la misma llave secreta e IV, con ello se generara el mismo flujo de llave, luego de ello se realizará la operación XOR con el texto cifrado con lo cual se recuperará el mensaje original.

Ataques efectivos contra este algoritmo:

  • Búsqueda exaustiva de claves:
    • El más eficiente para atacar este algoritmo.
  • Ataque de intercambio en tiempo de memoria:
    • Se utiliza principalmente en redes GSM, cuando los cambios de estado de memoria son muy pequeños.

Aplicaciones.

Este algoritmo está pensado para equipos de escasos recursos, por ejemplo:

  • Controles remotos(puertas automáticas de garaje, control remoto de botones de seguridad en vehículos, etc.).
  • Transmisión de texto entre equipos celulares o similares.
  • Cifrar conversaciones en redes celulares, de radio, satelitales, etc.
  • Se utiliza en el cifrado en redes IP.

Ventajas.

  • Fácil implementación.
  • Seguro.
  • De bajo costo en aparatos de recursos limitados.
  • Utiliza estándares de clase mundial para el cifrado.


Bibliografia.


Patrik Ekdahl, Thomas Johansson, SNOW - a new stream cipher, año 2001 http://www.hackerzvoice.net/madchat/crypto/hash-lib-algo/snow/snow10.pdf

Alvarado Martínez, Rubén Paul, Diseño e implementación de un control remoto seguro ante interceptación para puerta levadiza de garaje, año 2011 http://tesis.pucp.edu.pe/repositorio/handle/123456789/906

martes, 9 de julio de 2013

Cifrado por Bloques - FEAL(Fast data Encipherment ALgorithm)

En criptografía, FEAL (Fast data Encipherment ALgorithm) o (Algoritmo de encriptación rápida de datos) esta basado en el cifrado por bloques y fue propuesto como alternativa al algoritmo DES (Data Encryption Standard) o (Encriptación estándar de datos), diseñado para ser mucho más rápido a nivel de software.

Características:
  • Basado en el cifrado por bloques.
  • Consta de un cifrado de 64 bit por bloque.
  • Las llaves son igualmente de 64 bit.
  • Utiliza xor, sustitución, permutación y rotación(esta última es utilizada principalmente para las versiones FEAL-N y FEAL-NX) como métodos de cifrado.
  • Su principal función es dividir el texto de entrada en 2 y trabajar con ellos por separado con sub-llaves.
Inicialmente se implemento el algoritmo como FEAL-4, ya que este realizaba 4 "rondas" para cifrar el texto, se pensaba que para poder "quebrar" la seguridad de este algoritmo, eran necesarios entre 100 y 10,000 "textos planos elegidos" para obtener las llaves y decifrar el texto cifrado, pero Sean Murphy (1990) demostró que con solo 20 era suficiente para realizar el ataque y tener éxito..

Después de demostrar esto, se aumento el número de "rondas" a 8 con lo cual se dificulta el ataque, requiriendo alrededor de 10,000 por medio de un ataque estadístico, poco tiempo después, se demostró que para que el algoritmo fuese más efectivo que el DES, era necesario aumentar el número de "rondas" por lo cual se re-nombro por FEAL-N y actualmente se utiliza el FEAL-NX, el cual usa cifrado de 128 bit.

Funcionamiento.

Componentes:

  1. Llave de 64 bit
  2. Texto plano (texto legible)
  3. Función NO-Lineal

Inicialmente tenemos una llave de 64 bits, la cual puede ser generada pseudo-aleatoriamente, posteriormente esta llave es separada en sub-llaves de forma independiente y aleatoriamente, basándolo en esa primera llave.




la intención del uso del schedule y las sub-llaves, es que, si un atacante obtiene la sub-llave, no sea posible obtener la llave original.






La base del algoritmo, es dividir el Texto a cifrar en dos, posteriormente con las ultimas dos sub-llaves se ejecuta un xor a la mitad del texto de lado derecho, así como a la del lado izquierdo.

El resultado del lado derecho, es nuevamente modificado por medio de xor con el resultado del lado izquierdo y posteriormente una vez más es modificado por medio de xor pero, en esta ocasión, es comparado con la primer sub-llave generada.

Continuando con el flujo, el resultado de esta última operación es sometida a una función No-Lineal, donde es sometida a sustitución, permutación y rotación, para cifrar el texto, al finalizar nuevamente es aplicado un xor al resultado de la función comparandolo con el resultado inicial de la entrada izquierda, el resultado de esta es enviada al lado derecho y se inicia nuevamente el ciclo, mientras que el resultado inicial del lado derecho es enviado al lado izquierdo.

Para la última ronda, el resultado del lado derecho es comparado con xor junto con el resultado final del lado izquierdo, enviando dos salidas, la del lado derecho y la del lado izquierdo.

Con esto tenemos nuestro texto cifrado.





                                                 


En el caso de la función No-Lineal utilizada durante el algoritmo, puede ser utilizado únicamente la sustitución o la permutación pero actualmente se implementa la rotación como medida de cifrado, todo esto con la intención de hacer el algoritmo más seguro, trabajando directamente con los bits.

Gx(a,b) = (a + b + x (mod 256)) <<<2

Función de rotación No-Lineal para FEAL

Describiendo mejor esta función, la entrada de la misma correspondería a 32 bit, por ende, la salida será igualmente de 32 bit. Durante el proceso de la función, todo es separado en bloques de 8 bit y calculada con el modulo de 256, con la intención de que los resultados no sobrepasen el valor de un caracter en ASCII,  enseguida el resultado es "rotado" 2 posiciones, dejando los primeros 2 valores binarios del resultado al final del mismo.

Cabe mencionar que el núcleo del Algoritmo, radica en la función de rotación.


Referencias bibliográficas:

Wikipedia, ‎Yobo,19 March 2012,
Handbook of Applied Cryptography, Capitulo 7.5 "FEAL", ultima actualización July 8, 2011
TheAmazingKing.com, Jon King, Cryptography FEAL-4



lunes, 8 de julio de 2013

Esteganografía en Imágenes

La esteganografia, es la parte de la criptología en la que se estudian y aplican técnicas que permiten el ocultamiento de mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Es decir, se trata de ocultar mensajes dentro de otros y de esta forma establecer un canal encubierto de comunicación, de modo que el propio acto de la comunicación pase inadvertido para observadores que tienen acceso a ese canal.

Observar que la esteganografía se usa con el fin de realizar una comunicación entre partes. Para que pueda hablarse de esteganografía debe haber voluntad de comunicación por parte del emisor y del receptor

Para la parte de ocultar un mensaje, basta con descargar una imágen en formato "PNG" preferentemente, ya que con "JPG" no obtenemos el mensaje por la compresión de la imagen "JPG". Ejecutar el programa haciendo referencia al nombre de la imagen y su extensión así como el parametro "o" de ocultar al final del comando.

Una vez echo esto, el programa nos pedirá el mensaje que queremos ocultar dentro de la imágen y nos devolvera una imagen exactamente igual pero con el mensaje oculto.

Para extraer el mensaje basta con ejecutar nuevamente el programa pero, en esta ocasión, usar el parametro "e" al final para extraerlo.

El codigo a usar es el siguiente:

De las siguientes imágenes, intenta establecer cuales tiene mensaje oculto y cuales no, unicamente viéndolas  sin usar el código para obtener el mensaje.

 Imagen original

Imagen B

Imagen original


Imagen B

Imagen original

Imagen B

Usando el código anterior, obtén los mensjes ocultos en las imagenes con mensaje.

Fuentes.



Pendiente.

  • El programa se puede mejorar de tal forma que la cantidad de letras a utilizar sea mayor a 255, ya que actualmente no pasa de esa cantidad.
  • El metodo de ocultación es correcto pero podría ser mas impredecible.

miércoles, 3 de julio de 2013

Implementación de protocolo RSA con python

En criptografía, RSA (Rivest, Shamir y Adleman) es un sistema criptográfico de clave pública desarrollado en 1977. Es el primer y más utilizado algoritmo de este tipo y es válido tanto para cifrar como para firmar digitalmente.

La seguridad de este algoritmo radica en el problema de la factorización de números enteros. Los mensajes enviados se representan mediante números, y el funcionamiento se basa en el producto, conocido, de dos números primos grandes elegidos al azar y mantenidos en secreto. Actualmente estos primos son del orden de , y se prevé que su tamaño crezca con el aumento de la capacidad de cálculo de los ordenadores.

Como en todo sistema de clave pública, cada usuario posee dos claves de cifrado: una pública y otra privada. Cuando se quiere enviar un mensaje, el emisor busca la clave pública del receptor, cifra su mensaje con esa clave, y una vez que el mensaje cifrado llega al receptor, este se ocupa de descifrarlo usando su clave privada.



Con este(click aquí) código podemos generar las llaves publicas y privadas para un "Cliente"/ "Servidor" y para mostrar su funcionamiento, cree dos sockets, uno que funge como "Servidor" y el otro "Cliente", el "Cliente" envia un texto cifrado con la llave publica del "Servidor" y este a su vez decifra el mensaje con su llave privada.
Código Servidor

En el caso del Cliente, requiere pedir la llave publica del servidor, por lo cual busca el archivo de "servpub.key" con lo cual puede mandar un mensaje correctamente cifrado.

Código Cliente













Ejemplo de funcionamiento

Conclusiones:
  • Es recomendable usar llaves largas para obtener una mejor encriptación y que sea mas difícil de romper.
  • El uso de llaves asincronas permite tener un mejor nivel de seguridad.

Fuente de información:

martes, 2 de julio de 2013

Hackear Protocolo Diffie-Hellman

El protocolo Diffie-Hellmanes un protocolo de establecimiento de claves entre partes que no han tenido contacto previo, utilizando un canal inseguro, y de manera anónima (no autentificada).

Su seguridad radica en la extrema dificultad (conjeturada, no demostrada) de calcular logaritmos discretos en un cuerpo finito.

Para demostrar como funciona, este protocolo maneja 2 valores por defecto:

  • un número primo = p
  • un generador del mismo numero primo = g
Ahora, suponiendo que dos personas "Alice" y "Bob" desean utilizar este protocolo para obtener una llave, necesitan saber cual es el número "p" y cual su generador "g".

Utilizando el protocolo y estableciendo los valores (sin alguna regla en especifico para seleccionar el numero "p") obtenemos que:
  • p = 11
  • g = 6 (Siendo "g" un generador de 11)
Ahora, Alice y Bob, respectivamente, seleccionarán un número al azar, el cual va a ser utilizado para generar su llave.

Suponiendo que Alice y Bob seleccionan números menores a "p" sin compartir el número entre ellos:
  • a = 4
  • b = 8
  • Alice escoge a \in \mathbf{Z}_{p-1} al azar, calcula A = g^{a} \;\bmod\; p, y envía A a Bob
     A = 6^4 mod 11
     A = 9

  • Bob escoge b \in \mathbf{Z}_{p-1} al azar, calcula B = g^{b} \;\bmod\; p, y envía B a Alice
    B = 6^8 mod 11
    B = 4

Para calcular sus llaves respectivamente, basta con que Alice comparta con Bob su valor "A" = 9 mientras que Bob comparte con Alice su valor "B" =4.

Nuevamente utilizando esos últimos valores "A" y "B" generamos una llave para cada Bob y Alice, que sera unica entre estos dos.


Alice calcula s = B^a mod p
  • s = 4^4 mod 11
  • s = 256 mod 11
  • s = 3
Bob calcula s = A^b mod p
  • s = 9^8 mod 11
  • s = 43,046,721 mod 11
  • s = 3
Hasta este punto tenemos "p", "g", "A","B" y "s" con lo cual podemos intentar un ataque de "fuerza bruta" recorriendo los posibles valores de "a" o "b" y así obtener la forma de descifrar la conversación entre Alice y Bob encontrando su llave "s".

Si sabemos que:
  • p = 11
  • g = 6
  • A = 9
  • B = 4
Entonces, necesitamos generar "n" números que sustituyan "a" y/o "b" y de esta forma podamos obtener "s" en las formulas:


  • s = (g^a mod p = A)
  • s = (g^b mod p = B)


Conclusiones:

Al tener que hacer un ataque de fuerza bruta para obtener la llave, es recomendable usar números grandes, principalmente en el numero primo "p", de tal forma que sea muy difícil quebrar nuestro protocolo.
Con esto tenemos un protocolo de conocimiento publico pero de una dificultad a tomar en cuenta y con un aceptable nivel de seguridad.


domingo, 30 de junio de 2013

Nivel de Seguridad One-Time Pad

Para el programa anterior ( el One Time Pad) dejé establecido que las llaves fueran generadas totalmente al azar (basándonos en el random de python) tomando el valor "numerico" ASCII de una letra y/o número, buscando hacer las claves lo más "indescifrables" posibles.

Con la intención de verificar que tan difícil es que una llave se repita, cree este programa que nos indica cuantas veces se "genera" una misma llave, con lo cual podemos darnos una idea de que forma es mejor encriptar nuestro mensaje, basándonos en el tamaño de la llave principalmente.


Como parámetros principales debemos ingresar:

  1. Cantidad de pruebas a generar.
  2. Tamaño de la llave.
  3. Cantidad de llaves a generar.

Con lo cual el programa nos generará una lista de las coincidencias de las llaves, verificando una por una y arrojándonos la cantidad de veces que se repite esta misma llave.

Como resultado podemos observar que mientras más grande sea el tamaño de la llave, más difícil va a ser obtener llaves idénticas.

Llaves de longitud "3".

Llaves de longitud "4"


Conclusiones:

Simulando un intento de obtener las llaves para descifrar un mensaje, es comprobable que, mientas más grande sea el tamaño de la llave, mayor será el esfuerzo y tiempo necesario para obtener una llave similar.

Observación

Seria recomendable que se realizaran pruebas por medio de un programa echo en paralelo, de esta forma podríamos crear una simulación de ataque más real y, de esta forma ver que tan eficiente es una clave de "n" números con un mejor aprovechamiento de los recursos computacionales.

jueves, 27 de junio de 2013

One Time Pad - Seguridad de la Información y Criptografía

Consiste en crear N numero de llaves con las cuales encriptaremos un mensaje, el cual sera enviado a otra persona, esta otra persona obtiene un archivo con las mismas llaves las cuales usara apra desencriptar su mensaje.

El programa esta echo en Python y puedes visualizarlo aqui:

Para iniciar el el programa basta con ejecutar el siguiente comando:


Con esto obtendremos el texto encriptado.

Para desencriptarlo es suficiente con ejecutar nuevamente el programa pero ahora con el Texto encriptado.
El problema que muestra el programa es que en ocaciones el texto que ingresamos lo encripta pero al final se "come" alguna letra.
Referencias:
http://ubuntuforums.org/showthread.php?t=533716 (metodos Encriptar/Desencriptar)
http://www.ncmilitia.org/spycounterspy/fs019.html Descripción básica de One Time Pad