SIMD (función hash)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 27 de octubre de 2021; las comprobaciones requieren 2 ediciones .
SIMD
Creado 2008
publicado octubre de 2008
tamaño de hash 256 o 512 bits
Número de rondas cuatro
Tipo de función hash

SIMD es una función hash criptográfica  iterativa desarrollada por Gaëtan Leurent, Charles Bouillaguet, Pierre-Alain Fouque. Fue nominada como candidata a la competencia estándar SHA-3 realizada por el Instituto Nacional de Estándares y Tecnología (EE. UU.) , donde pasó a la segunda ronda [1] .

Hay dos versiones de la función hash, SIMD-256 y SIMD-512, que convierten un mensaje de longitud arbitraria en un valor hash de 256 o 512 bits, también llamado resumen de mensaje . Además, es posible definir las funciones hash SIMD-n como truncamientos de las funciones SIMD-256 y SIMD-512 para n<256 y 256<n<512 respectivamente [2] .

Según los creadores, la característica principal de la función hash es una expansión significativa del mensaje, lo que le permite protegerse del criptoanálisis diferencial [3] .

Algoritmo

Descripción general y parámetros

La parte principal de la función hash h es la función de compresión . Para calcular h(M) , el mensaje M se divide en k partes de m bits cada una. La función de compresión : se aplica iterativamente a las partes del mensaje . El estado inicial o vector de inicialización se designa y fija para cada función de la familia SIMD. El resultado final de la función hash se obtiene aplicando la función de finalización a .

La función de compresión C en el modo Davis-Meier generalmente se construye utilizando la función de cifrado de bloque : , sin embargo, se utilizan varias mejoras para la función hash SIMD.

La familia SIMD de funciones hash utiliza los siguientes parámetros:

Tamaño de hash, n Tamaño del bloque de mensajes, m Tamaño del estado interno ( ), p
SIMD-256 256 512 512
SIMD-512 512 1024 1024

El estado interno está representado por una matriz de 4x4 de palabras de 32 bits para SIMD-256 y 8x4 para SIMD-512.


Función de compresión

La función de compresión SIMD se basa en el diseño de Davis-Meyer con algunas modificaciones.

Primero, en lugar de la función de compresión , el .

En segundo lugar, en lugar de la operación XOR para y en SIMD, se utilizan varias rondas de Feistel adicionales con h como clave de entrada. Esta acción es realizada por la función .

Por lo tanto, la función de compresión se define como . Según los autores de la función hash SIMD, estas modificaciones proporcionan el mismo nivel de seguridad que el diseño original de Davis-Meyer, pero al mismo tiempo evitan algunos tipos de ataques multibloque [4] .

Extensión de mensaje

La expansión de mensajes de la función hash SIMD-256 (resp. SIMD-512) convierte un bloque de mensajes de 512 bits (resp. 1024 bits) en un mensaje extendido de 4096 bits (resp. 8192 bits) con una distancia mínima de 520 ( respectivamente .1032).

Uso de la red Feistel

El uso de la estructura Feistel por la función hash SIMD se construye de manera similar a la familia de funciones hash MD/SHA:

o en un formato más conveniente:

para SIMD-256

para SIMD-512

donde es una función lógica, es la adición de módulo y es un desplazamiento cíclico a la izquierda por bit.

Se utilizan 4 celdas Feistel paralelas para SIMD-256 (resp. 8 para SIMD-512), que interactúan entre sí debido a permutaciones . Las permutaciones se eligen para asegurar una buena mezcla.

Para SIMD-256 se define:

En consecuencia para SIMD-512:

En general, la función de compresión funciona en 4 rondas, cada una de las cuales consta de 8 pasos (pasos), más una ronda final adicional.

Función de compresión final

Una vez que se han comprimido todos los bloques del mensaje, se realiza otra llamada adicional a la función de compresión con el tamaño del mensaje como entrada. En este caso, la longitud del mensaje se calcula en módulo de bits si es necesario.

Para la función de compresión final, se utiliza un método de expansión de mensajes ligeramente modificado:

para SIMD-256 se utiliza en lugar de .

En consecuencia, para SIMD-512, en lugar de usar

Por lo tanto, el rango de mensajes extendidos para la etapa final es diferente del rango de mensajes extendidos de los bloques del cuerpo del mensaje.

Después de aplicar la función de compresión final, la salida es la siguiente representación de cadena:

para SIMD-256

para SIMD-512

En el caso de SIMD-n, se emiten los primeros n bits de SIMD-256 (n < 256) o SIMD 512 (256 < n < 512). Por ejemplo, para SIMD-384 la salida será

Vector de inicialización

Cada función hash de la familia SIMD utiliza su propio IV para evitar enlaces entre las salidas de diferentes funciones SIMD-n. El IV para la función SIMD-n se define de la siguiente manera:

IV = SIMD-Compress(0, "SIMD-(i)" v1.0, 0) donde la cadena está en ASCII rellenada con ceros e (i) es la representación decimal de n.

Valores IV para varias funciones hash de la familia SIMD:

Mejoras para la segunda ronda del concurso SHA-3

2 partes del algoritmo han sufrido cambios: permutaciones y cambios cíclicos (rotaciones) [5] .

Al elegir nuevas permutaciones, los autores de la función hash se guiaron por los siguientes criterios:


SIMD-256. Permutaciones iniciales:

Nuevas permutaciones:

donde _ Así, el número de permutaciones aumentó de 2 a 3.


SIMD-512. Permutaciones iniciales:

Nuevas permutaciones:

donde _ Así, el número de permutaciones aumentó de 4 a 7.

Pseudocódigo SIMD [6]

1: function MessageExpansion(M, f) //f marca la función de compresión final 2: si f = 0 entonces 3: y(i) = NTT(M + X127) //respectivamente X255 para SIMD-512 4: más 5: y(i) = NTT(M + X127 + X125) //respectivamente X255 + X253 para SIMD-512 6: terminar si 7: Calcule Z(i,j) aplicando los códigos internos I(185) e I(233) a y(i). 8: Calcule W(i,j) aplicando permutaciones para Z(i,j) 9: Devolver W(i,j) 10: función final once: 12: función Ronda (S, i, r) 13: S = Paso(S; W(8i+0); SI; r0; r1) 14: S = Paso(S; (W8i+1); SI; r1; r2) 15: S = Paso(S; W(8i+2); SI; r2; r3) 16: S = Paso(S; W(8i+3); SI; r3; r0) 17: S = Paso(S; W(8i+4);MAJ; r0; r1) 18: S = Paso(S; W(8i+5);MAJ; r1; r2) 19: S = Paso(S; W(8i+6);MAJ; r2; r3) 20: S = Paso(S; W(8i+7); MAJ; r3; r0) 21: volver S 22: función final 23: 24: función SIMD-Comprimir (IV, M, f) 25: W = ExpansiónMensaje(M; f) 26: S = IV x o M 27: S = Redondo(S; 0; [3; 20; 14; 27]) 28: S = Redondo(S; 1; [26; 4; 23; 11]) 29: S = Redondo(S; 2; [19; 28; 7; 22]) 30: S = Redondo(S; 3; [15; 5; 29; 9]) 31: S = Paso (S; IV(0); IF; 15; 5) 32: S = Paso (S; IV(1); IF; 5; 29) 33: S = Paso (S; IV(2); IF; 29; 9) 34: S = Paso (S; IV(3); IF; 9; 15) 35: volver S 36: función final 37: 38: función SIMD(M) 39: Dividir el mensaje M en partes M(i); 0 =<i<k. 40: M(k-1) rellenado con ceros. 41:S=IV 42: para 0 =< yo < k hacer 43: S = SIMD-Comprimir(S; M(i); 0) 44: final para 45: S = SIMD-Comprimir(S; ||M||; 1) 46: devuelve Truncar(S) 47: función final

Resultados de muestra [7]

Mensaje M SIMD-256(M)
mensaje vacio 8029e81e7320e13ed9001dc3d8021fec695b7a25cd43ad805260181c35fcaea8
0x00; 0x01; 0x02; … 0x3f 5bebdb816cd3e6c8c2b5a42867a6f41570c4b917f1d3b15aabc17f24679e6acd
Mensaje M SIMD-512 (M)
mensaje vacio 51a5af7e243cd9a5989f7792c880c4c3168c3d60c4518725fe5757d1f7a69c63

66977eaba7905ce2da5d7cfd07773725f0935b55f3efb954996689a49b6d29e0

0x00; 0x01; 0x02; … 0x3f 8851ad0a57426b4af57af3294706c0448fa6accf24683fc239871be58ca913fb

ee53e35c1dedd88016ebd131f2eb0761e97a3048de6e696787fd5f54981d6f2c

Rendimiento

Las pruebas de rendimiento independientes del algoritmo SIMD, realizadas con el banco de pruebas eBASH , mostraron los siguientes resultados (la velocidad se indica en ciclos por byte ( cpb )) [8] [3] :

UPC Núcleo i5 Núcleo 2 (45nm) Núcleo 2 (65nm)
SIMD-256 7.51 cpb 9,18 cpb 11,34 cb
SIMD-512 8,63 cpb 10.02 cbp 12.05 cpb

Al mismo tiempo, aproximadamente la mitad del tiempo de la función hash se dedica a la operación de expansión del mensaje: la Transformación teórica de números (NTT) es la parte más costosa del algoritmo en términos de rendimiento.

La función de compresión SIMD tiene una arquitectura parcialmente paralela, lo que le permite crear implementaciones eficientes del algoritmo utilizando instrucciones vectoriales ( SIMD ). Estas instrucciones están disponibles en muchas arquitecturas conocidas: SSE en x86 , AltiVec en PowerPC , IwMMXt en ARM .

En términos de requisitos de RAM, la función hash SIMD necesita memoria para almacenar el estado interno (64 bytes para SIMD-256 y 128 bytes para SIMD-512) y memoria para valores de salida NTT (4*64 = 256 bytes para SIMD-256 y 4*128 = 512 bytes para SIMD-512).

Resultados del concurso SHA-3 para SIMD

La función hash SIMD no fue seleccionada como finalista en el concurso SHA-3.

Los expertos del concurso señalaron que aunque la función hash SIMD repite en gran medida los algoritmos de las familias MD/SH, las mejoras realizadas por los autores realmente permitieron proteger SIMD de muchos tipos de ataques (por ejemplo, un ataque de colisión ). Además, los cambios realizados para la segunda ronda pudieron proteger la función hash SIMD del ataque de criptoanálisis diferencial realizado por Mendel y Nad, al que SIMD estuvo expuesto en su implementación original [9] .

Sin embargo, los altos requisitos de RAM y la disponibilidad de instrucciones SIMD para un buen rendimiento hacen que la función hash sea un mal candidato para la implementación de FPGA [10] . Principalmente por esta razón, la función hash SIMD no llegó a la etapa final de la competencia.

Notas

  1. Candidatos de la ronda 2 de SHA-3 .
  2. Descripción oficial de la función hash SIMD , p. 9.
  3. 1 2 Sitio web oficial de la función hash SIMD .
  4. Descripción oficial de la función hash SIMD , p. 7-8.
  5. Mejoras a la función hash SIMD para la segunda ronda del concurso SHA-3 , p. 1-2.
  6. Descripción oficial de la función hash SIMD , p. 22
  7. Descripción oficial de la función hash SIMD , p. 43-270.
  8. Sitio oficial de referencia de eBASH .
  9. Informe con los resultados de la segunda ronda del concurso SHA-3 .
  10. Implementación de candidatos del concurso SHA-3 en FPGA.

Literatura