Función Hash SHA-1

El algoritmo Secure Hash (SHA-1) es la función de resumen de mensajes más utilizada de la familia MD4. Aunque se han propuesto nuevos ataques contra el algoritmo, es muy instructivo mirar sus detalles porque las versiones más fuertes en la familia SHA-2 muestran una estructura interna muy similar.

Las rondas de SHA-1 son bastante similares a un cifrado de bloques Feistel.

SHA-1 produce una salida de 160 bits de un mensaje con una longitud máxima de 264 bits. Antes del cálculo del hash, el algoritmo tiene que preprocesar el mensaje.


Preprocesamiento

Antes del cálculo de hash real, el mensaje X tiene que ser rellenado para ajustarse a un tamaño de un múltiplo de 512 bits. Para el procesamiento interno, el mensaje rellenado debe entonces dividirse en bloques. Además, el valor inicial se establece en una constante predefinida.

Padding

Supongamos que tenemos un mensaje X con una longitud de l bits. Para obtener un tamaño de mensaje global de un múltiplo de 512 bits, añadimos un "1" seguido de k bits cero y la representación binaria de 64 bits de l. Por consiguiente, el número de ceros requeridos k viene dado por:

K ≡ 512-64-1-l = 448- (l+1) mod 512.

La figura 1 ilustra el relleno de un mensaje x.

Figura 1: Relleno de un mensaje X

Ejemplo 1. Dado el mensaje abc que consta de tres caracteres ASCII de 8 bits con una longitud total de bits:

Figura 2: Representación binaria de "abc"

Agregamos un "1" seguido de bits cero, donde k está determinado por:

Finalmente, añadimos el valor de 64 bits que contiene la representación binaria de la longitud . El mensaje rellenado es entonces dado por:

Figura 3: Relleno de un mensaje

Dividir el mensaje rellenado

Antes de aplicar la función de compresión, se necesita dividir el mensaje en bloques de 512 bits . Cada bloque de 512 bits se puede subdividir en 16 palabras de tamaño de 32 bits. Por ejemplo, el i-ésimo bloque del mensaje x se divide en:

xi= (xi(0)xi(1)...xi(15))

donde son palabras de 32 bits.

Valor inicial H0

Se utiliza un búfer de 160 bits para contener el valor de hash inicial para la primera iteración. Las cinco palabras de 32 bits son fijas y se dan en notación hexadecimal:


Cálculo Hash

Cada bloque de mensajes se procesa en cuatro etapas con 20 rondas cada una como se muestra en la Figura 5. El algoritmo utiliza:

  1. Un programa de mensajes que calcula una palabra de 32 bits para cada una de las 80 rondas. Las palabras se derivan del bloque de mensaje de 512 bits como sigue:
    Figura 4

    Donde indica un desplazamiento circular a la izquierda de la palabra X por n posiciones de bit.
  2. Cinco registros de trabajo de tamaño de 32 bits: , , , ,
  3. Un valor de hash que consta de cinco palabras de 32 bits , , , , . Al principio, el valor hash contiene el valor inicial , que se sustituye por un nuevo valor hash después del procesamiento de cada bloque de mensaje. El valor final hash es igual a la salida h(x) de SHA-1.
Figura 5

Las cuatro etapas SHA-1 tienen una estructura similar pero utilizan diferentes funciones internas y constantes , donde . Cada etapa está compuesta de 20 rondas, donde partes del bloque de mensajes son procesadas por la función junto con algunas constantes dependientes de la etapa . La salida después de 80 rondas se agrega al valor de entrada en forma de palabras.

La operación de la ronda j en la etapa t viene dada por:

Figura 6

Y como se muestra en la figura 7. Las funciones internas y constantes cambian:

Figura 7

Dependiendo de la etapa de acuerdo con la Tabla 1, es decir, cada 20 rondas se está utilizando una nueva función y una nueva constante. La función sólo utiliza operaciones booleanas bit a bit, es decir, AND lógico (∧), OR (∨), NOT (barra superior) y XOR. Estas operaciones se aplican a variables de 32 bits y son muy rápidas de implementar en PCs modernas.

Tabla 1

Referencias

  1. Paar C., Pelzl J.. (2010). Understanding Cryptography. Nueva York: Springer-Verlag Berlin Heidelberg. pp.307-311