CubeHash [ 1 ] es una función hash criptográfica presentada a la competición de funciones hash del NIST por Daniel J. Bernstein . CubeHash tiene un estado de 128 bytes, utiliza una construcción de tubería ancha y se basa en ARX . Los bloques de mensajes se combinan mediante XOR con los bits iniciales de un estado de 128 bytes, que luego pasa por una transformación biyectiva de r rondas entre bloques. La propuesta inicial del NIST ("Cubehash8/1") requería aproximadamente 200 ciclos por byte . [ 2 ] Tras las aclaraciones del NIST, el autor cambió la propuesta a Cubehash16/32, que "es aproximadamente 16 veces más rápida que CubeHash8/1, alcanzando fácilmente tanto a SHA-256 como a SHA-512 en la plataforma de referencia" manteniendo un "margen de seguridad cómodo". [ 3 ]
CubeHash avanzó a la segunda ronda de la competencia, pero no fue seleccionado como uno de los 5 finalistas. Según el NIST, tiene un diseño simple y bien definido, adecuado para entornos con recursos limitados. Sin embargo, su rendimiento se ve afectado con mensajes cortos cuando el procesador no cuenta con una unidad vectorial. [ 4 ]
Desde entonces, Bernstein ha ajustado aún más los parámetros y su principal recomendación es CubeHash512, definido como CubeHash16+16/32+32–512. [ 5 ]
Operación
Esta descripción se refiere a la especificación más reciente, y no a la presentación del NIST. [ 5 ]
CubeHash tiene 5 parámetros, una instancia determinada se denota por CubeHash i + r / b + f - h .
- i es el número de rondas iniciales
- r es el número de rondas por bloque.
- b es el tamaño del bloque en bytes, definido para {1, 2, 3, ... 128}.
- f es el número de rondas finales
- h es el tamaño de la salida hash en bits, definido para {8, 16, 24, 32, ... 512}.
En la presentación original del NIST, i y f se fijaron en 10 r . La notación obsoleta CubeHash r / b - h indica que i y f son implícitamente 10 r .
El estado interno se define como una matriz pentadimensional de palabras (enteros de cuatro bytes), de 0 a 1 en ambas dimensiones. Las palabras se identifican mediante sus coordenadas [00000] a [11111]. Se tratan como little-endian.
El estado interno se inicializa estableciendo las tres primeras palabras ([00000], [00001], [00010]) a h /8, b y r respectivamente, y todas las demás palabras a cero. A continuación, el estado se ejecuta durante i rondas, y la etapa de inicialización se completa. El estado ahora es el Vector de Inicialización (IV). El IV se puede guardar y reutilizar para una combinación dada de h , b , r e i .
El mensaje se rellena y se divide en bloques de b bytes. El relleno añade un bit 1, seguido de tantos bits 0 como sean necesarios para formar un bloque completo.
Cada bloque se introduce aplicando la operación XOR a los primeros b bytes del estado, y luego realizando r rondas de transformación.
Finalmente, se realiza una operación XOR entre 1 y la palabra de estado [11111], y luego se llevan a cabo f rondas de transformación.
El hash de salida ahora está contenido en los primeros h /8 bytes de este estado final.
Función redonda

La función de ronda de CubeHash consta de los siguientes diez pasos:
- Suma x[ 0 jklm] en x[ 1 jklm] módulo 2 32 , para cada (j,k,l,m).
- Gire x[ 0 jklm] hacia arriba 7 bits, para cada (j,k,l,m).
- Intercambia x[ 00 klm] con x[ 01 klm], para cada (k,l,m).
- XOR x[ 1 jklm] en x[ 0 jklm], para cada (j,k,l,m).
- Intercambia x[ 1 jk 0 m] con x[ 1 jk 1 m], para cada (j,k,m).
- Suma x[ 0 jklm] en x[ 1 jklm] módulo 2 32 , para cada (j,k,l,m).
- Gire x[ 0 jklm] hacia arriba 11 bits, para cada (j,k,l,m).
- Intercambia x[ 0 j 0 lm] con x[ 0 j 1 lm], para cada (j,l,m).
- XOR x[ 1 jklm] en x[ 0 jklm], para cada (j,k,l,m).
- Intercambia x[ 1 jkl 0 ] con x[ 1 jkl 1 ], para cada (j,k,l).
Ejemplos de hashes
Este ejemplo utiliza CubeHash80+8/1+80-512. El vector de inicialización es el mismo para todos los hashes 80+8/1+ f -512, y es el siguiente:
6998f35dfb0930c760948910e626160f36077cf3b58b0d0c57cf193d3341e7b8\ a334805b2089f9ef31ffc4142aef3850fe121839e940a4527d5293a27045ca12\ 9358096e81bf70349a90a44a93c33edb14c3e9844a87dbd0bc451df25212b3ac\ 6aabe51c5df0f63bddbb8ae8fad3cf0fd52582fbad2e2446094025a521a23d5c
El hash del mensaje ASCII "Hello" (hexadecimal: 0x48, 0x65, 0x6c, 0x6c, 0x6f) utiliza 6 bloques de mensaje. Hay 5 bloques del mensaje y, dado que se trata de una entrada alineada a bytes, hay 1 bloque para relleno. El valor hash de 512 bits es:
7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39b
Un pequeño cambio en el mensaje, como invertir un solo bit, alterará drásticamente el resultado del hash debido al efecto avalancha . Al aplicar el hash al mensaje "hello" (que solo difiere de "Hello" en una posición de bit), se obtiene el siguiente valor hash:
01ee7f4eb0e0ebfdb8bf77460f64993faf13afce01b55b0d3d2a63690d25010f\ 7127109455a7c143ef12254183e762b15575e0fcc49c79a0471a970ba8a66638
Cambios de parámetros
CubeHash permite utilizar diversos parámetros para determinar el hash resultante. El usuario decide qué parámetros desea usar. A continuación, se muestran varios ejemplos de hashes de diferentes mensajes, utilizando distintos parámetros. Todos los mensajes están en formato ASCII.
mensaje: "" (la cadena de longitud cero) CubeHash160+16/32+160-512: 4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32\ f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043a CubeHash80+8/1+80-512: 90bc3f2948f7374065a811f1e47a208a53b1a2f3be1c0072759ed49c9c6c7f28\ f26eb30d5b0658c563077d599da23f97df0c2c0ac6cce734ffe87b2e76ff7294 CubeHash10+1/1+10-512: 3f917707df9acd9b94244681b3812880e267d204f1fdf795d398799b584fa8f1\ f4a0b2dbd52fd1c4b6c5e020dc7a96192397dd1bce9b6d16484049f85bb71f2f CubeHash160+16/32+160-256: 44c6de3ac6c73c391bf0906cb7482600ec06b216c7c54a2a8688a6a42676577d CubeHash80+8/1+80-256: 38d1e8a22d7baac6fd5262d83de89cacf784a02caa866335299987722aeabc59 CubeHash10+1/1+10-256: 80f72e07d04ddadb44a78823e0af2ea9f72ef3bf366fd773aa1fa33fc030e5cb
mensaje: "Hola" CubeHash160+16/32+160-512: dcc0503aae279a3c8c95fa1181d37c418783204e2e3048a081392fd61bace883\ a1f7c4c96b16b4060c42104f1ce45a622f1a9abaeb994beb107fed53a78f588c CubeHash80+8/1+80-512: 7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39b CubeHash10+1/1+10-512: 13cf99c1a71e40b135f5535bee02e151eb4897e4de410b9cb6d7179c677074eb\ 6ef1ae9a9e685ef2d2807509541f484d39559525179d53838eda95eb3f6a401d CubeHash160+16/32+160-256: e712139e3b892f2f5fe52d0f30d78a0cb16b51b217da0e4acb103dd0856f2db0 CubeHash80+8/1+80-256: 692638db57760867326f851bd2376533f37b640bd47a0ddc607a9456b692f70f CubeHash10+1/1+10-256: f63041a946aa98bd47f3175e6009dcb2ccf597b2718617ba46d56f27ffe35d49
Mensaje: "El rápido zorro marrón salta sobre el perro perezoso" CubeHash160+16/32+160-512: bdba44a28cd16b774bdf3c9511def1a2baf39d4ef98b92c27cf5e37beb8990b7\ cdb6575dae1a548330780810618b8a5c351c1368904db7ebdf8857d596083a86 CubeHash80+8/1+80-512: ca942b088ed9103726af1fa87b4deb59e50cf3b5c6dcfbcebf5bba22fb39a6be\ 9936c87bfdd7c52fc5e71700993958fa4e7b5e6e2a3672122475c40f9ec816ba CubeHash10+1/1+10-512: eb7f5f80706e8668c61186c3c710ce57f9094fbfa1dbdc7554842cdbb4d10ce4\ 2fce72736d10b152f6216f23fc648bce810a7af4d58e571ec1b852fa514a0a8e CubeHash160+16/32+160-256: 5151e251e348cbbfee46538651c06b138b10eeb71cf6ea6054d7ca5fec82eb79 CubeHash80+8/1+80-256: 94e0c958d85cdfaf554919980f0f50b945b88ad08413e0762d6ff0219aff3e55 CubeHash10+1/1+10-256: 217a4876f2b24cec489c9171f85d53395cc979156ea0254938c4c2c59dfdf8a4
Los vectores de inicialización para las cuatro variantes mostradas también son diferentes. Por ejemplo, el vector de inicialización para CubeHash80+8/1+80-512 se puede ver arriba, y el IV para CubeHash80+8/1+80-256 es:
830b2bd5273d616fd785876a4a500218a5388963eeb702fb47547842459f8d89\ 8727a1c8ba40bd48cef47fe82543c2735c033052ae9fcd632d4541bde6b6cb0d\ cb8a9cdf579f5b67b2ae00968180af6e51ebdf0ca597cd2bf91f981f7ab29a62\ 01ad72d946e6c075c6d1337e0a293d6f90c438ac38be153f32aa288ffc5eca8a
Seguridad
La robustez de esta función aumenta a medida que b disminuye hacia 1 y r aumenta. Por lo tanto, CubeHash 8/1-512 es más robusto (más seguro) que CubeHash 1/1-512, y CubeHash 1/1-512 es más robusto que CubeHash 1/2-512. La versión más débil posible de este algoritmo es CubeHash 1/128- h . Sin embargo, existe una compensación entre seguridad y tiempo. Una versión más segura tardará más en calcular un valor hash que una versión debilitada.
Referencias
- ↑ Daniel J. Bernstein (14 de septiembre de 2009). "Especificación de CubeHash (2.B.1)" (PDF) .
- ↑ Daniel J. Bernstein (28-10-2008). "Estimaciones de eficiencia de CubeHash (2.B.2)" (PDF) .
- ↑ Daniel J. Bernstein (15 de julio de 2009). "Ajuste de parámetros de CubeHash: 16 veces más rápido" (PDF) .
- ↑ Instituto Nacional de Estándares y Tecnología (23 de febrero de 2011). Informe de situación de la segunda ronda de la competición del algoritmo de hash criptográfico SHA-3 (Informe).
- 1 2 Daniel J. Bernstein. "Introducción a CubeHash" .
Enlaces externos
- El sitio web de CubeHash
- concurso de funciones hash del NIST