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

2 comentarios:

  1. ¿Sabes qué querrán decir con <<< en la gráfica? << es un bit-shift, pero <<< para mí es un misterio.

    Hubiera sido bueno incluir un pequeño ejemplo de cómo se produce un stream de ciphertext dado un stream de plaintext.

    7 pts.

    ResponderEliminar
  2. Según tengo entendido el << bit-shift desplaza la cantidad de bits indicados, rellena con ceros y mantiene el bit signo; en cambio, el <<< bit-wise rotation hace lo mismo pero sin rellenar con ceros,y sin mantener el bit signo.

    Ejemplos:
    int x = 7; binario 00000000 00000111
    x = x << 1; binario 00000000 00001110


    int mascara = 256; binario 00000001 00000000
    int resp = mascara >>> 2; binario 00000000 01000000

    ResponderEliminar