Articulo de referencia

CubeHash

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 ...

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

Ilustración de la función de mezcla
Los diez pasos de la función de mezcla. Dos de las cinco dimensiones están desplegadas.

La función de ronda de CubeHash consta de los siguientes diez pasos:

  1. Suma x[ 0 jklm] en x[ 1 jklm] módulo 2 32 , para cada (j,k,l,m).
  2. Gire x[ 0 jklm] hacia arriba 7 bits, para cada (j,k,l,m).
  3. Intercambia x[ 00 klm] con x[ 01 klm], para cada (k,l,m).
  4. XOR x[ 1 jklm] en x[ 0 jklm], para cada (j,k,l,m).
  5. Intercambia x[ 1 jk 0 m] con x[ 1 jk 1 m], para cada (j,k,m).
  6. Suma x[ 0 jklm] en x[ 1 jklm] módulo 2 32 , para cada (j,k,l,m).
  7. Gire x[ 0 jklm] hacia arriba 11 bits, para cada (j,k,l,m).
  8. Intercambia x[ 0 j 0 lm] con x[ 0 j 1 lm], para cada (j,l,m).
  9. XOR x[ 1 jklm] en x[ 0 jklm], para cada (j,k,l,m).
  10. 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

  1. Daniel J. Bernstein (14 de septiembre de 2009). "Especificación de CubeHash (2.B.1)" (PDF) .
  2. Daniel J. Bernstein (28-10-2008). "Estimaciones de eficiencia de CubeHash (2.B.2)" (PDF) .
  3. Daniel J. Bernstein (15 de julio de 2009). "Ajuste de parámetros de CubeHash: 16 veces más rápido" (PDF) .
  4. 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).
  5. 1 2 Daniel J. Bernstein. "Introducción a CubeHash" .
  • El sitio web de CubeHash