miércoles, 10 de julio de 2013

CIFRADO DE FLUJO: RABBIT

Recordando la propuesta de cifrado hecha por Vernam en 1917,los cifradores de flujo usarán:

  • Un algoritmo de cifrado basado en la función XOR.
  • Una secuencia cifrante binaria y pseudoaleatoria denominada S, que se obtiene a partir de una clave secreta K compartida por el emisor y el receptor, y un algoritmo generador determinístico.
  • El mismo algoritmo para el descifrado debido el carácter involutivo de la función XOR.

En concreto, cada bit de entrada al sistema de cifrado (mensaje en claro) se combinará, usando la función lógica XOR, con el bit correspondiente del flujo clave S, para dar lugar al bit correspondiente al flujo de salida (mensaje cifrado). El receptor hará el mismo proceso de combinación con la XOR para obtener el flujo descifrado.

Características de la secuencia cifrante S:
  • Período:
    • La clave deberá ser tanto o más larga que el mensaje. En la práctica se usará una semilla K de unos 120 a 250 bits en cada extremo del sistema para generar períodos superiores a 1035.
  • Distribución de bits:
    • La distribución de bits de unos (1s) y ceros (0s) deberá ser uniforme para que represente a una secuencia pseudoaleatoria.

ACERCA DE RABBIT
Rabbit es un algoritmo de cifrado de flujo que ha sido diseñado para un alto rendimiento en las implementaciones de software. Tanto la configuración de claves y encriptación son muy rápidos, por lo que el algoritmo es especialmente adecuado para todas las aplicaciones en las que grandes cantidades de datos o un gran número de paquetes de datos deben ser cifrados. 

Los ejemplos incluyen, pero no se limitan a, el cifrado del lado del servidor, el cifrado multimedia, cifrado de disco duro, y el cifrado en los dispositivos de recursos limitados.

DEFINICIÓN
Rabbit consiste en un generador de flujo de bits pseudoaleatoria que tiene una clave de 128 bits y un vector de inicialización (IV) de 64 bits como entrada y genera una corriente de bloques de 128 bits. El cifrado se realiza mediante la combinación de esta salida con el mensaje, utilizando la operación OR exclusiva. El descifrado se lleva a cabo exactamente de la misma manera como el cifrado.

El estado interno del cifrado de flujo se compone de 513 bits. 512 bits se dividen en ocho variables de estado de 32 bits (xj,i) y ocho variables de control de 32 bits (cj,i), donde xj,i es la variable de estado del subsistema j en la iteración i, y cj, i denota la variable de contador correspondiente. Hay un contador que lleva un bit (φ7,i), que debe ser almacenado entre iteraciones. Este bit de acarreo del contador se inicializa a cero. Las ocho variables de estado y los ocho contadores se derivan de la llave en la inicialización.


ESQUEMA DE CONFIGURACIÓN DE CLAVE (Key Setup Scheme)
El algoritmo se inicializa mediante la ampliación de la clave de 128 bits de las ocho variables de estado (xj,i) y los ocho contadores (cj,i).
La clave, K[0 .. 127], se divide en ocho subclaves:

K0 = K [0 .. 15], K1 = K [31 .. 16], ... , K7 = K [127 .. 112]

Las variables de estado y el contador se inicializa de las subclaves de la siguiente manera:
 y

*NOTA: || indica concatenación.

El sistema se repite cuatro veces, de acuerdo con la función de siguiente estado, para disminuir las correlaciones entre los bits en la clave y los bits en las variables de estado internas.

Finalmente, las variables de control (cj,i) se reinicializan de acuerdo con:

para todo j, para impedir la recuperación de la clave mediante la inversión del sistema de contador.

ESQUEMA DE CONFIGURACIÓN DEL IV (IV Setup Scheme)
El esquema de configuración IV funciona mediante la modificación del estado del contador en función de la IV. Esto se hace mediante la operación XOR IV de 64 bits en todos los 256 bits del estado del contador. Los 64 bits de la IV se denotan IV[0 .. 63]. Los contadores se modifican como:


El sistema se repite a continuación cuatro veces para que todos los bits de estado no-lineal dependan de todos los bits de IV. La modificación del contador por el IV garantiza que todos los 2^64 vectores de inicialización diferentes producirán claves de flujo únicas.

FUNCIÓN DEL SIGUIENTE ESTADO
El núcleo del algoritmo Rabbit es la iteración del sistema definido por las siguientes ecuaciones:


donde todas las adiciones son módulo 2^32.

Ilustración de la función del siguiente estado.


ESQUEMA DE CIFRADO/DESCIFRADO
Los bits extraídos son los XOR's con el texto plano/texto cifrado para cifrar/descifrar.
donde ci y pi denotan la i^th de bloques de 128-bits de texto cifrado y de texto plano, respectivamente.

CÓDIGO DE REFERENCIA EN C
A continuación se mostraran las funciones de la implementación del código de referencia de Rabbit en C (Código tomado de http://www.cryptico.com/cryptolab/reference-code.html).
Esquema de configuración de clave.

Esquema de configuración de IV.

Cifrado/Descifrado.

Ver código completo

SEGURIDAD
Rabbit reclama seguridad de 128 bits contra los atacantes cuya meta es una clave específica. Sin embargo, si el atacante dirige un gran número de claves a la vez y realmente no importa cual lo rompa, entonces el tamaño de pequeñas IV resulta en un nivel de seguridad reducido de 96 bits. Esto es debido a ataques genéricos “TMD trade-off”.

Las siguientes propiedades de seguridad se reivindican:
  • El cifrado proporciona seguridad de 128 bits, es decir, un ataque exitoso tiene que ser más eficiente 2^128 encriptaciones de prueba de Rabbit.
  • Si se utiliza el IV, la seguridad para un máximo de 2^64 IVs diferentes es proporcionado, es decir, mediante la solicitud de 2^64 IVs diferentes, el atacante no gana una ventaja por usar la misma IV.
  • Durante un ataque con éxito, el atacante tiene hasta 2^64 parejas de bloques disponibles de texto plano y texto cifrado.
REFERENCIAS

martes, 9 de julio de 2013

CIFRADO POR BLOQUES: CAST-128

CIFRADO POR BLOQUES
Los algoritmos de cifrado por bloques toman bloques de tamaño fijo del texto en claro (plaintext) y producen un bloque de tamaño fijo de texto cifrado (ciphertext), generalmente del mismo tamaño que la entrada.
El tamaño del bloque debe ser lo suficientemente grande para evitar ataques de texto cifrado. La asignación de bloques de entrada a bloques de salida debe ser uno a uno para hacer el proceso reversible y parecer aleatoria.
Para la asignación de bloques los algoritmos de cifrado simétrico realizan sustituciones y permutaciones en el texto en claro hasta obtener el texto cifrado.

ACERCA DEL CAST-128
El algoritmo fue creado en 1996 por Carlisle Adams y Stafford Tavares usando el procedimiento de diseño CAST. CAST-128 o CAST5 es el más conocido y más ampliamente utilizado sistema de cifrado por bloques CAST. 
Es usado en un gran número de productos, notablemente como cifrador por defecto en algunas versiones de GNU Privacy Guard (GPG) y Pretty Good Privacy (PGP). También ha sido aprobado por el gobierno canadiense para ser usado por el Communications Security Establishment.

DEFINICIÓN

CAST-128 es un cifrador de 12 o 16 rondas que se basa en la red de Feistel con bloques de 64 bits y tamaños de clave entre 40 y 128 bits (pero con solo incrementos de 8 bits). 
Las 16 rondas completas se usan cuando la clave tiene un tamaño mayor de 80 bits. Incluye unas largas S-Boxes de 8x32 bits basadas en funciones bent, rotaciones dependientes de clave, adición y sustracción modular y operaciones XOR. 
Hay tres tipos alternativos de funciones de ronda, pero son de estructura similar y se diferencian sólo en la elección del tipo exacto de operación (XOR, adición o sustracción) en varios puntos.

El algoritmo de cifrado completo se da en los siguientes cuatro pasos:

    1.   Calcular 16 pares de subkeys {Km[i], Kr[i]} de K (Key schedule).
    2.   Dividir el texto en claro en 2 partes de 32-bits, izquierda (L0) y derecha (R0).
          (L0,R0) <-- (m1...m64)      (L0 = m1...m32, R0 = m33...m64)
    3.   En 16 rondas, tomando i el valor de 1 a 16, se calcula Li y Ri de la siguiente manera: 

          Li = Ri-1; Ri = Li-1 ^ f(Ri-1,Kmi,Kri), (f es del Tipo 1, Tipo 2, o Tipo 3, dependiendo de             i).
    4.  Se intercambian los bloques finales (L16, R16) y se concatenan para obtener el texto            cifrado.
         c1...c64 <-- (R16,L16)

El descifrado es idéntico al algoritmo de cifrado dado anteriormente, excepto que las rondas (y por lo tanto los pares de subclave) se utilizan en el orden inverso para calcular (L0, R0) a partir de (R16, L16).



PARES DE CLAVES DE RONDA
CAST-128 utiliza un par de subclaves por ronda: una cantidad 32-bits en Km se utiliza como una clave de "enmascaramiento" y una cantidad de 5 bits en Kr se utiliza como una clave de "rotación".

RONDA NO IDENTICAS
Se utilizan 3 funciones de rondas diferentes en CAST-128:
Donde "D" es la entrada de datos a la función f y "Ia" - "Id" son el byte más significativo a través de byte menos significativo de I, respectivamente. 
Tenga en cuenta que "+" y "-" son la suma y la resta módulo 2 ** 32, "^" es bit a bit XOR, y "<<<" es la operación de desplazamiento a la izquierda circular.

          Tipo 1: I = ((Kmi + D) <<< Kri)
                        f = ((S1[Ia] ^ S2[Ib]) - S3[Ic]) + S4[Id]
          Tipo 2: I = ((Kmi ^ D) <<< Kri)
                        f = ((S1[Ia] - S2[Ib]) + S3[Ic]) ^ S4[Id]
          Tipo 3: I = ((Kmi - D) <<< Kri)
                        f = ((S1[Ia] + S2[Ib]) ^ S3[Ic]) - S4[Id]

Rondas 1, 4, 7, 10, 13, y 16 usan la función f de Tipo 1.
Rondas 2, 5, 8, 11, y 14 usan la función f de Tipo 2.
Rondas 3, 6, 9, 12, y 15 usan la función f de Tipo 3.

CAJAS DE SUSTITUCIÓN (s-boxes)
CAST-128 usa ocho cajas de sustitución: 
     s-boxes S1, S2, S3 y S4 son rondas de función s-boxes.
     s-boxes  S5, S6, S7 y S8 son cronograma clave s-boxes.
Aunque 8 s-boxes requieren un total de 8 Kbytes de almacenamiento, tenga en cuenta que sólo se requieren 4 KBytes durante el cifrado / descifrado ya que la generación subclave se realiza normalmente antes de cualquier entrada de datos.

KEY SCHEDULE
Que la clave de 128 bits se x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF, donde x0 representa el byte más significativo y xF representa el byte menos significativo.
Vamos z0 .. zF ser bytes intermedios (temporal). Que Si [] representan s-box i y dejar "^" representa además XOR.

VENTAJAS
Resistencia a ataques lineales y diferenciales:
Uno de los objetivos del procedimiento de diseño CAST es para producir sistemas de cifrado que no son vulnerables a cualquiera de criptoanálisis lineal o criptoanálisis diferencial. Estos son sólo los ataques conocidos que rompen DES con menos esfuerzo que la fuerza bruta. Más en general, son los más poderosos métodos criptográficos conocidos de atacar cifrados de bloque. Ambos, sin embargo, requiere de un gran número de textos planos conocidos o elegido, por lo que una simple defensa contra ellos es volver a introducir a menudo que el enemigo no puede recopilar textos suficientes.

CÓDIGO EN PYTHON
Ejemplo tomado de www.dlitz.net, el cifrado se puede realizar de la siguiente manera:


Mostrando como resultado:

REFERENCIAS
1. Sergio Talens-Oliang, Introducción a la Criptografía.
2. www.vocal.com, CAST (CAST-128, CAST-256)
3. C. Adams (Mayo, 1997), The CAST-128 Encryption Algorithm.

5. www.dlitz.net, Module CAST

Esteganografía

La criptografía es el arte de escribir de forma enigmática (según la Real Academia Española), mientras que la esteganografía es el arte de escribir de forma oculta. Puede que sigan pareciendo similares, pero las connotaciones toman mucho valor al analizarlo detenidamente: la criptografía tiene su fuerza en la imposibilidad de comprender el mensaje, mientras que la esteganografía la tiene en el desconocimiento de que el mensaje siquiera existe.

Aplicado al campo informático, podemos dar los siguientes ejemplos: nosotros podríamos robar un mensaje cifrado con relativa facilidad, pero aún sabiendo que contiene información importante seríamos incapaces de obtener información alguna de él (si la criptografía ha cumplido con su cometido).

Respecto a la esteganografía, nosotros podríamos capturar el tráfico completo de un individuo y tratar de analizarlo completamente (y el “ruido de fondo” hoy en día es mucho), sin tener la certeza de que haya o no un mensaje oculto.

CÓDIGO
Para esta tarea se ocultaran varios mensajes en distintas imagenes implementando la esteganografía en python.
A continuación se muestra el segmento de código que convierte el mensaje introducido por el usuario a binario y lo oculta en la imagen.

Y ahora se muestran las funciones que recuperan un mensaje oculto en una imagen, asi como los bloques de 8 bits que ocupa ese mensaje.

COMO EJECUTAR EL PROGRAMA
Para ocultar un mensaje escribir lo siguiente en terminal:

Para recuperar un mensaje oculto escribir lo siguiente en terminal:

ENCONTRAR EL MENSAJE OCULTO
Encuentra las imágenes que tienen un mensaje oculto y cual es ese mensaje.






Código completo Ver código completo

REFERENCIAS
Introducción a la Esteganografía, http://neobits.org/recursosexternos/death.pdf

miércoles, 3 de julio de 2013

Algoritmo RSA

El algoritmo fue descrito en 1977 por Ron RivestAdi Shamir y Leonard Adleman, del Instituto Tecnológico de Massachusetts (MIT); las letras RSA son las iniciales de sus apellidos.

RSA se basa en la dificultad o coste computacional para factorizar grandes números. Las claves públicas y privadas se calculan a partir  de dos primos grandes.  En este sistema se usa una clave para encriptar y otra para desencriptar. La seguridad se basa casi en la imposibilidad de deducir la clave de desencriptar a partir de la clave utilizada para encriptar.


Idea del algoritmo
  • Supongamos que Bob quiere enviar a Alicia un mensaje secreto que solo ella pueda leer.
  • Alicia envía a Bob una caja con una cerradura abierta, de la que solo Alicia tiene la llave. Bob recibe la caja, escribe el mensaje, lo pone en la caja y la cierra con su cerradura (ahora Bob no puede leer el mensaje). 
  • Bob envía la caja a Alicia y ella la abre con su llave. En este ejemplo, la caja con la cerradura es la «clave pública» de Alicia, y la llave de la cerradura es su «clave privada».
  • Técnicamente, Bob envía a Alicia un «mensaje llano» M en forma de un número m menor que otro número n, mediante un protocolo reversible conocido como padding scheme («patrón de relleno»). A continuación genera el «mensaje cifrado» c mediante la siguiente operación: 
c = m^e mod n
donde e es la clave pública de Alicia.
  • Ahora Alicia descifra el mensaje en clave c mediante la operación inversa dada por
m = c ^ d mod n
donde d es la clave privada que solo Alicia conoce.

Generación de llaves.

  1. Alicia y Bob seleccionan dos números primos suficientemente grandes, p y q.
  2. Halla N = p × q 
  3. Calcula la función indicador de Euler: Φ(N) = (p – 1)·(q – 1)
  4. Selecciona un número e menor que Φ(N) y tal que mcd(e, Φ(N)) = 1.
  5. Calcula el inverso de e en un reloj con Φ(N) horas.
  6. La clave pública está constituida por (N, e) y la secreta por (N, d).
Cifrado del mensaje.
  1. Alicia localiza la clave pública de Bob para conocer los valores de N y e
  2. Utiliza la función: C ≡ Me(mod N) siendo M del mensaje original y C del cifrado
  3. Alicia envía a Bob el criptograma C.



Descifrado del criptograma.
  1. Si Bob quiere recuperar el mensaje que ha recibido usa su clave privada d para calcular: M ≡ C d (mod N)
Implementación
A continuación se muestra el código del algoritmo implementado de RSA.
También se realizo la implementación de un cliente-servidor para probar el arlgoritmo RSA.
Servidor
Cliente

Corrida en terminal




Errores.
En el momento que el servidor quiere descifrar el mensaje que recibió del cliente este no logra descifrarlo correctamente.
El error sucede específicamente cuando la función descifrar del archivo rsa.py esta almacenando caracteres erroneos a la hora de crear el mensaje cifrado.

Referencias.

lunes, 1 de julio de 2013

Protocolo Diffie-Hellman.

El problema del logaritmo discreto fue utilizado por Diffie y Hellman como un medio seguro para el intercambio de claves entre dos usuarios a través de un canal inseguro.


EL PROBLEMA.

Alice y Bob desean ponerse desean ponerse de acuerdo sobre una clave para comunicarse criptográficamente y solo disponen de un canal al que también tiene acceso Eve. Eve tiene interceptadas las comunicaciones de Alice y Bob (Eve is eavesdropping).


  • Alice y Bob deciden que la clave será una potencia modular, y escogen la base de la potencia (g) y el módulo (p). Eve toma nota de estos números.
  • Alice elige un número (x) que mantiene en secreto, Bob también elige un número (y) secreto. Eve no conoce estos números.
  • Alice calcula la función X = g^x mod p y se la envía a Bob. Eve toma nota de este número.
  • Bob calcula la función Y = g^y mod p y se la envía a Alice. Eve toma nota de este número.
  • Alice y Bob calculan la clave con la cual se comunicaran, con el número que recibieron el uno del otro. Alice calcula k = Y^x mod p; y Bob calcula k = X^y mod p, obteniendo ambos el mismo resultado. Eve no puede calcular este número por falta de datos.
¿Cómo puede Eve encontrar la clave secreta?
Eve posee la base de la potencia (g) y el módulo (p), así como las funciones X y Y. Para poder encontrar la clave secreta que Alice y Bob utilizarán para comunicarse (k) Eve necesita encontrar (x) y (y), calculando por medio de fuerza bruta (brute force) todos y cada uno de los valores que pueden tener (x) y (y).

A continuación se muestra el desarrollo del problema hecho a mano y también en código.


Código en Python

Resultados



Descargar Código










Generación de números pseudoaleatorios

Diferencia entre números aleatorios y pseudoaleatorios

NÚMEROS ALEATORIOS.
Los números aleatorios tienen la propiedad de ser obtenidos al azar, es decir, son resultado de un proceso en el cual su resultado no es predecible ya que todo número tiene la misma probabilidad de ser elegido y la elección de uno no depende de otro.

NÚMEROS PSEUDOALEATORIOS.
Los números pseudoaleatorios son números generados en un proceso que parece producir números al azar, pero no lo hace realmente, de aquí el prefijo pseudo que quiere decir falso, ya que su generación parte de algoritmos determinísticos, lo cual quiere decir que obtendremos siempre el mismo resultado bajo las mismas condiciones iniciales. Estas condiciones se refieren a varios parámetros de arranque, siendo el valor inicial, también llamado semilla, el denominador común de todos los algoritmos.

OBJETIVO.
Se realizaron pruebas para ver que tan "aleatorios" son los números pseudoaleatorios generados por varios lenguajes de programación, los lenguajes utilizados son: C, Java, Python y Ruby.

CÓDIGO.
C

JAVA

PYTHON

RUBY

RESULTADOS.
A continuación se mostraran unas tablas con los resultados y los promedios de las 10 corridas realizadas con diferentes lenguajes de programación,generando 10,000 números pseudoaleatorios en cada corrida.


CONCLUSIÓN.
Como se ve en el gráfico anterior Ruby es el lenguaje que genero los números que están más cerca de ser aleatorios, ya que el cero y el uno tienen casi la misma probabilidad de salir en la generación de un número. Seguido de Python, Java y por ultimo C.

REFERENCIAS.
Números pseudoaleatorios. http://www.slideshare.net/albertojeca/numeros-pseudoaleatorios-y-variables-aleatorias

jueves, 27 de junio de 2013

Tarea 1. One Time Pad


El método de One-Time Pad es un tipo de algoritmos de cifrado por el que el texto en claro se combina con una clave aleatoria o «libreta» igual de larga que el texto en claro y que sólo se utiliza una vez.

Fue inventado en 1917 por el Mayor Joseph Mauborgne y Gilbert Vernam de AT&T. Claude Shannon, 25 años después, se encargó de demostrar con la teoría de la información que este cifrado cumple con ser un secreto perfecto, lo que quiere decir que el contenido del mensaje no puede aportar nada de información a un atacante.

Si la clave es verdaderamente aleatoria, nunca se reutiliza y, por supuesto, se mantiene en secreto, se puede demostrar que el método de la libreta de un solo uso es irrompible.

Método de Encriptación Método de Desencriptación Método que divide el mensaje Descargar código completo