Articulo de referencia

Remolino (función hash)

120 operations, semi-free-start collisions against 5.5 rounds in 2 120 time and semi-free-start near-collisions against 7.5 rounds in 2 128 time. {{cite conference\n | author=Fl...

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

La galaxia del remolino (M51), que inspiró el nombre del algoritmo. [ 2 ]

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 bloquesW{\displaystyle W}consta de una matriz de estados de 8×8S{\displaystyle S}de 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γ{\displaystyle \gamma }), ShiftColumns (SC oπ{\displaystyle \pi }), MixRows (MR oθ{\displaystyle \theta }) y AddRoundKey (AK oσ[k]{\displaystyle \sigma [k]}). Durante cada ronda, el nuevo estado se calcula comoS:=(AKMETRORSdoSB)(S){\displaystyle S:=\left(AK\circ MR\circ SC\circ SB\right)(S)}.

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 sobreGRAMOF(28){\displaystyle GF({2^{8}})}La 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 ).
  • {0,1}norte{\displaystyle \{0,1\}^{n}}es una cadena binaria de n bits .
  • METROnorte×metro{\displaystyle {\mathcal {M}}_{n\times m}}es una matriz de bytes de n por m .
  • F:AB{\displaystyle f:A\to B}es una función que asigna elementos del conjunto A al conjunto B.
  • ab{\displaystyle a\oplus b}es la operación XOR bit a bit dea{\displaystyle a}yb{\displaystyle b}. Sia{\displaystyle a}yb{\displaystyle b}son matrices , la operación XOR se aplica elemento a elemento (ab=do  doi,j=ai,jbi,j{\displaystyle a\oplus b=c\ \Leftrightarrow \ c_{i,j}=a_{i,j}\oplus b_{i,j}}).
  • Fgramo{\displaystyle f\circ g}es la función de composición deF{\displaystyle f}ygramo{\displaystyle g}de tal manera que(Fgramo)(incógnita)=gramo(F(incógnita)){\displaystyle \left(f\circ g\right)\left(x\right)=g\left(f\left(x\right)\right)};
  • nortek=metroαk, (metro;norte;k)Z3, metroknorte{\displaystyle {\underset {k=m}{\overset {n}{\bigcirc }}}\alpha _{k},\ \forall \left(m;n;k\right)\in \mathbb {Z} ^{3},\ m\leq k\leq n}es la repetición ascendente deαmetroαmetro+1αnorte1αnorte{\displaystyle \alpha _{m}\circ \alpha _{m+1}\circ \ldots \circ \alpha _{n-1}\circ \alpha _{n}};
  • k=nortemetroαk, (metro;norte;k)Z3, metroknorte{\displaystyle {\underset {m}{\overset {k=n}{\bigcirc }}}\alpha _{k},\ \forall \left(m;n;k\right)\in \mathbb {Z} ^{3},\ m\leq k\leq n}es la repetición descendente deαnorteαnorte1αmetro+1αmetro{\displaystyle \alpha _{n}\circ \alpha _{n-1}\circ \ldots \circ \alpha _{m+1}\circ \alpha _{m}}.

Algoritmo de remolino

El mensajeMETRO{\displaystyle M}La 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):

  1. Añadir un bit '1';
  2. Agregue tantos bits '0' como sean necesarios para que la longitud alcance un múltiplo de 256 (512256{\displaystyle 512-256});
  3. Agregue la longitud original del mensaje en bits utilizando el formato big-endian de 256 bits .

Luego, el mensaje relleno se divide ent{\displaystyle t}bloques de 512 bitsmetroi{\displaystyle m_{i}},1it{\displaystyle 1\leq i\leq t}.

Whirlpool itera el esquema de hash de Miyaguchi-Preneel sobre estos bloques [secciones 3.11 y 3.12] [ 1 ] :

ηi=μ(metroi),H0=μ(IV),Hi=W[Hi1](ηi)Hi1ηi, 1itTorbellino(METRO)μ1(Ht){\displaystyle {\begin{aligned}&{\begin{aligned}\eta _{i}&=\mu \left(m_{i}\right),\\H_{0}&=\mu \left(IV\right),\\H_{i}&=W\left[H_{i-1}\right]\left(\eta _{i}\right)\oplus H_{i-1}\oplus \eta _{i},\ 1\leq i\leq t\\\end{aligned}}\\&{\text{Whirlpool}}\left(M\right)\equiv \mu ^{-1}\left(H_{t}\right)\end{aligned}}}

Dónde:

  • μ:{0,1}512METRO8×8{\displaystyle \mu :\{0,1\}^{512}\to {\mathcal {M}}_{8\times 8}} es lafunción de conversión de cadena a matriz ;
  • μ1:METRO8×8{0,1}512{\displaystyle \mu ^{-1}:{\mathcal {M}}_{8\times 8}\to \{0,1\}^{512}}es la función de conversión de matriz a cadena ;
  • IV{\displaystyle IV}es el vector de inicialización , una cadena de 512 bits 0;
  • W{\displaystyle W}es la función de cifrado Whirlpool.

Cifrado W

La función de cifrado de bloques internaW[METRO8×8]:METRO8×8METRO8×8{\displaystyle W\left[{\mathcal {M}}_{8\times 8}\right]:{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}}[sección 3.9] [ 1 ] opera sobre una matriz de 8x8 y devuelve una matriz de 8x8 :

W[K]=(r=R1ρ[Kr])σ[K0]{\displaystyle {\begin{aligned}W\left[K\right]=\left({\underset {1}{\overset {r=R}{\bigcirc }}}\rho \left[K_{r}\right]\right)\circ \sigma \left[K_{0}\right]\end{aligned}}}

Dónde:

  • R{\displaystyle R}es el número de rondas (el estándar Whirlpool utilizaR=10{\displaystyle R=10});
  • Knorte{\displaystyle K_{n}}es la enésima clave de laK{\displaystyle K}cronograma clave;
  • ρ{\displaystyle \rho }es la función redonda.

El cronograma clave amplía el cronograma claveKMETRO8×8{\displaystyle K\in {\mathcal {M}}_{8\times 8}}en una secuencia de teclasKrMETRO8×8, 0rR{\displaystyle K_{r}\in {\mathcal {M}}_{8\times 8},\ 0\leq r\leq R}[sección 3.8] [ 1 ] :

K0=K,Kr=ρ[dor](Kr1), 1rR{\displaystyle {\begin{aligned}K_{0}&=K,\\K_{r}&=\rho \left[c^{r}\right]\left(K_{r-1}\right),\ 1\leq r\leq R\\\end{aligned}}}

Dónde:

  • dorMETRO8×8{\displaystyle c^{r}\in {\mathcal {M}}_{8\times 8}}es la matriz constante de la r-ésima ronda .

La constante redonda para la r-ésima ronda,r>0{\displaystyle r>0}, es una matrizdorMETRO8×8{\displaystyle c^{r}\in {\mathcal {M}}_{8\times 8}}, definido como:

do0,jr=S[8(r1)+j],0j<8doi,jr=0,1i<8,0j<8{\displaystyle {\begin{aligned}c_{0,j}^{r}&=S\left[8\left(r-1\right)+j\right],&0\leq j<8\\c_{i,j}^{r}&=0,&1\leq i<8,0\leq j<8\\\end{aligned}}}

Dónde:

  • SMETRO16×16{\displaystyle S\in {\mathcal {M}}_{16\times 16}}es la caja S.

Función de redondeo ρ

La función redondaρ[METRO8×8]:METRO8×8METRO8×8{\displaystyle \rho \left[{\mathcal {M}}_{8\times 8}\right]:{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}}[sección 3.7] [ 1 ] se define como:

ρ[k]=σ[k]θπγ(= AK  METROR  Sdo  SB){\displaystyle {\begin{aligned}\rho \left[k\right]&=\sigma \left[k\right]\circ \theta \circ \pi \circ \gamma \\&_{\left(=\ AK\ \circ \ MR\ \circ \ SC\ \circ \ SB\right)}\\\end{aligned}}}

Dónde:

  • γ{\displaystyle \gamma }es la capa no lineal;
  • π{\displaystyle \pi }es la permutación cíclica ;
  • θ{\displaystyle \theta }es la capa de difusión;
  • σ{\displaystyle \sigma }es la adición clave.

Capa no lineal γ (SubBytes)

La funciónγ:METRO8×8METRO8×8{\displaystyle \gamma :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} consiste en la aplicación paralela de una sustitución no lineal.ψ:incógnita(Byte)S[incógnita](Byte){\displaystyle \psi :x_{\text{(Byte)}}\to S\left[x\right]_{\text{(Byte)}}}a cada byte del argumento de forma independiente [sección 3.2] [ 1 ] :

γ(a)=b  bi,j=S[ai,j], 0i<8, 0j<8,{\displaystyle {\begin{aligned}\gamma \left(a\right)=b\ \Leftrightarrow \ b_{i,j}=S\left[a_{i,j}\right],\ 0\leq i<8,\ 0\leq j<8,\\\end{aligned}}}

Permutación cíclica π (ShiftColumns)

La permutaciónπ:METRO8×8METRO8×8{\displaystyle \pi :{\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 columnaj{\displaystyle j}se desplaza hacia abajo porj{\displaystyle j}posiciones [sección 3.3] [ 1 ] :

π(a)=b  bi,j=a((ij) mod 8), j, 0i<8, 0j<8{\displaystyle {\begin{aligned}\pi \left(a\right)=b\ \Leftrightarrow \ b_{i,j}=a_{\left(\left(i-j\right)\ {\text{mod}}\ 8\right),\ j},\ 0\leq i<8,\ 0\leq j<8\\\end{aligned}}}

Capa de difusión θ (MixBytesInRows)

La capa de difusión linealθ:METRO8×8METRO8×8{\displaystyle \theta :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} es una aplicación lineal basada en la matriz circular.do=círculo(01(16),01(16),04(16),01(16),08(16),05(16),02(16),09(16)){\displaystyle C={\text{cir}}\left(01_{(16)},01_{(16)},04_{(16)},01_{(16)},08_{(16)},05_{(16)},02_{(16)},09_{(16)}\right)}[sección 3.4] [ 1 ] :

θ(a)=ado, 0i<8, 0j<8{\displaystyle {\begin{aligned}\theta \left(a\right)=a\cdot C,\ 0\leq i<8,\ 0\leq j<8\\\end{aligned}}}

Una matriz circulantedoMETROnorte×norte{\displaystyle C\in {\mathcal {M}}_{n\times n}}se 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:

círculo(a0,a1,,anorte1)=(a0a1a2anorte1anorte1a0a1anorte2anorte2anorte1a0anorte3a1a2a3a0), anorteF28, nortenorteo simplementecírculo(a0,a1,,anorte1)=do  doi,j=a(ij) mod 8, 0i<8, 0j<8, anorteF28, nortenorte{\displaystyle {\begin{aligned}&{\text{cir}}(a_{0},a_{1},\ldots ,a_{n-1})={\begin{pmatrix}a_{0}&a_{1}&a_{2}&\cdots &a_{n-1}\\a_{n-1}&a_{0}&a_{1}&\cdots &a_{n-2}\\a_{n-2}&a_{n-1}&a_{0}&\cdots &a_{n-3}\\\vdots &\vdots &\vdots &\ddots &\vdots \\a_{1}&a_{2}&a_{3}&\cdots &a_{0}\\\end{pmatrix}},\ \forall a_{n}\in \mathbb {F} _{2^{8}},\ n\in \mathbb {N} \\&{\text{or simply}}\\&{\text{cir}}(a_{0},a_{1},\ldots ,a_{n-1})=c\ \Leftrightarrow \ c_{i,j}=a_{\left(i-j\right)\ {\text{mod}}\ 8},\ 0\leq i<8,\ 0\leq j<8,\ \forall a_{n}\in \mathbb {F} _{2^{8}},\ n\in \mathbb {N} \\\end{aligned}}}

Por ejemplo, matriz circulantedo=círculo(01(16),01(16),04(16),01(16),08(16),05(16),02(16),09(16)){\displaystyle C={\text{cir}}\left(01_{(16)},01_{(16)},04_{(16)},01_{(16)},08_{(16)},05_{(16)},02_{(16)},09_{(16)}\right)}es la matriz :

do=(01(16)01(16)04(16)01(16)08(16)05(16)02(16)09(16)09(16)01(16)01(16)04(16)01(16)08(16)05(16)02(16)02(16)09(16)01(16)01(16)04(16)01(16)08(16)05(16)05(16)02(16)09(16)01(16)01(16)04(16)01(16)08(16)08(16)05(16)02(16)09(16)01(16)01(16)04(16)01(16)01(16)08(16)05(16)02(16)09(16)01(16)01(16)04(16)04(16)01(16)08(16)05(16)02(16)09(16)01(16)01(16)01(16)04(16)01(16)08(16)05(16)02(16)09(16)01(16)){\displaystyle {\begin{aligned}C={\begin{pmatrix}01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}\\09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}\\02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}\\05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}\\08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}\\01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}\\04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}\\01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}\\\end{pmatrix}}\\\end{aligned}}}

Adición de teclas σ (AddRoundKey)

La adición de clave afínσ[METRO8×8]:METRO8×8METRO8×8{\displaystyle \sigma \left[{\mathcal {M}}_{8\times 8}\right]:{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}}consiste en la operación XOR bit a bit de una matriz clavekK8×8{\displaystyle k\in {\mathcal {K}}_{8\times 8}}:

σ[k](a)=ak{\displaystyle {\begin{aligned}\sigma \left[k\right]\left(a\right)=a\oplus k\\\end{aligned}}}

Caja de sustitución S (S-Box)

La caja SSMETRO16×16{\displaystyle S\in {\mathcal {M}}_{16\times 16}}Normalmente 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 :S=(18(16)23(16)do6(16)mi8(16)87(16)b8(16)01(16)4F(16)36(16)a6(16)d2(16)F5(16)79(16)6F(16)91(16)52(16)60(16)bdo(16)9b(16)8mi(16)a3(16)0do(16)7b(16)35(16)1d(16)mi0(16)d7(16)do2(16)2mi(16)4b(16)Fmi(16)57(16)15(16)77(16)37(16)mi5(16)9F(16)F0(16)4a(16)da(16)58(16)do9(16)29(16)0a(16)b1(16)a0(16)6b(16)85(16)bd(16)5d(16)10(16)F4(16)dob(16)3mi(16)05(16)67(16)mi4(16)27(16)41(16)8b(16)a7(16)7d(16)95(16)d8(16)Fb(16)mimi(16)7do(16)66(16)dd(16)17(16)47(16)9mi(16)doa(16)2d(16)bF(16)07(16)ad(16)5a(16)83(16)33(16)63(16)02(16)aa(16)71(16)do8(16)19(16)49(16)d9(16)F2(16)mi3(16)5b(16)88(16)9a(16)26(16)32(16)b0(16)mi9(16)0F(16)d5(16)80(16)bmi(16)dod(16)34(16)48(16)FF(16)7a(16)90(16)5F(16)20(16)68(16)1a(16)ami(16)b4(16)54(16)93(16)22(16)64(16)F1(16)73(16)12(16)40(16)08(16)do3(16)mido(16)db(16)a1(16)8d(16)3d(16)97(16)00(16)doF(16)2b(16)76(16)82(16)d6(16)1b(16)b5(16)aF(16)6a(16)50(16)45(16)F3(16)30(16)miF(16)3F(16)55(16)a2(16)mia(16)65(16)ba(16)2F(16)do0(16)dmi(16)1do(16)Fd(16)4d(16)92(16)75(16)06(16)8a(16)b2(16)mi6(16)0mi(16)1F(16)62(16)d4(16)a8(16)96(16)F9(16)do5(16)25(16)59(16)84(16)72(16)39(16)4do(16)5mi(16)78(16)38(16)8do(16)d1(16)a5(16)mi2(16)61(16)b3(16)21(16)9do(16)1mi(16)43(16)do7(16)Fdo(16)04(16)51(16)99(16)6d(16)0d(16)Fa(16)dF(16)7mi(16)24(16)3b(16)ab(16)domi(16)11(16)8F(16)4mi(16)b7(16)mib(16)3do(16)81(16)94(16)F7(16)b9(16)13(16)2do(16)d3(16)mi7(16)6mi(16)do4(16)03(16)56(16)44(16)7F(16)a9(16)2a(16)bb(16)do1(16)53(16)ddo(16)0b(16)9d(16)6do(16)31(16)74(16)F6(16)46(16)ado(16)89(16)14(16)mi1(16)16(16)3a(16)69(16)09(16)70(16)b6(16)d0(16)mid(16)dodo(16)42(16)98(16)a4(16)28(16)5do(16)F8(16)86(16)){\displaystyle {\begin{aligned}&S={\begin{pmatrix}18_{(16)}&23_{(16)}&c6_{(16)}&e8_{(16)}&87_{(16)}&b8_{(16)}&01_{(16)}&4f_{(16)}&36_{(16)}&a6_{(16)}&d2_{(16)}&f5_{(16)}&79_{(16)}&6f_{(16)}&91_{(16)}&52_{(16)}\\60_{(16)}&bc_{(16)}&9b_{(16)}&8e_{(16)}&a3_{(16)}&0c_{(16)}&7b_{(16)}&35_{(16)}&1d_{(16)}&e0_{(16)}&d7_{(16)}&c2_{(16)}&2e_{(16)}&4b_{(16)}&fe_{(16)}&57_{(16)}\\15_{(16)}&77_{(16)}&37_{(16)}&e5_{(16)}&9f_{(16)}&f0_{(16)}&4a_{(16)}&da_{(16)}&58_{(16)}&c9_{(16)}&29_{(16)}&0a_{(16)}&b1_{(16)}&a0_{(16)}&6b_{(16)}&85_{(16)}\\bd_{(16)}&5d_{(16)}&10_{(16)}&f4_{(16)}&cb_{(16)}&3e_{(16)}&05_{(16)}&67_{(16)}&e4_{(16)}&27_{(16)}&41_{(16)}&8b_{(16)}&a7_{(16)}&7d_{(16)}&95_{(16)}&d8_{(16)}\\fb_{(16)}&ee_{(16)}&7c_{(16)}&66_{(16)}&dd_{(16)}&17_{(16)}&47_{(16)}&9e_{(16)}&ca_{(16)}&2d_{(16)}&bf_{(16)}&07_{(16)}&ad_{(16)}&5a_{(16)}&83_{(16)}&33_{(16)}\\63_{(16)}&02_{(16)}&aa_{(16)}&71_{(16)}&c8_{(16)}&19_{(16)}&49_{(16)}&d9_{(16)}&f2_{(16)}&e3_{(16)}&5b_{(16)}&88_{(16)}&9a_{(16)}&26_{(16)}&32_{(16)}&b0_{(16)}\\e9_{(16)}&0f_{(16)}&d5_{(16)}&80_{(16)}&be_{(16)}&cd_{(16)}&34_{(16)}&48_{(16)}&ff_{(16)}&7a_{(16)}&90_{(16)}&5f_{(16)}&20_{(16)}&68_{(16)}&1a_{(16)}&ae_{(16)}\\b4_{(16)}&54_{(16)}&93_{(16)}&22_{(16)}&64_{(16)}&f1_{(16)}&73_{(16)}&12_{(16)}&40_{(16)}&08_{(16)}&c3_{(16)}&ec_{(16)}&db_{(16)}&a1_{(16)}&8d_{(16)}&3d_{(16)}\\97_{(16)}&00_{(16)}&cf_{(16)}&2b_{(16)}&76_{(16)}&82_{(16)}&d6_{(16)}&1b_{(16)}&b5_{(16)}&af_{(16)}&6a_{(16)}&50_{(16)}&45_{(16)}&f3_{(16)}&30_{(16)}&ef_{(16)}\\3f_{(16)}&55_{(16)}&a2_{(16)}&ea_{(16)}&65_{(16)}&ba_{(16)}&2f_{(16)}&c0_{(16)}&de_{(16)}&1c_{(16)}&fd_{(16)}&4d_{(16)}&92_{(16)}&75_{(16)}&06_{(16)}&8a_{(16)}\\b2_{(16)}&e6_{(16)}&0e_{(16)}&1f_{(16)}&62_{(16)}&d4_{(16)}&a8_{(16)}&96_{(16)}&f9_{(16)}&c5_{(16)}&25_{(16)}&59_{(16)}&84_{(16)}&72_{(16)}&39_{(16)}&4c_{(16)}\\5e_{(16)}&78_{(16)}&38_{(16)}&8c_{(16)}&d1_{(16)}&a5_{(16)}&e2_{(16)}&61_{(16)}&b3_{(16)}&21_{(16)}&9c_{(16)}&1e_{(16)}&43_{(16)}&c7_{(16)}&fc_{(16)}&04_{(16)}\\51_{(16)}&99_{(16)}&6d_{(16)}&0d_{(16)}&fa_{(16)}&df_{(16)}&7e_{(16)}&24_{(16)}&3b_{(16)}&ab_{(16)}&ce_{(16)}&11_{(16)}&8f_{(16)}&4e_{(16)}&b7_{(16)}&eb_{(16)}\\3c_{(16)}&81_{(16)}&94_{(16)}&f7_{(16)}&b9_{(16)}&13_{(16)}&2c_{(16)}&d3_{(16)}&e7_{(16)}&6e_{(16)}&c4_{(16)}&03_{(16)}&56_{(16)}&44_{(16)}&7f_{(16)}&a9_{(16)}\\2a_{(16)}&bb_{(16)}&c1_{(16)}&53_{(16)}&dc_{(16)}&0b_{(16)}&9d_{(16)}&6c_{(16)}&31_{(16)}&74_{(16)}&f6_{(16)}&46_{(16)}&ac_{(16)}&89_{(16)}&14_{(16)}&e1_{(16)}\\16_{(16)}&3a_{(16)}&69_{(16)}&09_{(16)}&70_{(16)}&b6_{(16)}&d0_{(16)}&ed_{(16)}&cc_{(16)}&42_{(16)}&98_{(16)}&a4_{(16)}&28_{(16)}&5c_{(16)}&f8_{(16)}&86_{(16)}\\\end{pmatrix}}\\\end{aligned}}}

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 linealθ{\displaystyle \theta }Se 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. 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 )
  2. 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 .
  3. 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 )
  4. 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 )
  5. 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
  6. "Whirlpool" . Documentación de VeraCrypt . IDRIX . Consultado el 9 de agosto de 2018 .
  • 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