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
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.