Articulo de referencia

BLAKE (función hash)

{{Cite conference |last1=Aumasson |first1=Jean-Philippe |last2=Meier |first2=Willi |last3=Phan |first3=Raphael C.-W. |date=2008 |title=The Hash Function Family LAKE |editor-last...

BLAKE es una función hash criptográfica basada en el cifrado de flujo ChaCha de Daniel J. Bernstein , pero se agrega una copia permutada del bloque de entrada, combinada mediante XOR con constantes de ronda, antes de cada ronda de ChaCha. Al igual que SHA-2 , existen dos variantes que difieren en el tamaño de la palabra . ChaCha opera sobre una matriz de palabras de 4×4. BLAKE combina repetidamente un valor hash de 8 palabras con 16 palabras de mensaje, truncando el resultado de ChaCha para obtener el siguiente valor hash. BLAKE-256 y BLAKE-224 utilizan palabras de 32 bits y producen resúmenes de 256 bits y 224 bits, respectivamente, mientras que BLAKE-512 y BLAKE-384 utilizan palabras de 64 bits y producen resúmenes de 512 bits y 384 bits, respectivamente.

La función hash BLAKE2 , basada en BLAKE, se anunció en 2012. La función hash BLAKE3 , basada en BLAKE2, se anunció en 2020.

Historia

BLAKE fue presentado al concurso de funciones hash del NIST por Jean-Philippe Aumasson, Luca Henzen, Willi Meier y Raphael C.-W. Phan. En 2008, hubo 51 participantes. BLAKE llegó a la ronda final, compuesta por cinco candidatos, pero perdió contra Keccak en 2012, que fue seleccionado para el algoritmo SHA-3 .

Algoritmo

Al igual que SHA-2 , BLAKE tiene dos variantes: una que usa palabras de 32 bits, para calcular hashes de hasta 256 bits, y otra que usa palabras de 64 bits, para calcular hashes de hasta 512 bits. La transformación de bloques principal combina 16 palabras de entrada con 16 variables de trabajo, pero solo se conservan 8 palabras (de 256 o 512 bits) entre bloques.

Utiliza una tabla de 16 palabras constantes (los 512 o 1024 bits iniciales de la parte fraccionaria de π como números sin ningún secreto ), y una tabla de 10 permutaciones de 16 elementos:

σ[0] = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 s[1] = 14 10 4 8 9 15 13 6 1 12 0 2 11 7 5 3 σ[2] = 11 8 12 0 5 2 15 13 10 14 3 6 7 1 9 4 σ[3] = 7 9 3 1 13 12 11 14 2 6 5 10 4 0 15 8 σ[4] = 9 0 5 7 2 4 10 15 14 1 11 12 6 8 3 13 σ[5] = 2 12 6 10 0 11 8 3 4 13 7 5 15 14 1 9 s[6] = 12 5 1 15 14 13 4 10 0 7 6 3 9 2 8 11 σ[7] = 13 11 7 14 12 1 3 9 5 0 15 4 8 6 2 10 σ[8] = 6 15 14 9 11 3 0 8 12 2 13 7 1 4 10 5 σ[9] = 10 2 8 4 7 6 1 5 15 11 9 14 3 12 13 0

La operación principal, equivalente al cuarto de ronda de ChaCha, opera sobre una columna o diagonal de 4 palabras a b c d, que se combina con 2 palabras de mensaje m[]y dos palabras constantes n[]. Se realiza 8 veces por ronda completa:

j ← σ[r%10][2×i] // Cálculos de índice k ← σ[r%10][2×i+1] a ← a + b + (m[j] ⊕ n[k]) // Paso 1 (con entrada) d ← (d ⊕ a) >>> 16 c ← c + d // Paso 2 (sin entrada) b ← (b ⊕ c) >>> 12 a ← a + b + (m[k] ⊕ n[j]) // Paso 3 (con entrada) d ← (d ⊕ a) >>> 8 c ← c + d // Paso 4 (sin entrada) b ← (b ⊕ c) >>> 7

En lo anterior, res el número redondo (0–13), y ivaría de 0 a 7.

Las diferencias con la función de cuarto de ronda de ChaCha son:

  • Se ha añadido el texto del mensaje.
  • Se han invertido los sentidos de rotación.

«BLAKE reutiliza la permutación del cifrado de flujo ChaCha con rotaciones en direcciones opuestas. Algunos sospechaban de una optimización avanzada, pero en realidad se origina a partir de un error tipográfico en las especificaciones originales de BLAKE», explica Jean-Philippe Aumasson en su «Crypto Dictionary». [ 2 ]

La versión de 64 bits (que no existe en ChaCha) es idéntica, pero la cantidad de rotaciones es de 32, 25, 16 y 11, respectivamente, y el número de rondas aumenta a 16.

Ajustes

Durante la competición de funciones hash del NIST, los participantes pueden modificar sus algoritmos para solucionar los problemas detectados. Entre los cambios realizados en BLAKE se encuentra el aumento del número de rondas de 10/14 a 14/16. Esto busca una mayor seguridad sin sacrificar la velocidad.

Ejemplos de resúmenes

Valores hash de una cadena vacía:

BLAKE-224("") = 7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed BLAKE-256("") = 716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a BLAKE-384("") = c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706 BLAKE-512("") = a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8

Cambiar un solo bit provoca que cada bit de la salida cambie con una probabilidad del 50%, lo que demuestra un efecto de avalancha :

BLAKE-512("El rápido zorro marrón salta sobre el perro perezoso") = 1f7e26f63b6ad25a0896fd978fd050a1766391d2fd0471a77afb975e5034b7ad 2d9ccf8dfb47abbbe656e1b82fbc634ba42ce186e8dc5e1ce09a885d41f43451 BLAKE-512("El rápido zorro marrón salta sobre el perro perezoso " ) = a701c2a1f9baabd8b1db6b75aee096900276f0b86dc15d247ecc03937b370324a16a4ffc0c3a85cd63229cfa15c15f4ba6d46ae2e849ed6335e9ff43b764198a

(En este ejemplo, 266 bits coincidentes de 512 representan aproximadamente el 52% debido a la naturaleza aleatoria de la avalancha).

BLAKE2

BLAKE2 es una función hash criptográfica basada en BLAKE, creada por Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn y Christian Winnerlein. El objetivo del diseño era reemplazar los algoritmos MD5 y SHA-1 , ampliamente utilizados pero con fallos, en aplicaciones que requieren un alto rendimiento en software. BLAKE2 se anunció el 21 de diciembre de 2012. [ 4 ] Una implementación de referencia está disponible bajo la licencia CC0 , la licencia OpenSSL y la licencia Apache 2.0 . [ 5 ] [ 6 ]

BLAKE2b es más rápido que MD5, SHA-1, SHA-2 y SHA-3 en arquitecturas x86-64 y ARM de 64 bits. [ 5 ] Sus creadores afirman que BLAKE2 proporciona una seguridad mejor que SHA-2 y similar a la de SHA-3: inmunidad a la extensión de longitud , indistinguibilidad de un oráculo aleatorio, etc. [ 7 ]

BLAKE2 elimina la adición de constantes a las palabras del mensaje de la función de ronda BLAKE, cambia dos constantes de rotación, simplifica el relleno, agrega un bloque de parámetros que se combina mediante XOR con vectores de inicialización y reduce el número de rondas de 16 a 12 para BLAKE2b (sucesor de BLAKE-512) y de 14 a 10 para BLAKE2s (sucesor de BLAKE-256).

BLAKE2 admite los modos de clave, salting, personalización y árbol hash, y puede generar resúmenes de entre 1 y 64 bytes para BLAKE2b, o hasta 32 bytes para BLAKE2s. También existen versiones paralelas diseñadas para un mayor rendimiento en procesadores multinúcleo : BLAKE2bp (paralelo de 4 vías) y BLAKE2sp (paralelo de 8 vías).

BLAKE2X es una familia de funciones de salida extensible (XOF). Mientras que BLAKE2 está limitada a resúmenes de 64 bytes, BLAKE2X permite resúmenes de hasta 256 GiB. BLAKE2X no es una instancia de una función hash y debe basarse en una instancia real de BLAKE2. Un ejemplo de una instancia de BLAKE2X podría ser BLAKE2Xb16MiB , que sería una versión de BLAKE2X basada en BLAKE2b que produce resúmenes de 16.777.216 bytes (o exactamente 16 MiB , de ahí el nombre de dicha instancia). [ 8 ]

BLAKE2b y BLAKE2s se especifican en RFC 7693. Las características opcionales que utilizan el bloque de parámetros (salting, hashes personalizados, hash de árbol, etcétera) no se especifican, y por lo tanto tampoco se especifica la compatibilidad con BLAKE2bp, BLAKE2sp o BLAKE2X. [ 9 ]

Vector de inicialización

BLAKE2b utiliza un vector de inicialización idéntico al IV utilizado por SHA-512. Estos valores se obtienen de forma transparente tomando los primeros 64 bits de las partes fraccionarias de las raíces cuadradas positivas de los primeros ocho números primos.

IV 0 = 0x6a09e667f3bcc908 // Frac(sqrt(2)) IV 1 = 0xbb67ae8584caa73b // Frac(sqrt(3)) IV 2 = 0x3c6ef372fe94f82b // Frac(sqrt(5)) IV 3 = 0xa54ff53a5f1d36f1 // Frac(sqrt(7)) IV 4 = 0x510e527fade682d1 // Frac(sqrt(11)) IV 5 = 0x9b05688c2b3e6c1f // Frac(sqrt(13)) IV 6 = 0x1f83d9abfb41bd6b // Frac(sqrt(17)) IV 7 = 0x5be0cd19137e2179 // Frac(sqrt(19))

Algoritmo BLAKE2b

Pseudocódigo para el algoritmo BLAKE2b. El algoritmo BLAKE2b utiliza palabras de 8 bytes (UInt64) y bloques de 128 bytes.

Algoritmo BLAKE2b  Entrada: M  Mensaje a hashear cbMessageLen: Número, (0..2 128 )  Longitud del mensaje en bytes Clave Clave  opcional de 0..64 bytes cbKeyLen: Número, (0..64)  Longitud de la clave opcional en bytes cbHashLen: Número, (1..64)  Longitud de hash deseada en bytes Salida: Hash  Hash de cbHashLen bytesInicializar el vector de estado h con IV h 0..7 ← IV 0..7Mezcla el tamaño de la clave (cbKeyLen) y la longitud de hash deseada (cbHashLen) en h 0 h 0 ← h 0 xor 0x0101kknn  donde kk es la longitud de la clave (en bytes) nn es la longitud de hash deseada (en bytes)Cada vez que comprimimos, registramos cuántos bytes se han comprimido. cBytesComprimidos ← 0 cBytesResistibles ← cbMessageLen Si se proporcionó una clave (es decir, cbKeyLen > 0) , rellene con ceros finales para que tenga 128 bytes (es decir, 16 palabras) y agréguela al principio del mensaje M si (cbKeyLen > 0) entonces M ← Pad(Tecla, 128) || M cBytesResistibles ← cBytesResistibles + 128 fin siComprime bloques completos de 128 bytes del mensaje, excepto el último bloque mientras (cBytesRemaining > 128) haz bloque ← obtén los siguientes 128 bytes del mensaje M cBytesCompressed ← cBytesCompressed + 128  incrementa el contador de bytes que se han comprimido cBytesRemaining ← cBytesRemaining - 128  disminuye el contador de bytes en M que quedan por procesar h ← Compress(h, chunk, cBytesCompressed, false) false ⇒ este no es el último fragmento fin mientrasComprimir los últimos bytes del bloque M ← obtener los siguientes 128 bytes del mensaje M Obtendremos cBytesRemaining bytes (es decir, 0..128 bytes) cBytesCompressed ← cBytesCompressed+cBytesRemaining  El número real de bytes restantes en el bloque M ← Rellenar(bloque, 128)  Si M estaba vacío, aun así comprimiremos un bloque final de ceros h ← Compress(h, chunk, cBytesCompressed, true) true ⇒ este es el último fragmentoResultado ← primeros cbHashLen bytes del vector de estado little endian h  Fin del algoritmo BLAKE2b

Comprimir

La función Compress toma un fragmento completo de 128 bytes del mensaje de entrada y lo mezcla con la matriz de estado actual:

Función Comprimir  Entrada: h Fragmento  de vector de estado persistente Fragmento de mensaje de 128 bytes (16 palabras dobles) a comprimir t: Número, 0..2 128 Cantidad de bytes que se han introducido en la compresión IsLastBlock: Booleano  Indica si esta es la ronda final de compresión Salida: h  Vector de estado persistente actualizadoConfigurar el vector de trabajo local V V 0..7 ← h 0..7 Los primeros ocho elementos se copian del vector de estado persistente h V 8..15 ← IV 0..7 Los ocho elementos restantes se inicializan desde el IVMezclar el contador de 128 bits t en V 12 :V 13 V 12 ← V 12 xor Lo(t)  Lo 64 bits de UInt128 t V 13 ← V 13 xor Hi(t)  Hi 64 bits de UInt128 tSi este es el último bloque, entonces invierta todos los bits en V 14 si IsLastBlock entonces V 14 ← V 14 xor 0xFFFFFFFFFFFFFFFF Tratar cada fragmento de mensaje de 128 bytes como dieciséis palabras de 8 bytes (64 bits) m m 0..15 ← fragmento Doce rondas de mezcla de mensajes criptográficos para i de 0 a 11 hacen Seleccione el programa de mezcla de mensajes para esta ronda. BLAKE2b usa 12 rondas, mientras que SIGMA solo tiene 10 entradas. S 0..15 ← SIGMA[i mod 10]  Las rondas 10 y 11 usan SIGMA[0] y SIGMA[1] respectivamente Mezclar(V 0 , V 4 , V 8 , V 12 , m[S 0 ], m[S 1 ]) Mezclar(V 1 , V 5 , V 9 , V 13 , m[S 2 ], m[S 3 ]) Mezclar(V 2 , V 6 , V 10 , V 14 , m[S 4 ], m[S 5 ]) Mezclar(V 3 , V 7 , V 11 , V 15 , m[S 6 ], m[S 7 ]) Mezclar(V 0 , V 5 , V 10 , V 15 , m[S 8 ], m[S 9 ]) Mezclar(V 1 , V 6 , V 11 , V 12 , m[S 10 ], m[S 11 ]) Mezclar(V 2 , V 7 , V 8 , V 13 , m[S 12 ], m[S 13 ]) Mezclar(V 3 , V 4 , V 9 , V 14 , m[S 14 ], m[S 15 ]) fin paraMezclar las mitades superior e inferior de V en el vector de estado actual h h 0..7 ← h 0..7 xor V 0..7 h 0..7 ← h 0..7 xor V 8..15Resultado ← h Fin de la función Comprimir

Mezcla

La función Mix es llamada por la función Compress y mezcla dos palabras de 8 bytes del mensaje en el estado hash. En la mayoría de las implementaciones, esta función se escribiría en línea, o como una función en línea.

Entradas de mezcla  de funciones : V a , V b , V c , V d cuatro entradas de palabra de 8 bytes del vector de trabajo V x, y  dos entradas de palabra de 8 bytes del mensaje relleno m Salida: V a , V b , V c , V d las versiones modificadas de V a , V b , V c , V d V a ← V a + V b + x con entrada V d ← (V d xor V a ) rotar a la derecha 32 V c ← V c + V d sin entrada V b ← (V b xor V c ) girar a la derecha 24 V a ← V a + V b + y con entrada V d ← (V d xor V a ) rotar a la derecha 16 V c ← V c + V d sin entrada V b ← (V b xor V c ) girar a la derecha 63 Resultado ← V a , V b , V c , V d Fin de la función Mix

Ejemplos de resúmenes

Valores hash de una cadena vacía:

BLAKE2s-224("") = 1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4 BLAKE2s-256("") = 69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9 BLAKE2b-384("") = b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100 BLAKE2b-512("") = 786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419 d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce

Cambiar un solo bit provoca que cada bit de la salida cambie con una probabilidad del 50%, lo que demuestra un efecto de avalancha :

BLAKE2b-512("El rápido zorro marrón salta sobre el perro perezoso") = a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918 BLAKE2b-512("El rápido zorro marrón salta sobre el perezoso perro " ) = ab6b007747d8068c02e25a6008db8a77c218d94f3b40d2291a7dc8a62090a744 c082ea27af01521a102e42f480a31e9844053f456b4b41e8aa78bbe5c12957bb

Usuarios de BLAKE2

Implementaciones

Además de la implementación de referencia, [ 6 ] las siguientes bibliotecas de criptografía proporcionan implementaciones de BLAKE2:

BLAKE3

BLAKE3 es una función hash criptográfica basada en Bao y BLAKE2, creada por Jack O'Connor, Jean-Philippe Aumasson, Samuel Neves y Zooko Wilcox-O'Hearn . [ 25 ] Fue anunciada el 9 de enero de 2020 en Real World Crypto . [ 26 ]

BLAKE3 es un algoritmo único con muchas características deseables (paralelismo, XOF , KDF , PRF y MAC ), a diferencia de BLAKE y BLAKE2, que son familias de algoritmos con múltiples variantes. BLAKE3 tiene una estructura de árbol binario , por lo que admite un grado de paralelismo prácticamente ilimitado (tanto SIMD como multihilo) siempre que la entrada sea lo suficientemente larga. Las implementaciones oficiales en Rust y C [ 27 ] tienen doble licencia : dominio público ( CC0 ) y licencia Apache [ 28 ] .

BLAKE3 está diseñado para ser lo más rápido posible. Es consistentemente varias veces más rápido que BLAKE2. La función de compresión de BLAKE3 se basa en gran medida en la de BLAKE2, con la principal diferencia de que el número de rondas se reduce de 10 a 7, un cambio basado en el argumento de que la criptografía anterior es demasiado conservadora en comparación con los registros actuales de criptoanálisis. [ 29 ] Además de proporcionar paralelismo, el formato de árbol Merkle también permite la transmisión verificada (verificación sobre la marcha) y las actualizaciones incrementales. [ 27 ]

Usuarios de BLAKE3

Referencias

  1. Aumasson, Jean-Philippe; Meier, Willi; Phan, Raphael C.-W. (2008). "La familia de funciones hash LAKE" (PDF) . En Nyberg, Kaisa (ed.). Lecture Notes in Computer Science . Fast Software Encryption . Vol.  5086. Springer . pp. 36–53 . doi : 10.1007/978-3-540-71039-4_3 . Archivado (PDF) del original el 17 de abril de 2025. 
  2. Aumasson, Jean-Philippe (2021). Diccionario criptográfico: 500 datos interesantes para el criptógrafo curioso . No Starch Press. ISBN 9781718501409.
  3. "BLAKE2 – una alternativa a MD5/SHA-1" .
  4. O'Whielacronx, Zooko (21 de diciembre de 2012). "Presentamos BLAKE2: una alternativa a SHA-3, SHA-2 y MD5" . Archivado del original el 5 de octubre de 2016. Consultado el 27 de enero de 2016 .
  5. 1 2 "BLAKE2" . blake2.net .
  6. 1 2 "Implementaciones oficiales de BLAKE2" . GitHub . Consultado el 7 de julio de 2019 .
  7. Aumasson, Jean-Philippe; Neves, Samuel; Wilcox-O'Hearn, Zooko; Winnerlein, Christian (2013). "BLAKE2: más simple, más pequeño y más rápido que MD5" (PDF) . Cryptology ePrint Archive . IACR.
  8. "BLAKE2X" (PDF) .
  9. Saarinen, MJ; Aumasson, JP (noviembre de 2015). El hash criptográfico BLAKE2 y el código de autenticación de mensajes (MAC) . IETF . doi : 10.17487/RFC7693 . RFC 7693. Consultado el 4 de diciembre de 2015 .
  10. "Acerca de Chef Habitat" . docs.chef.io .
  11. "coreutils/src/blake2/" . github.com .
  12. "librsync/src/blake2/" . github.com .
  13. "Documento técnico sobre seguridad de WhatsApp" (PDF) .
  14. "Archivador WinRAR, una potente herramienta para procesar archivos RAR y ZIP" . rarsoft.com .
  15. "Respuesta de Igor Pavlov a una solicitud de un usuario para que se admita BLAKE3 en 7-Zip" . sourceforge.net .
  16. "rmlint — documentación de rmlint (2.8.0 Maidenly Moose)" . rmlint.readthedocs.io .
  17. "WireGuard: Túnel de red del kernel de próxima generación" (PDF) .
  18. "trabajo" . docs.nano.org .
  19. "firmas" . docs.nano.org .
  20. "derivación de clave" . docs.nano.org .
  21. "Generador de números aleatorios de Linux 5.17 experimenta mejoras de velocidad al cambiar de SHA1 a BLAKE2s" . www.phoronix.com .
  22. "Firma de suscriptor - Beckn" .
  23. "Suma de verificación para Windows" . corz.org .
  24. "BLAKE3 – una función, rápido en todas partes" (PDF) . GitHub .
  25. "Una versión anterior de Bao especificaba su propio modo de árbol personalizado, que finalmente se convirtió en BLAKE3" . GitHub .
  26. "JPA y yo anunciamos BLAKE3 en las charlas relámpago de la Copa del Mundo de Rugby..." Hacker News .
  27. 1 2 "Implementaciones oficiales de BLAKE3" . GitHub . Consultado el 12 de enero de 2020 .
  28. "Esta obra se publica en el dominio público con CC0 1.0. Alternativamente, está licenciada bajo la Licencia Apache 2.0" . GitHub .
  29. Aumasson, Jean-Philippe (2020). Demasiadas criptomonedas (PDF) . Simposio de Criptomonedas del Mundo Real.
  30. bazelbuild. "Versión 6.4.0 · bazelbuild/bazel" . GitHub . Consultado el 25 de septiembre de 2025 .
  31. ccache. "Ccache 4.0" . Consultado el 26 de octubre de 2025 .
  32. ClickHouse. "ClickHouse/rust/chcache/Cargo.toml en master · ClickHouse/ClickHouse" . GitHub . Consultado el 25 de septiembre de 2025 .
  33. ipfs. "Agregar BLAKE3 a la lista permitida · Problema n.° 13 · ipfs/go-verifcid" . GitHub . Consultado el 25 de septiembre de 2025 .
  34. rust-lang. "Versión inicial de la frescura basada en suma de verificación por Xaeroxe · Solicitud de extracción n.° 14137 · rust-lang/cargo" . GitHub . Consultado el 25 de septiembre de 2025 .
  35. "⚙ D121510 [ Soporte ] Presentar la implementación de la función hash BLAKE3" . reviews.llvm.org . Consultado el 25 de septiembre de 2025 .
  36. "wasmer/lib/cache/src/hash.rs en 4f935a8c162bf604df223003e434e4f7ca253688 · wasmerio/wasmer" . GitHub . Consultado el 25 de septiembre de 2025 .
  37. "Referencia de Protobuf de CycloneDX v1.6" . cyclonedx.org . Consultado el 25 de septiembre de 2025 .
  38. "Especificación de firma de mosaico" . stevefarroll.github.io . Consultado el 30 de septiembre de 2025 .
  39. "El sistema de control de versiones de Lore" . lore.org . Consultado el 17 de junio de 2026 .
  • El sitio web de BLAKE
  • El sitio web de BLAKE2
  • El sitio web de BLAKE3
Obtenido de " https://en.wikipedia.org/w/index.php?title=BLAKE_(hash_function)&oldid=1360286754#BLAKE3 "