miércoles, 10 de julio de 2013

Cifrado de Flujo HC-256

El algoritmo de cifrado de flujo HC-256 se utiliza (al igual que los demás algoritmos de cifrado de flujo) para cifrar claves compartidas. Los cifrados de flujo se ejecutan 4 a 5 veces más rápido que un cifrado por bloques, sin embargo se han publicado pocos cifrados de flujo eficiente y seguro. 



Algoritmo HC-256 

El proceso es relativamente fácil, para cifrar se aplica la operación XOR entre el keystream y el mensaje a cifrar, el descifrado es aplicar la operación XOR entre el keystream y el texto cifrado. Para poder realizar esto hay que entender cómo generar las claves, y para todo esto es necesario el proceso descrito en los siguientes párrafos.

Para la generación del keystream es necesario:
  • Establecer una clave (K) y un vector de inicialización (IV) ambos de 256 bits
  • Se deben tener dos tablas (Tabla P y Tabla Q), cada una contiene 1024 elementos de 32 bits, cada elemento $i$ de P o Q debe ser mayor o igual que 0 pero menor que 1024.
  • El keystream (s) es generado por el algoritmo, a partir de la concatenación de las salidas ($S_{i}$), es decir $S=S_{1} || S_{2} || \dots$
Hay seis funciones utilizadas para este proceso en el algoritmo de cifrado HC-256, y hay que tomar en cuenta que para las funciones $g_{1}(x)$ y $h_{1}(x)$ se utiliza la tabla Q como caja de sustitución (S-box) y para las funciones $g_{2}(x)$ y $h_{2}(x)$ se utiliza la tabla P como caja de sustitución(S-box).


$$f_{1}(x) = (x >>> 7)\oplus(x >>> 18)\oplus(x >> 3) $$
$$f_{2}(x) = (x >>> 17)\oplus(x >>> 19)\oplus(x >> 10) $$
$$g_{1}(x, y) = (x >>> 10)\oplus(y >>> 23) + \mathrm{Q}[(x\oplus y)\mod 1024]$$
$$g_{2}(x, y) = (x >>> 10)\oplus(y >>> 23) + \mathrm{P}[(x\oplus y)\mod 1024]$$
$$h_{1}(x) = \mathrm{Q}[x_{0}] + \mathrm{Q}[256 + x_{1}] + \mathrm{Q}[512 + x_{2}] + \mathrm{Q}[768 + x_{3}]$$
$$h_{2}(x) = \mathrm{P}[x_{0}] + \mathrm{P}[256 + x_{1}] + \mathrm{P}[512 + x_{2}] + \mathrm{P}[768 + x_{3}]$$

Donde $x$ es la concatenación de caracteres de forma que crean una palabra de 32 bits es decir $x = x_{3} || x_{2} || x_{1} || x_{0}$, donde $x_{3}$ seria los bits mas representativos y $x_{0}$ los bits menos representativos.


Inicialización de proceso (Clave y Vector de Inicialización)

 El proceso de inicialización consiste en expandir la clave (K) y el vector de inicialización (IV) en las tablas P y Q, y realizar 4096 iteraciones sin generar la salida ($S_{i}$).


  • La clave (K) y el vector de inicialización (IV) se expanden en una matriz $W_{i}$ (debe ser mayor o igual a 0 y menor a 2560) de la siguiente manera:




  • Se actualiza las tablas P y Q con los valores de la matriz W.

  • Se ejecuta 4096 iteraciones del cifrado sin los valores de salida.
El proceso de inicialización se completa y esta listo para generar el keystream.

Generacion de claves (keystream)


Por cada iteracion es actualizado un elemento de una tabla y es generada una salida de 32 bits. Una caja de sustitucion (S-box) es utilizada solo para generar 1024 salidas, después de esto se actualiza la caja de sustitución (S-box) para las siguientes 1024 salidas. El proceso de generación del keystream del HC-256 es la siguiente:


Nota: El simbolo $\fbox{-}$ denota  "-"$\mod1024$.

Una vez se tenga el keystream se procede a encriptar o desencriptar como se describe al inicio.


Bibliografia

1 comentario:

  1. Me sigue confundiendo por qué usan >>> en vez de >>. ¿Hay alguna diferencia operacional?

    Faltó discutir usos, ataques y vulnerabilidades. Y un ejemplo.

    6 pts.

    ResponderEliminar