En informática y criptografía , Whirlpool (a veces escrito WHIRLPOOL ) es una función hash criptográfica . Fue diseñada por Vincent Rijmen (cocreador del Estándar de Cifrado Avanzado ) y Paulo SLM Barreto , quien la describió por primera vez en 2000. Recibe su nombre de la galaxia Whirlpool en Canes Venatici ( M51 o NGC 5194 ), la primera en tener una estructura espiral reconocida por William Parsons , tercer conde de Rosse, en abril de 1845 [ 1 ] .
El hash ha sido recomendado por el proyecto NESSIE . También ha sido adoptado por la Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC) como parte de la norma internacional conjunta ISO/IEC 10118-3 .
Características de diseño

Whirlpool es una función hash diseñada a partir del cifrado por bloques Square , y se considera que pertenece a esa familia de funciones de cifrado por bloques.
Whirlpool es una construcción Miyaguchi-Preneel basada en un Estándar de Cifrado Avanzado (AES) sustancialmente modificado.
Whirlpool toma un mensaje de cualquier longitud menor a 2256 bits y devuelve un resumen del mensaje de 512 bits . [ 3 ]
Los autores han declarado que
- "WHIRLPOOL no está (ni estará nunca) patentado . Puede utilizarse gratuitamente para cualquier fin." [ 2 ]
Cambios de versión
La versión original de Whirlpool se llamará Whirlpool-0 , la primera revisión de Whirlpool se llamará Whirlpool-T y la última versión se llamará Whirlpool en los siguientes vectores de prueba.
- En la primera revisión de 2001, la caja S se modificó, pasando de ser una generada aleatoriamente con buenas propiedades criptográficas a una que posee mejores propiedades criptográficas y es más fácil de implementar en hardware.
- En la segunda revisión (2003), se encontró un fallo en la matriz de difusión que redujo la seguridad estimada del algoritmo por debajo de su potencial. [ 4 ] Cambiar las constantes de la matriz rotatoria de 8x8 de (1, 1, 3, 1, 5, 8, 9, 5) a (1, 1, 4, 1, 8, 5, 2, 9) resolvió este problema.
Estructura interna
La función hash Whirlpool es una construcción Merkle-Damgård basada en un cifrado de bloques W similar a AES en modo Miyaguchi-Preneel . [ 2 ]
El cifrado por bloquesconsta de una matriz de estados de 8×8de bytes, para un total de 512 bits.
El proceso de cifrado consiste en actualizar el estado con cuatro funciones de ronda durante 10 rondas. Las cuatro funciones de ronda son SubBytes (SB o), ShiftColumns (SC o), MixRows (MR o) y AddRoundKey (AK o). Durante cada ronda, el nuevo estado se calcula como.
Subbytes
La operación SubBytes aplica una permutación no lineal (la caja S) a cada byte del estado de forma independiente. La caja S de 8 bits se compone de 3 cajas S más pequeñas de 4 bits.
Columnas de desplazamiento
La operación ShiftColumns desplaza cíclicamente cada byte en cada columna del estado. Los bytes de la columna j se desplazan hacia abajo j posiciones.
Mezclar bytes en filas
La operación MixBytesInRows es una multiplicación derecha de cada fila por una matriz de 8×8 sobreLa matriz se elige de tal manera que el número de ramas (una propiedad importante al considerar la resistencia al criptoanálisis diferencial ) sea 9, que es el máximo.
Agregar tecla redonda
La operación AddRoundKey utiliza la operación XOR bit a bit para añadir una clave calculada mediante la programación de claves al estado actual. La programación de claves es idéntica al cifrado en sí, salvo que la función AddRoundKey se sustituye por una función AddRoundConstant que añade una constante predeterminada en cada ronda.
Proceso completo del algoritmo de Whirlpool
Aquí está la explicación detallada del algoritmo Whirlpool tal como se describe en el documento de lanzamiento oficial [ 1 ] .
Primero, definamos la notación utilizada:
- Cada número utilizado es un entero de 8 bits (1 byte ).
- es una cadena binaria de n bits .
- es una matriz de bytes de n por m .
- es una función que asigna elementos del conjunto A al conjunto B.
- es la operación XOR bit a bit dey. Siyson matrices , la operación XOR se aplica elemento a elemento ().
- es la función de composición deyde tal manera que;
- es la repetición ascendente de;
- es la repetición descendente de.
Algoritmo de remolino
El mensajeLa cadena que se va a hashear primero se rellena para asegurar que su longitud sea un múltiplo del tamaño del bloque (512 bits). Esto se hace utilizando el esquema de relleno estándar definido en la norma ISO/IEC 10118-1 (el mismo que se usa para md5 , sha-2 y otros):
- Añadir un bit '1';
- Agregue tantos bits '0' como sean necesarios para que la longitud alcance un múltiplo de 256 ();
- Agregue la longitud original del mensaje en bits utilizando el formato big-endian de 256 bits .
Luego, el mensaje relleno se divide enbloques de 512 bits,.
Whirlpool itera el esquema de hash de Miyaguchi-Preneel sobre estos bloques [secciones 3.11 y 3.12] [ 1 ] :
Dónde:
Cifrado W
La función de cifrado de bloques interna[sección 3.9] [ 1 ] opera sobre una matriz de 8x8 y devuelve una matriz de 8x8 :
Dónde:
- es el número de rondas (el estándar Whirlpool utiliza);
- es la enésima clave de lacronograma clave;
- es la función redonda.
El cronograma clave amplía el cronograma claveen una secuencia de teclas[sección 3.8] [ 1 ] :
Dónde:
- es la matriz constante de la r-ésima ronda .
La constante redonda para la r-ésima ronda,, es una matriz, definido como:
Dónde:
- es la caja S.
Función de redondeo ρ
La función redonda[sección 3.7] [ 1 ] se define como:
Dónde:
- es la capa no lineal;
- es la permutación cíclica ;
- es la capa de difusión;
- es la adición clave.
Capa no lineal γ (SubBytes)
La función :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} consiste en la aplicación paralela de una sustitución no lineal.a cada byte del argumento de forma independiente [sección 3.2] [ 1 ] :
Permutación cíclica π (ShiftColumns)
La permutación :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} desplaza cíclicamente cada columna de su argumento de forma independiente, de modo que la columnase desplaza hacia abajo porposiciones [sección 3.3] [ 1 ] :
Capa de difusión θ (MixBytesInRows)
La capa de difusión lineal :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} es una aplicación lineal basada en la matriz circular.[sección 3.4] [ 1 ] :
Una matriz circulantese define como una matriz donde cada fila es un desplazamiento cíclico de la fila anterior [sección 2.2] [ 1 ] . Formalmente, una matriz circulante se puede representar como:
Por ejemplo, matriz circulantees la matriz :
Adición de teclas σ (AddRoundKey)
La adición de clave afínconsiste en la operación XOR bit a bit de una matriz clave:
Caja de sustitución S (S-Box)
La caja SNormalmente se representa como una tabla de búsqueda , donde cada byte de entrada se asigna a un byte de salida correspondiente . Se puede calcular utilizando técnicas de generación de mapeo de difusión óptimo [sección 2.4] [ 1 ] , pero aquí se muestra una representación matricial :
Hash de Whirlpool
El algoritmo Whirlpool ha sufrido dos revisiones desde su especificación original de 2000.
Quienes incorporen Whirlpool probablemente usarán la versión más reciente. Si bien no se conocen vulnerabilidades de seguridad en versiones anteriores, la versión más reciente ofrece una mejor eficiencia en la implementación del hardware y, además, es probable que sea más segura. Como se mencionó anteriormente, esta es también la versión adoptada en la norma internacional ISO/IEC 10118-3 .
Los hashes de Whirlpool de 512 bits (64 bytes), también denominados resúmenes de mensajes , se representan normalmente como números hexadecimales de 128 dígitos . A continuación se muestra una entrada ASCII de 43 bytes (sin incluir las comillas) y los hashes de Whirlpool correspondientes:
Implementaciones
Los autores proporcionan implementaciones de referencia del algoritmo Whirlpool, incluyendo una versión escrita en C y otra en Java . [ 2 ] Estas implementaciones de referencia se han publicado en el dominio público. [ 2 ]
Sin embargo, las investigaciones sobre el análisis de seguridad de la función Whirlpool han revelado que, en promedio, la introducción de 8 fallos aleatorios es suficiente para comprometer el mensaje hash Whirlpool de 512 bits que se procesa y la clave secreta de HMAC-Whirlpool en el contexto de la Nube de Cosas (CoT). Esto subraya la necesidad de reforzar las medidas de seguridad en su implementación. [ 5 ]
Pseudocódigo
Aquí se muestra un ejemplo de implementación del algoritmo estándar de Whirlpool :
S := 0x18, 0x23, 0xc6, 0xe8, 0x87, 0xb8, 0x01, 0x4f, 0x36, 0xa6, 0xd2, 0xf5, 0x79, 0x6f, 0x91, 0x52, \ 0x60, 0xbc, 0x9b, 0x8e, 0xa3, 0x0c, 0x7b, 0x35, 0x1d, 0xe0, 0xd7, 0xc2, 0x2e, 0x4b, 0xfe, 0x57, \ 0x15, 0x77, 0x37, 0xe5, 0x9f, 0xf0, 0x4a, 0xda, 0x58, 0xc9, 0x29, 0x0a, 0xb1, 0xa0, 0x6b, 0x85, \ 0xbd, 0x5d, 0x10, 0xf4, 0xcb, 0x3e, 0x05, 0x67, 0xe4, 0x27, 0x41, 0x8b, 0xa7, 0x7d, 0x95, 0xd8, \ 0xfb, 0xee, 0x7c, 0x66, 0xdd, 0x17, 0x47, 0x9e, 0xca, 0x2d, 0xbf, 0x07, 0xad, 0x5a, 0x83, 0x33, \ 0x63, 0x02, 0xaa, 0x71, 0xc8, 0x19, 0x49, 0xd9, 0xf2, 0xe3, 0x5b, 0x88, 0x9a, 0x26, 0x32, 0xb0, \ 0xe9, 0x0f, 0xd5, 0x80, 0xbe, 0xcd, 0x34, 0x48, 0xff, 0x7a, 0x90, 0x5f, 0x20, 0x68, 0x1a, 0xae, \ 0xb4, 0x54, 0x93, 0x22, 0x64, 0xf1, 0x73, 0x12, 0x40, 0x08, 0xc3, 0xec, 0xdb, 0xa1, 0x8d, 0x3d, \ 0x97, 0x00, 0xcf, 0x2b, 0x76, 0x82, 0xd6, 0x1b, 0xb5, 0xaf, 0x6a, 0x50, 0x45, 0xf3, 0x30, 0xef, \ 0x3f, 0x55, 0xa2, 0xea, 0x65, 0xba, 0x2f, 0xc0, 0xde, 0x1c, 0xfd, 0x4d, 0x92, 0x75, 0x06, 0x8a, \ 0xb2, 0xe6, 0x0e, 0x1f, 0x62, 0xd4, 0xa8, 0x96, 0xf9, 0xc5, 0x25, 0x59, 0x84, 0x72, 0x39, 0x4c, \ 0x5e, 0x78, 0x38, 0x8c, 0xd1, 0xa5, 0xe2, 0x61, 0xb3, 0x21, 0x9c, 0x1e, 0x43, 0xc7, 0xfc, 0x04, \ 0x51, 0x99, 0x6d, 0x0d, 0xfa, 0xdf, 0x7e, 0x24, 0x3b, 0xab, 0xce, 0x11, 0x8f, 0x4e, 0xb7, 0xeb, \ 0x3c, 0x81, 0x94, 0xf7, 0xb9, 0x13, 0x2c, 0xd3, 0xe7, 0x6e, 0xc4, 0x03, 0x56, 0x44, 0x7f, 0xa9, \ 0x2a, 0xbb, 0xc1, 0x53, 0xdc, 0x0b, 0x9d, 0x6c, 0x31, 0x74, 0xf6, 0x46, 0xac, 0x89, 0x14, 0xe1, \ 0x16, 0x3a, 0x69, 0x09, 0x70, 0xb6, 0xd0, 0xed, 0xcc, 0x42, 0x98, 0xa4, 0x28, 0x5c, 0xf8, 0x86 C := 0x01, 0x01, 0x04, 0x01, 0x08, 0x05, 0x02, 0x09, \ 0x09, 0x01, 0x01, 0x04, 0x01, 0x08, 0x05, 0x02, \ 0x02, 0x09, 0x01, 0x01, 0x04, 0x01, 0x08, 0x05, \ 0x05, 0x02, 0x09, 0x01, 0x01, 0x04, 0x01, 0x08, \ 0x08, 0x05, 0x02, 0x09, 0x01, 0x01, 0x04, 0x01, \ 0x01, 0x08, 0x05, 0x02, 0x09, 0x01, 0x01, 0x04, \ 0x04, 0x01, 0x08, 0x05, 0x02, 0x09, 0x01, 0x01, \ 0x01, 0x04, 0x01, 0x08, 0x05, 0x02, 0x09, 0x01 # Matriz construida a partir del vector de inicialización IM := 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0 R := 10 función obtenerMatrizRedondeadaConstante(r) cr := IM para j de 0 a 7 cr[j] := S[8 * (r - 1) + j] fin para devolver cr fin de la función func whirlpoolRound(matriz, clave) # Aplicar la transformación no lineal γ para i de 0 a 7 para j de 0 a 7 matriz[i * 8 + j] = S[matriz[i * 8 + j]] fin para fin para # Aplicar permutación cíclica π tmp := matriz para i de 0 a 7 para j de 0 a 7 # '+ 8' para evitar índices negativos matriz[i * 8 + j] = tmp[((i - j + 8) % 8) * 8 + j] fin para fin para matriz := tmp # Aplicar difusión lineal θ matriz := producto escalar(matriz, C) # Aplicar suma de clave σ[clave] matriz := matriz xor clave matriz de retorno fin de la función función remolino(M) m, t := pad(M) # Devuelve (mensajerellenadodivididoenfragmentos, cantidaddefragmentos) H := IM para i desde 0 hasta t W := m[t] Kr := H W := W xor H para r de 1 a R cr := getConstantRoundMatrix(r) Kr := whirlpoolRound(Kr, cr) W := remolinoRedondeado(W, Kr) fin para H := H xor W H := H xor m[t] fin para devolver matrixToHexString(H) fin de la función
Para la difusión linealSe requiere una multiplicación de matrices . La aritmética de campos de Galois se puede utilizar para escribir este algoritmo de multiplicación :
función producto escalar(A, B) tmp: Matriz para i de 0 a 7 para j de 0 a 7 tmp[i * 8 + j] := 0 para k de 0 a 7 # Multiplicación del campo de Galois (2^8) a := A[i * 8 + k]; b := B[k * 8 + j]; producto := 0; mientras b > 0 si b y 1 == 1 producto := producto xor a fin si si a & 0x80 != 0 a := (a << 1) xor 0x11d # x^8 + x^4 + x^3 + x^2 + 1 demás a := a << 1 fin si b := b >> 1 fin mientras tmp[i * 8 + j] := tmp[i * 8 + j] producto xor fin para fin para fin para devolver tmp fin de la función
Aquí se muestra una implementación del relleno de 512 bits (tamaño de 64 bits, big-endian ) :
panel de función(M) longitud_original := len(M) # En bytes # 512 bits (longitud total) - 256 bits (longitud del tamaño) - 1 bit (bit de relleno) # 64 bytes - 32 bytes - 1 byte = 31 bytes relleno := (31 - longitud_original) % 64 relleno := (relleno + 64) % 64 # Evitar relleno negativo longitud_total := longitud_original + 1 + relleno + 32 # En bytes relleno: Byte[longitud_total] # Copiar mensaje original para i desde 0 hasta longitud_original - 1 relleno[i] := M[i] fin para relleno[longitud_original] := 0x80 # Añadir el bit '1', luego 7 bits '0' para i desde original_length + 1 hasta original_length + relleno relleno[i] := 0x00 # Añadir 8 bits '0' fin para para i de 0 a 31 relleno[longitud_total - 32 + i] := (longitud_original * 8) >> (8 * (31 - i)) & 0xff fin para cantidad_de_trozos := longitud_total / 64 dividido := Byte[cantidad_de_fragmento][64] para i desde 0 hasta chunk_amount - 1 para j de 0 a 63 dividido[i][j] := relleno[i * 64 + j] fin para fin para devolver dividido, cantidad_de_trozo fin de la función
Y aquí tenéis un ejemplo de conversión de matriz a cadena de caracteres :
función matrixToHexString(matriz) HEX := "0123456789abcdef" resultado: Byte[128] para i de 0 a 63 byte := matriz[i] resultado[i * 2] := HEX[byte >> 4] resultado[i * 2 + 1] := HEX[byte & 0xf] fin para devolver resultado fin de la función
Adopción
Dos de los primeros programas criptográficos de uso generalizado que comenzaron a utilizar Whirlpool fueron FreeOTFE , seguido de TrueCrypt en 2005.
VeraCrypt (una bifurcación de TrueCrypt ) incluyó Whirlpool (la versión final) como uno de sus algoritmos hash compatibles. [ 6 ]
Véase también
Referencias
- 1 2 3 4 5 6 7 8 9 10 11 12 Florian Mendel1, Christian Rechberger, Martin Schläffer, Søren S. Thomsen (2009-02-24). El ataque de rebote: criptoanálisis de Whirlpool reducido y Grøstl (PDF) . Cifrado de software rápido: 16.º taller internacional.
{{cite conference}}: CS1 maint: nombres múltiples: lista de autores ( enlace ) CS1 maint: nombres numéricos: lista de autores ( enlace ) - 1 2 3 4 5 Paulo SLM Barreto (25-11-2008). "La función hash WHIRLPOOL" . Archivado del original el 29-11-2017 . Recuperado el 09-08-2018 .
- ↑ Barreto, Paulo SLM y Rijmen, Vincent (24 de mayo de 2003). "La función hash WHIRLPOOL" . Archivado del original (ZIP) el 26 de octubre de 2017. Recuperado el 9 de agosto de 2018 .
{{cite journal}}: Para citar una revista se requiere|journal=( ayuda ) - ↑ Kyoji, Shibutani y Shirai, Taizo (11 de marzo de 2003). "Sobre la matriz de difusión empleada en la función hash Whirlpool" (PDF) . Consultado el 9 de agosto de 2018 .
{{cite journal}}: Para citar una revista se requiere|journal=( ayuda ) - ↑ Li, W., Gao, Z., Gu, D., Ge, C., Liao, L., Zhou, Z., Liu, Y., & Liu, Z. (2017). Análisis de seguridad de la función hash Whirlpool en la nube de las cosas. KSII Transactions on Internet and Information Systems, 11(1), 536–551. https://doi.org/10.3837/tiis.2017.01.028
- ↑ "Whirlpool" . Documentación de VeraCrypt . IDRIX . Consultado el 9 de agosto de 2018 .
Enlaces externos
- La función hash WHIRLPOOL en Wayback Machine (archivada el 29/11/2017)
- Jacksum en SourceForge , una implementación en Java de las tres revisiones de Whirlpool.
- Whirlpool en GitHub : una implementación de código abierto en Go de la última revisión de Whirlpool.
- Implementación en Matlab de la función hash de Whirlpool
- RHash , una herramienta de línea de comandos de código abierto , que puede calcular y verificar el hash de Whirlpool.
- Módulo Perl Whirlpool en CPAN
- Módulo Digest que implementa el algoritmo de hash Whirlpool en Ruby.
- Ironclad es un paquete de criptografía Common Lisp que contiene una implementación de Whirlpool.
- La norma ISO/IEC 10118-3:2004
- Vectores de prueba para el hash Whirlpool del proyecto NESSIE
- Implementación de C# gestionada
- Módulo Python Whirlpool
- funciones hash criptográficas