Articulo de referencia

BLAKE (función hash)

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, XORed con constan...

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, XORed con constantes de ronda, antes de cada ronda de ChaCha. Al igual que SHA-2 , hay dos variantes que difieren en el tamaño de palabra . ChaCha opera en 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 usan palabras de 32 bits y producen tamaños de resumen de 256 bits y 224 bits, respectivamente, mientras que BLAKE-512 y BLAKE-384 usan palabras de 64 bits y producen tamaños de resumen 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

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

Algoritmo

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

Utiliza una tabla de 16 palabras constantes (los 512 o 1024 bits iniciales de la parte fraccionaria de π ) 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
s[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
s[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 central, 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 la imagen de arriba, res un número redondo (0–13) y ivaría de 0 a 7.

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

  • Se ha añadido la adición de palabras del mensaje.
  • Se han invertido las direcciones de rotación.

"BLAKE reutiliza la permutación del cifrado de flujo ChaCha con rotaciones realizadas en direcciones opuestas. Algunos han sospechado 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 "Diccionario de criptografía". [1]

La versión de 64 bits (que no existe en ChaCha) es idéntica, pero las cantidades de rotación son 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 que se descubran. Los cambios que se han realizado en BLAKE son: el número de rondas se ha incrementado de 10/14 a 14/16. Esto es para ser más conservadores en cuanto a la seguridad y al mismo tiempo ser rápidos.

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 hace que cada bit de la salida cambie con un 50 % de probabilidad, lo que demuestra un efecto de avalancha :

BLAKE-512("El rápido zorro marrón salta sobre el perro perezoso") =
1f7e26f63b6ad25a0896fd978fd050a1766391d2fd0471a77afb975e5034b7ad2d9ccf8dfb47abbbe656e1b82fbc634ba42ce186e8dc5e1ce09a885d41f43451
BLAKE-512("El rápido zorro marrón salta sobre el perezoso do f ") =
a701c2a1f9baabd8b1db6b75aee096900276f0b86dc15d247ecc03937b370324a16a4ffc0c3a85cd63229cfa15c15f4ba6d46ae2e849ed6335e9ff43b764198a

(En este ejemplo, 266 bits coincidentes de 512 son 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 defectuosos, en aplicaciones que requieren un alto rendimiento en el software. BLAKE2 se anunció el 21 de diciembre de 2012. [3] Una implementación de referencia está disponible bajo CC0 , la licencia OpenSSL y la licencia Apache 2.0 . [4] [5]

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

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 XORiza con vectores de inicialización y reduce la cantidad 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 modos de codificación, salazón, 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á limitado a resúmenes de 64 bytes, BLAKE2X permite resúmenes de hasta 256 GiB. BLAKE2X en sí 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). [7]

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

Vector de inicialización

BLAKE2b utiliza un vector de inicialización que es el mismo que el 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(raíz(2)) 
IV 1 = 0xbb67ae8584caa73b    // Frac(raíz(3)) 
IV 2 = 0x3c6ef372fe94f82b    // Frac(raíz(5)) 
IV 3 = 0xa54ff53a5f1d36f1    // Frac(raíz(7)) 
IV 4 = 0x510e527fade682d1    // Frac(raíz(11)) 
IV 5 = 0x9b05688c2b3e6c1f    // Frac(raíz(13)) 
IV 6 = 0x1f83d9abfb41bd6b    // Frac(raíz(17)) 
IV 7 = 0x5be0cd19137e2179    // Frac(raíz cuadrada(19))

Algoritmo BLAKE2b

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

Algoritmo BLAKE2b
    Entrada: 
      M                                Mensaje a codificar 
      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 bytes

   Inicializar el vector de estado h con IV 
   h 0..7 ← IV 0..7

   Mezcle 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.
   cBytesComprimido ← 0
   cBytes restantes ← cbMessageLen

   Si se proporcionó una clave (es decir, cbKeyLen > 0)  
   , rellene con ceros finales para que tenga 128 bytes (es decir, 16 palabras) 
   y antepóngala al mensaje M
    si (cbKeyLen > 0) entonces
      M ← Pad(Tecla, 128) || M
      cBytes restantes ← cBytes restantes + 128
   terminar si

   Comprime fragmentos completos de 128 bytes del mensaje, excepto el último fragmento 
   while (cBytesRemaining > 128) do 
      chunk ← obtiene los siguientes 128 bytes del mensaje M 
      cBytesCompressed ← cBytesCompressed + 128   aumenta el recuento de bytes que se han comprimido 
      cBytesRemaining ← cBytesRemaining - 128   disminuye el recuento de bytes en M que quedan por procesar

      h ← Compress(h, chunk, cBytesCompressed, false)   false ⇒ este no es el último fragmento 
   end while

   Comprimir los bytes finales del fragmento M 
   ← obtener los siguientes 128 bytes del mensaje M   Obtendremos cBytesRemaining bytes (es decir, 0..128 bytes) 
   cBytesCompressed ← cBytesCompressed+cBytesRemaining   La cantidad real de bytes restantes en el fragmento M 
   ← Pad(fragmento, 128)   Si M estaba vacío, entonces comprimiremos un fragmento final de ceros

   h ← Compress(h, chunk, cBytesCompressed, true)   true ⇒ este es el último fragmento

   Resultado ← primeros bytes cbHashLen 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 en la matriz de estado en curso:

Función Comprimir
    Entrada: 
      h                      
      Fragmento                   de vector de estado persistente Fragmento de 128 bytes (16 palabras dobles) del mensaje 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 actualizado

   Configurar 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 IV

   Mezclar 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 t
  
   Si este es el último bloque, entonces invierta todos los bits en V 14
    si IsLastBlock entonces 
      V 14 ← V 14  xor 0xFFFFFFFFFFFFFFFF
   
   Trate 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 tiene solo 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 ])
      Mix(V 3 , V 4 , V 9 , V 14 , m[S 14 ], m[S 15 ])
    fin para

   Mezclar las mitades superior e inferior de V en el vector de estado continuo h 
   h 0..7 ← h 0..7  xor V 0..7 
   h 0..7 ← h 0..7  xor V 8..15

   Resultado ← h
 Fin 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.

Función Mix
    Entradas: 
        V a , V b , V c , V d        cuatro entradas de palabras de 8 bytes del vector de trabajo V 
        x, y                 dos entradas de palabras de 8 bytes del mensaje rellenado 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  x o V a ) rotar a la derecha 32

   V c ← V c + V d               sin entrada 
   V b ← (V b  xor V c ) rotar a la derecha 24

   V a ← V a + V b + y           con entrada 
   V d ← (V d  xor V a ) rotateright 16

   V c ← V c + V d               sin entrada 
   V b ← (V b  xor V c ) rotar a la derecha 63

   Resultado ← V a , V b , V c , V d 
Función final Mix

Ejemplos de resúmenes

Valores hash de una cadena vacía:

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

Cambiar un solo bit hace que cada bit de la salida cambie con un 50 % de probabilidad, 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 do f ") =
ab6b007747d8068c02e25a6008db8a77c218d94f3b40d2291a7dc8a62090a744c082ea27af01521a102e42f480a31e9844053f456b4b41e8aa78bbe5c12957bb

Usuarios de BLAKE2

Implementaciones

Además de la implementación de referencia, [5] 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 ), en contraste con 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 prácticamente ilimitado de paralelismo (tanto SIMD como multihilo) si se le da una entrada lo suficientemente larga. Las implementaciones oficiales de Rust y C [27] tienen licencia dual como dominio público ( CC0 ) y la 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 estrechamente en la de BLAKE2, con la mayor diferencia siendo que el número de rondas se reduce de 10 a 7, un cambio basado en el supuesto de que la criptografía actual es demasiado conservadora. [29] Además de proporcionar paralelismo, el formato de árbol de Merkle también permite la transmisión verificada (verificación sobre la marcha) y actualizaciones incrementales. [27]

Referencias

  1. ^ Aumasson, Jean-Philippe (2021). Diccionario criptográfico: 500 deliciosos bocados para el criptógrafo curioso . No Starch Press. ISBN 9781718501409.
  2. ^ "BLAKE2 – una alternativa a MD5/SHA-1".
  3. ^ O'Whielacronx, Zooko (21 de diciembre de 2012). «Presentación de BLAKE2: una alternativa a SHA-3, SHA-2 y MD5». Archivado desde el original el 5 de octubre de 2016. Consultado el 27 de enero de 2016 .
  4. ^ desde "BLAKE2". blake2.net .
  5. ^ ab "Implementaciones oficiales de BLAKE2". GitHub . Consultado el 7 de julio de 2019 .
  6. ^ 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) . Archivo de criptografía ePrint . IACR.
  7. ^ "BLAKE2X" (PDF) .
  8. ^ 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 .
  9. ^ "Acerca de Chef Habitat". docs.chef.io .
  10. ^ "coreutils/src/blake2/". github.com .
  11. ^ "librsync/src/blake2/". github.com .
  12. ^ "Libro blanco de seguridad de WhatsApp" (PDF) .
  13. ^ "Archivador WinRAR, una potente herramienta para procesar archivos RAR y ZIP". rarsoft.com .
  14. ^ "Respuesta de Igor Pavlov a una solicitud de un usuario para compatibilidad con BLAKE3 en 7-Zip". sourceforge.net .
  15. ^ "rmlint — documentación de rmlint (2.8.0 Maidenly Moose)". rmlint.readthedocs.io .
  16. ^ "WireGuard: Túnel de red de kernel de próxima generación" (PDF) .
  17. ^ "trabajo". docs.nano.org .
  18. ^ "firmas". docs.nano.org .
  19. ^ "derivación de clave". docs.nano.org .
  20. ^ "Autolykos: El rompecabezas PoW de la plataforma Ergo" (PDF) . ergoplatform.org .
  21. ^ "El generador de números aleatorios de Linux 5.17 experimenta aumentos de velocidad al cambiar de SHA1 a BLAKE2". www.phoronix.com .
  22. ^ "Firma de suscriptor - Beckn".
  23. ^ "suma de comprobación para Windows". corz.org .
  24. ^ "BLAKE3: una función, rápido en todas partes" (PDF) . GitHub .
  25. ^ "Una versión anterior de Bao especificó su propio modo de árbol personalizado, que con el tiempo se convirtió en BLAKE3". GitHub .
  26. ^ "JPA y yo anunciamos BLAKE3 en las charlas relámpago de la RWC..." Hacker News .
  27. ^ ab "Implementaciones oficiales de BLAKE3". GitHub . Consultado el 12 de enero de 2020 .
  28. ^ "Este trabajo se publica en el dominio público con licencia CC0 1.0. Alternativamente, se encuentra bajo la licencia Apache 2.0". GitHub .
  29. ^ Aumasson, Jean-Philippe (2020). Demasiadas criptomonedas (PDF) . Simposio sobre criptomonedas en el mundo real.
  • El sitio web de BLAKE
  • El sitio web de BLAKE2
  • El sitio web de BLAKE3
Obtenido de "https://es.wikipedia.org/w/index.php?title=BLAKE_(función_hash)&oldid=1240911780#BLAKE2"