CubeHash [1] es una función hash criptográfica presentada al concurso de funciones hash NIST por Daniel J. Bernstein . CubeHash tiene un estado de 128 bytes, utiliza una construcción de tubería ancha y está basado en ARX . Los bloques de mensajes se someten a XOR en los bits iniciales de un estado de 128 bytes, que luego pasa por una transformación biyectiva de r-ronda entre bloques. La propuesta inicial de NIST ("Cubehash8 / 1") requirió alrededor de 200 ciclos por byte . [2]Después de las aclaraciones del NIST, el autor cambió la propuesta a Cubehash16 / 32, que "es aproximadamente 16 veces más rápido que CubeHash8 / 1, alcanzando fácilmente tanto a SHA-256 como a SHA-512 en la plataforma de referencia" mientras mantiene un "cómodo margen de seguridad ". [3]
CubeHash avanzó a la segunda ronda de la competencia, pero no fue elegido como uno de los 5 finalistas. 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. [4]
Operación
Esta descripción se refiere a la última especificación y no a la presentación del NIST. [4]
CubeHash tiene 5 parámetros, una determinada instancia 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 de cinco dimensiones de palabras (enteros de cuatro bytes), 0-1 en ambas dimensiones. Se hace referencia a las palabras con sus coordenadas [00000] a [11111]. Las palabras se tratan como little-endian.
El estado interno se inicializa mediante el establecimiento de las tres primeras palabras ([00000], [00001], [00010]) para h / 8, b , y r , respectivamente, todas las otras palabras a cero. Luego, el estado se ejecuta a través de i rondas y se completa la etapa de inicialización. El estado ahora es el vector de inicialización (IV). El IV se puede guardar y reutilizar para una combinación determinada de h , b , r .
El mensaje se rellena y se divide en bloques de b bytes. El relleno agrega un 1 bit, seguido de tantos 0 bits como sea necesario para hacer un bloque completo.
Cada bloque se ingresa mediante XORing a los primeros b bytes del estado y luego se realizan r rondas de transformación.
Finalmente, 1 se aplica XOR a la palabra de estado [11111], y luego se realizan 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 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 en 7 bits, para cada (j, k, l, m).
- Intercambie 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 en 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).
Hashes de ejemplo
Este ejemplo usa 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:
5df39869c73009fb108994600f1626e6f37c07360c0d8bb53d19cf57b8e74133 \ 5b8034a3eff9892014c4ff315038ef2a391812fe52a440e9a293527d12ca4570 \ 6e0958933470bf814aa4909adb3ec39384e9c314d0db874af21d45bcacb31252 \ 1ce5ab6a3bf6f05de88abbdd0fcfd3fafb8225d546242eada52540095c3da221
El hash del mensaje ASCII "Hola" (hexadecimal: 0x48, 0x65, 0x6c, 0x6c, 0x6f) utiliza 6 bloques de mensajes. Hay 5 bloques del mensaje y, dado que se trata de una entrada alineada en bytes, hay 1 bloque para el relleno. El valor hash de 512 bits es:
7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444 \8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39b
Un pequeño cambio en el mensaje, como voltear un solo bit, cambiará enormemente la salida de hash, debido al efecto de avalancha . Al aplicar un hash al mensaje "hola" (que solo difiere de "Hola" en la posición de 1 bit) se obtiene el siguiente valor hash:
01ee7f4eb0e0ebfdb8bf77460f64993faf13afce01b55b0d3d2a63690d25010f \7127109455a7c143ef12254183e762b15575e0fcc49c79a0471a970ba8a66638
Cambios de parámetros
CubeHash permite utilizar muchos parámetros diferentes para determinar la salida de hash. Depende del usuario decidir qué parámetros desea utilizar. Aquí hay varios hash de ejemplo de diferentes mensajes, usando diferentes parámetros. Todos los mensajes están en ASCII.
mensaje: "" (la cadena de longitud cero)CubeHash160 + 16/32 + 160-512: 4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32 \ f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043aCubeHash80 + 8/1 + 80-512: 90bc3f2948f7374065a811f1e47a208a53b1a2f3be1c0072759ed49c9c6c7f28 \ f26eb30d5b0658c563077d599da23f97df0c2c0ac6cce734ffe87b2e76ff7294CubeHash10 + 1/1 + 10-512: 3f917707df9acd9b94244681b3812880e267d204f1fdf795d398799b584fa8f1 \ f4a0b2dbd52fd1c4b6c5e020dc7a96192397dd1bce9b6d16484049f85bb71f2fCubeHash160 + 16/32 + 160-256: 44c6de3ac6c73c391bf0906cb7482600ec06b216c7c54a2a8688a6a42676577dCubeHash80 + 8/1 + 80-256: 38d1e8a22d7baac6fd5262d83de89cacf784a02caa866335299987722aeabc59CubeHash10 + 1/1 + 10-256: 80f72e07d04ddadb44a78823e0af2ea9f72ef3bf366fd773aa1fa33fc030e5cb
mensaje: "Hola"CubeHash160 + 16/32 + 160-512: dcc0503aae279a3c8c95fa1181d37c418783204e2e3048a081392fd61bace883 \ a1f7c4c96b16b4060c42104f1ce45a622f1a9abaeb994beb107fed53a78f588cCubeHash80 + 8/1 + 80-512: 7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444 \ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39bCubeHash10 + 1/1 + 10-512: 13cf99c1a71e40b135f5535bee02e151eb4897e4de410b9cb6d7179c677074eb \ 6ef1ae9a9e685ef2d2807509541f484d39559525179d53838eda95eb3f6a401dCubeHash160 + 16/32 + 160-256: e712139e3b892f2f5fe52d0f30d78a0cb16b51b217da0e4acb103dd0856f2db0CubeHash80 + 8/1 + 80-256: 692638db57760867326f851bd2376533f37b640bd47a0ddc607a9456b692f70fCubeHash10 + 1/1 + 10-256: f63041a946aa98bd47f3175e6009dcb2ccf597b2718617ba46d56f27ffe35d49
mensaje: "El rápido zorro marrón salta sobre el perro perezoso"CubeHash160 + 16/32 + 160-512: bdba44a28cd16b774bdf3c9511def1a2baf39d4ef98b92c27cf5e37beb8990b7 \ cdb6575dae1a548330780810618b8a5c351c1368904db7ebdf8857d596083a86CubeHash80 + 8/1 + 80-512: ca942b088ed9103726af1fa87b4deb59e50cf3b5c6dcfbcebf5bba22fb39a6be \ 9936c87bfdd7c52fc5e71700993958fa4e7b5e6e2a3672122475c40f9ec816baCubeHash10 + 1/1 + 10-512: eb7f5f80706e8668c61186c3c710ce57f9094fbfa1dbdc7554842cdbb4d10ce4 \ 2fce72736d10b152f6216f23fc648bce810a7af4d58e571ec1b852fa514a0a8eCubeHash160 + 16/32 + 160-256: 5151e251e348cbbfee46538651c06b138b10eeb71cf6ea6054d7ca5fec82eb79CubeHash80 + 8/1 + 80-256: 94e0c958d85cdfaf554919980f0f50b945b88ad08413e0762d6ff0219aff3e55CubeHash10 + 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 fuerza de esta función aumenta cuando b disminuye hacia 1 y cuando r aumenta. Entonces, CubeHash 8 / 1-512 es más fuerte (más seguro) que CubeHash 1 / 1-512, y CubeHash 1 / 1-512 es más fuerte 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) . Cite journal requiere
|journal=
( ayuda ) - ^ Daniel J. Bernstein (28 de octubre de 2008). "Estimaciones de eficiencia de CubeHash (2.B.2)" (PDF) . Cite journal requiere
|journal=
( ayuda ) - ^ Daniel J. Bernstein (15 de julio de 2009). "Ajuste del parámetro CubeHash: 16 veces más rápido" (PDF) . Cite journal requiere
|journal=
( ayuda ) - ^ a b Daniel J. Bernstein. "Introducción a CubeHash" .