SHA-3 ( Secure Hash Algorithm 3 ) es el último miembro de la familia de estándares Secure Hash Algorithm , publicado por NIST el 5 de agosto de 2015. [4] [5] [6] Aunque forma parte de la misma serie de estándares, SHA -3 es internamente diferente de la estructura tipo MD5 de SHA-1 y SHA-2 .
SHA-3 es un subconjunto de la familia primitiva criptográfica más amplia Keccak ( / ˈ k ɛ tʃ æ k / o / ˈ k ɛ tʃ ɑː k / ), [7] [8] diseñado por Guido Bertoni, Joan Daemen , Michaël Peeters, y Gilles Van Assche , basándose en RadioGatún . Los autores de Keccak han propuesto usos adicionales para la función, no estandarizada (todavía) por NIST, incluido un cifrado de flujo , un sistema de cifrado autenticado , un esquema de hash de "árbol" para un hash más rápido en ciertas arquitecturas, [9] [10] y cifrados AEAD . Keyak y Ketje. [11] [12]
Keccak se basa en un enfoque novedoso llamado construcción con esponja . [13] La construcción de esponja se basa en una función aleatoria amplia o permutación aleatoria y permite ingresar ("absorber" en terminología de esponja) cualquier cantidad de datos y generar ("comprimir") cualquier cantidad de datos, mientras actúa como una función pseudoaleatoria. con respecto a todas las aportaciones anteriores. Esto conduce a una gran flexibilidad.
Actualmente, el NIST no planea retirar SHA-2 ni eliminarlo del Secure Hash Standard revisado. [¿ necesita actualización? ] El propósito de SHA-3 es que pueda sustituir directamente a SHA-2 en las aplicaciones actuales si es necesario, y mejorar significativamente la solidez del conjunto de herramientas de algoritmo hash general del NIST. [14]
Para mensajes de tamaño pequeño, los creadores de los algoritmos Keccak y las funciones SHA-3 sugieren utilizar la función más rápida KangarooTwelve con parámetros ajustados y un nuevo modo de hash de árbol sin gastos generales adicionales.
El algoritmo Keccak es obra de Guido Bertoni, Joan Daemen (quien también codiseñó el cifrado Rijndael con Vincent Rijmen ), Michaël Peeters y Gilles Van Assche . Se basa en diseños anteriores de funciones hash PANAMA y RadioGatún . PANAMA fue diseñado por Daemen y Craig Clapp en 1998. RadioGatún, un sucesor de PANAMA, fue diseñado por Daemen, Peeters y Van Assche, y se presentó en el NIST Hash Workshop en 2006. [15] El código fuente de implementación de referencia se dedicó al dominio público a través de la exención CC0 . [dieciséis]
En 2006, el NIST comenzó a organizar el concurso de funciones hash del NIST para crear un nuevo estándar hash, SHA-3. SHA-3 no pretende reemplazar a SHA-2 , ya que no se ha demostrado ningún ataque significativo a SHA-2 [ necesita actualización ] . Debido a los ataques exitosos a MD5 , SHA-0 y SHA-1 , [17] [18] NIST percibió la necesidad de un hash criptográfico alternativo y diferente, que se convirtió en SHA-3.
Después de un período de preparación, las admisiones debían presentarse a finales de 2008. Keccak fue aceptado como uno de los 51 candidatos. En julio de 2009, se seleccionaron 14 algoritmos para la segunda ronda. Keccak avanzó a la última ronda en diciembre de 2010. [19]
Durante la competencia, a los participantes se les permitió "modificar" sus algoritmos para abordar los problemas descubiertos. Los cambios que se han realizado en Keccak son: [20] [21]
El 2 de octubre de 2012, Keccak fue seleccionado como el ganador del concurso. [7]
En 2014, el NIST publicó un borrador FIPS 202 "Estándar SHA-3: Hash basado en permutación y funciones de salida extensibles". [22] FIPS 202 fue aprobado el 5 de agosto de 2015. [23]
El 5 de agosto de 2015, NIST anunció que SHA-3 se había convertido en un estándar de hash. [24]
A principios de 2013, el NIST anunció que seleccionarían valores diferentes para la "capacidad", el parámetro de fuerza general versus velocidad, para el estándar SHA-3, en comparación con la presentación. [25] [26] Los cambios causaron cierta confusión.
La competencia de funciones hash requería funciones hash al menos tan seguras como las instancias SHA-2. Significa que una salida de d bits debe tener una resistencia de d /2 bits a los ataques de colisión y una resistencia de d bits a los ataques de preimagen , el máximo alcanzable para d bits de salida. La prueba de seguridad de Keccak permite un nivel ajustable de seguridad basado en una "capacidad" c , proporcionando resistencia de c /2 bits tanto a ataques de colisión como de preimagen. Para cumplir con las reglas de competencia originales, los autores de Keccak propusieron c = 2 d . El cambio anunciado fue aceptar la misma seguridad d /2 bits para todas las formas de ataque y estandarizar c = d . Esto habría acelerado Keccak al permitir que se aplicaran hash de d bits adicionales de entrada en cada iteración. Sin embargo, las funciones hash ya no habrían sido reemplazos directos con la misma resistencia de preimagen que SHA-2; se habría reducido a la mitad, haciéndolo vulnerable a los avances en la computación cuántica, que efectivamente lo reduciría a la mitad una vez más. [27]
En septiembre de 2013, Daniel J. Bernstein sugirió en la lista de correo del foro hash del NIST [28] fortalecer la seguridad de la capacidad de 576 bits que se propuso originalmente como el Keccak predeterminado, además y no incluido en el SHA-3. especificaciones. [29] Esto habría proporcionado al menos un SHA3-224 y SHA3-256 con la misma resistencia a la preimagen que sus predecesores SHA-2, pero SHA3-384 y SHA3-512 habrían tenido una resistencia a la preimagen significativamente menor que sus predecesores SHA-2. . A finales de septiembre, el equipo de Keccak respondió afirmando que habían propuesto seguridad de 128 bits estableciendo c = 256 como una opción ya en su propuesta SHA-3. [30] Aunque la reducción de capacidad era justificable en su opinión, a la luz de la respuesta negativa, propusieron aumentar la capacidad a c = 512 bits para todos los casos. Esto sería tanto como cualquier estándar anterior hasta el nivel de seguridad de 256 bits, al tiempo que proporciona una eficiencia razonable, [31] pero no la resistencia de preimagen de 384/512 bits que ofrecen SHA2-384 y SHA2-512. Los autores afirmaron que "afirmar o confiar en niveles de seguridad superiores a 256 bits no tiene sentido".
A principios de octubre de 2013, Bruce Schneier criticó la decisión del NIST basándose en sus posibles efectos perjudiciales sobre la aceptación del algoritmo, diciendo:
Hay demasiada desconfianza en el aire. El NIST corre el riesgo de publicar un algoritmo en el que nadie confiará y que nadie (excepto aquellos obligados) utilizará. [32]
Más tarde se retractó de su declaración anterior y dijo:
Me equivoqué cuando escribí que el NIST realizó "cambios internos" en el algoritmo. Eso fue descuidado de mi parte. La permutación de Keccak permanece sin cambios. Lo que propuso el NIST fue reducir la capacidad de la función hash en nombre del rendimiento. Una de las buenas características de Keccak es que es altamente sintonizable. [32]
Paul Crowley, criptógrafo y desarrollador senior de una empresa independiente de desarrollo de software, expresó su apoyo a la decisión, diciendo que se supone que Keccak es ajustable y que no hay razón para diferentes niveles de seguridad dentro de una primitiva. También añadió:
Sí, es un poco vergonzoso para la competencia que exigieran un cierto nivel de seguridad a los participantes y luego publicaran un estándar con otro diferente. Pero no se puede hacer nada para solucionarlo ahora, salvo reabrir la competición. Exigir que se ciñan a su error no mejora las cosas para nadie. [33]
Hubo cierta confusión sobre la posibilidad de que se hayan realizado cambios internos en Keccak, que fueron aclarados por el equipo original, afirmando que la propuesta del NIST para SHA-3 es un subconjunto de la familia Keccak, para la cual se pueden generar vectores de prueba utilizando su código de referencia. presentado al concurso, y que esta propuesta fue el resultado de una serie de discusiones entre ellos y el equipo de hash del NIST. [34]
En respuesta a la controversia, en noviembre de 2013, John Kelsey del NIST propuso volver a la propuesta original c = 2 d para todas las instancias de reemplazo directo SHA-2. [35] La reversión fue confirmada en borradores posteriores [36] y en la versión final. [4]
SHA-3 utiliza la construcción de esponja , [13] en la que los datos se "absorben" en la esponja y luego el resultado se "exprime". En la fase de absorción, los bloques de mensajes se someten a XOR en un subconjunto del estado, que luego se transforma como un todo mediante una función de permutación . (Llamar a una permutación puede resultar confuso. Técnicamente es una permutación del espacio de estados, por lo tanto, una permutación de un conjunto con elementos, pero hace más que simplemente permutar los bits del vector de estado. [ cita necesaria ] ) En el "comprimir "fase, los bloques de salida se leen del mismo subconjunto del estado, alternados con la función de transformación de estado . El tamaño de la parte del estado que se escribe y lee se llama "tasa" (denotada ), y el tamaño de la parte que no es tocada por la entrada/salida se llama "capacidad" (denotada ). La capacidad determina la seguridad del esquema. El nivel máximo de seguridad es la mitad del aforo.
Dada una cadena de bits de entrada , una función de relleno , una función de permutación que opera en bloques de bits de ancho , una velocidad y una longitud de salida , tenemos capacidad y la construcción de esponja , que produce una cadena de bits de longitud , funciona de la siguiente manera: [5] : 18
El hecho de que el estado interno S contenga c bits de información adicionales además de lo que se envía a Z evita los ataques de extensión de longitud a los que son susceptibles SHA-2, SHA-1, MD5 y otros hashes basados en la construcción Merkle-Damgård .
En SHA-3, el estado S consta de una matriz de 5 × 5 de palabras de w bits (con w = 64), b = 5 × 5 × w = 5 × 5 × 64 = 1600 bits en total. Keccak también se define para tamaños de palabras de potencia de 2 más pequeños w hasta 1 bit (estado total de 25 bits). Se pueden utilizar tamaños de estado pequeños para probar ataques criptoanalíticos, y tamaños de estado intermedios (desde w = 8.200 bits hasta w = 32.800 bits) se pueden utilizar en aplicaciones prácticas y ligeras. [11] [12]
Para las instancias SHA3-224, SHA3-256, SHA3-384 y SHA3-512, r es mayor que d , por lo que no hay necesidad de permutaciones de bloques adicionales en la fase de compresión; los d bits principales del estado son el hash deseado. Sin embargo, SHAKE128 y SHAKE256 permiten una longitud de salida arbitraria, lo cual es útil en aplicaciones como el relleno de cifrado asimétrico óptimo .
Para garantizar que el mensaje se pueda dividir uniformemente en bloques de r bits, se requiere relleno. SHA-3 utiliza el patrón 10 * 1 en su función de relleno: un 1 bit, seguido de cero o más 0 bits (máximo r − 1 ) y un 1 bit final.
El máximo de r − 1 cero bits se produce cuando el último bloque de mensaje tiene r − 1 bits de longitud. Luego se agrega otro bloque después del 1 bit inicial, que contiene r − 1 bits cero antes del 1 bit final.
Los dos bits 1 se sumarán incluso si la longitud del mensaje ya es divisible por r . [5] : 5.1 En este caso, se agrega otro bloque al mensaje, que contiene 1 bit, seguido de un bloque de r − 2 bits cero y otro de 1 bit. Esto es necesario para que un mensaje con una longitud divisible por r que termina en algo que parece relleno no produzca el mismo hash que el mensaje al que se le quitaron esos bits.
El 1 bit inicial es necesario para que los mensajes que difieran sólo en unos pocos 0 bits adicionales al final no produzcan el mismo hash.
La posición del último bit indica qué tasa r se utilizó (relleno de múltiples tasas), que se requiere para que la prueba de seguridad funcione para diferentes variantes de hash. Sin él, diferentes variantes de hash del mismo mensaje corto serían iguales hasta el truncamiento.
La transformación de bloque f , que es Keccak-f[1600] para SHA-3, es una permutación que utiliza operaciones XOR , AND y NOT , y está diseñada para una fácil implementación tanto en software como en hardware.
Se define para cualquier tamaño de palabra de potencia de dos , w = 2 ℓ bits. El envío principal de SHA-3 utiliza palabras de 64 bits, ℓ = 6 .
Se puede considerar que el estado es una matriz de bits de 5 × 5 × w . Sea a [ i ][ j ][ k ] el bit (5 i + j ) × w + k de la entrada, utilizando una convención de numeración de bits little-endian y una indexación de filas principales . Es decir, i selecciona la fila, j la columna y k el bit.
La aritmética de índices se realiza en módulo 5 para las dos primeras dimensiones y en módulo w para la tercera.
La función básica de permutación de bloques consta de 12 + 2 ℓ rondas de cinco pasos:
La velocidad del hash SHA-3 de mensajes largos está dominada por el cálculo de f = Keccak-f[1600] y XORing S con el Pi extendido , una operación en b = 1600 bits. Sin embargo, dado que los últimos c bits del P i extendido son 0 de todos modos, y XOR con 0 es un NOP, es suficiente realizar operaciones XOR solo para r bits ( r = 1600 − 2 × 224 = 1152 bits para SHA3-224 , 1088 bits para SHA3-256, 832 bits para SHA3-384 y 576 bits para SHA3-512). Cuanto menor es r (y, a la inversa, cuanto mayor c = b − r = 1600 − r ), menos eficiente pero más seguro se vuelve el hash, ya que se pueden aplicar XOR a menos bits del mensaje en el estado (una operación rápida) antes de cada aplicación del computacionalmente costoso f . Los autores informan las siguientes velocidades para implementaciones de software de Keccak-f[1600] más XORing de 1024 bits, [1] que corresponde aproximadamente a SHA3-256:
Para SHA3-256 exacto en x86-64, Bernstein mide entre 11,7 y 12,25 cpb dependiendo de la CPU. [38] : 7 SHA-3 ha sido criticado por ser lento en arquitecturas de conjuntos de instrucciones (CPU) que no tienen instrucciones diseñadas especialmente para calcular las funciones de Keccak más rápido: SHA2-512 es más del doble de rápido que SHA3-512 y SHA. -1 es más de tres veces más rápido en un procesador Intel Skylake con frecuencia de 3,2 GHz. [39] Los autores han reaccionado a esta crítica sugiriendo usar SHAKE128 y SHAKE256 en lugar de SHA3-256 y SHA3-512, a expensas de reducir la resistencia de preimagen a la mitad (pero manteniendo la resistencia a la colisión). Con esto, el rendimiento está a la par con SHA2-256 y SHA2-512.
Sin embargo, en implementaciones de hardware , SHA-3 es notablemente más rápido que todos los demás finalistas, [40] y también más rápido que SHA-2 y SHA-1. [39]
A partir de 2018, las arquitecturas ARMv8 [41] de ARM y s390x de IBM incluyen instrucciones especiales que permiten que los algoritmos Keccak se ejecuten más rápido.
El estándar NIST define las siguientes instancias, para el mensaje M y la longitud de salida d : [5] : 20, 23
Con las siguientes definiciones
Las instancias SHA-3 son reemplazos directos de SHA-2 y están destinadas a tener propiedades de seguridad idénticas.
SHAKE generará tantos bits de su esponja como se solicite, siendo así funciones de salida extensibles (XOF). Por ejemplo, SHAKE128(M, 256) se puede utilizar como función hash con un flujo de bits de 256 caracteres con un nivel de seguridad de 128 bits. Se pueden utilizar longitudes arbitrariamente grandes como generadores de números pseudoaleatorios. Alternativamente, SHAKE256(M, 128) se puede utilizar como función hash con una longitud de 128 bits y una resistencia de 128 bits. [5]
Todas las instancias añaden algunos bits al mensaje, el más a la derecha de los cuales representa el sufijo de separación de dominio . El propósito de esto es garantizar que no sea posible construir mensajes que produzcan la misma salida hash para diferentes aplicaciones de la función hash Keccak. Existen los siguientes sufijos de separación de dominios: [5] [42]
En diciembre de 2016, NIST publicó un nuevo documento, NIST SP.800-185, [43] que describe funciones adicionales derivadas de SHA-3:
• X es la cadena de bits de entrada principal. Puede tener cualquier longitud, incluido cero.
• L es un número entero que representa la longitud de salida solicitada en bits.
• N es una cadena de bits de nombre de función, utilizada por NIST para definir funciones basadas en cSHAKE. Cuando no se desea ninguna función distinta a cSHAKE, N se establece en la cadena vacía.
• S es una cadena de bits de personalización. El usuario selecciona esta cadena para definir una variante de la función. Cuando no se desea ninguna personalización, S se establece en la cadena vacía.
• K es una cadena de bits clave de cualquier longitud, incluido cero.
• B es el tamaño del bloque en bytes para hash paralelo. Puede ser cualquier número entero tal que 0 < B < 2 2040 .
En 2016, el mismo equipo que creó las funciones SHA-3 y el algoritmo Keccak introdujo alternativas de rondas reducidas más rápidas (reducidas a 12 y 14 rondas, de las 24 en SHA-3) que pueden explotar la disponibilidad de ejecución paralela debido al uso de árbol. hash : KangarooTwelve y MarsupilamiFourteen. [45]
Estas funciones se diferencian de ParallelHash, la función hash paralelizable basada en Keccak estandarizada por FIPS, con respecto al paralelismo, en que son más rápidas que ParallelHash para mensajes de tamaño pequeño.
El número reducido de rondas se justifica por el enorme esfuerzo criptoanalítico centrado en Keccak, que no produjo ataques prácticos contra ningún Keccak cercano a doce rondas. Estos algoritmos de mayor velocidad no forman parte de SHA-3 (ya que son un desarrollo posterior) y, por lo tanto, no cumplen con FIPS; pero debido a que usan la misma permutación de Keccak, son seguros mientras no haya ataques a SHA-3 reducidos a 12 rondas. [45]
KangarooTwelve es una versión de Keccak de ronda reducida (de 24 a 12 rondas) de mayor rendimiento que afirma tener 128 bits de seguridad [46] y un rendimiento de hasta 0,55 ciclos por byte en una CPU Skylake . [47] Este algoritmo es un borrador RFC del IETF . [48]
MarsupilamiFourteen, una ligera variación de KangarooTwelve, utiliza 14 rondas de la permutación Keccak y reclama 256 bits de seguridad. Tenga en cuenta que la seguridad de 256 bits no es más útil en la práctica que la seguridad de 128 bits, pero algunos estándares pueden exigirla. [46] 128 bits ya son suficientes para derrotar ataques de fuerza bruta en el hardware actual, por lo que tener seguridad de 256 bits no agrega valor práctico, a menos que el usuario esté preocupado por avances significativos en la velocidad de las computadoras clásicas . Para conocer la resistencia contra las computadoras cuánticas , consulte a continuación.
KangarooTwelve y MarsupilamiFourteen son funciones de salida extensible, similares a SHAKE, por lo tanto, generan una salida estrechamente relacionada para un mensaje común con diferente longitud de salida (la salida más larga es una extensión de la salida más corta). Esta propiedad no la exhiben funciones hash como SHA-3 o ParallelHash (excepto las variantes XOF). [5]
En 2016, el equipo de Keccak lanzó una construcción diferente llamada construcción Farfalle y Kravatte, una instancia de Farfalle que utiliza la permutación Keccak-p, [49] así como dos algoritmos de cifrado autenticados Kravatte-SANE y Kravatte-SANSE [50].
RawSHAKE es la base de la codificación Sakura para el hash de árboles, que aún no se ha estandarizado. Sakura usa un sufijo 1111 para nodos individuales, equivalente a SHAKE, y otros sufijos generados según la forma del árbol. [42] : 16
Existe un resultado general ( algoritmo de Grover ) de que las computadoras cuánticas pueden realizar un ataque de preimagen estructurado en , mientras que un ataque clásico de fuerza bruta necesita 2 d . Un ataque de preimagen estructurado implica un segundo ataque de preimagen [27] y, por tanto, un ataque de colisión . Una computadora cuántica también puede realizar un ataque de cumpleaños , rompiendo así la resistencia a la colisión, en [51] (aunque eso está en disputa). [52] Teniendo en cuenta que la fuerza máxima puede ser , esto da los siguientes límites superiores [53] sobre la seguridad cuántica de SHA-3:
Se ha demostrado que la construcción Merkle-Damgård , tal como la utiliza SHA-2, colapsa y, en consecuencia, es resistente a las colisiones cuánticas, [54] pero para la construcción de esponja utilizada por SHA-3, los autores proporcionan pruebas sólo para el caso en el que la función de bloque f no es invertible eficientemente; Keccak-f[1600], sin embargo, es eficientemente invertible, por lo que su prueba no se aplica. [55] [ investigación original ]
Los siguientes valores hash son de NIST.gov: [56]
SHA3-224("")6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7SHA3-256("")a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434aSHA3-384("")0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004SHA3-512("")a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26AGITAR128("", 256)7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26AGITAR256("", 512)46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be
Cambiar un solo bit hace que cada bit en la salida cambie con un 50% de probabilidad, lo que demuestra un efecto de avalancha :
SHAKE128("El rápido zorro marrón salta sobre el perro perezoso", 256)f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66eSHAKE128("El veloz zorro marrón salta sobre el perezoso do f ", 256)853f4538be0db9621a6cea659a06c1107b1f83f02b13d18297bd39d7411cf10c
En la siguiente tabla, estado interno significa la cantidad de bits que se transfieren al siguiente bloque.
La implementación optimizada usando AVX-512VL (es decir, desde OpenSSL , ejecutándose en CPU Skylake-X ) de SHA3-256 logra aproximadamente 6,4 ciclos por byte para mensajes grandes, [62] y aproximadamente 7,8 ciclos por byte cuando se usa AVX2 en CPU Skylake . [63] El rendimiento en otras CPU x86, Power y ARM dependiendo de las instrucciones utilizadas, y el modelo exacto de CPU varía de aproximadamente 8 a 15 ciclos por byte, [64] [65] [66] con algunas CPU x86 más antiguas hasta 25–40 ciclos por byte. [67]
A continuación se muestra una lista de bibliotecas de criptografía que admiten SHA-3:
Los núcleos de CPU SoC de seis núcleos Apple A13 ARMv8 tienen soporte [68] para acelerar SHA-3 (y SHA-512) utilizando instrucciones especializadas (EOR3, RAX1, XAR, BCAX) del conjunto de extensiones criptográficas ARMv8.2-SHA. [69]
Algunas bibliotecas de software utilizan funciones de vectorización de las CPU para acelerar el uso de SHA-3. Por ejemplo, Crypto++ puede usar SSE2 en x86 para acelerar SHA3, [70] y OpenSSL también puede usar MMX , AVX-512 o AVX-512VL en muchos sistemas x86. [71] Además, las CPU POWER8 implementan rotación vectorial de 2x64 bits, definida en PowerISA 2.07, que puede acelerar las implementaciones SHA-3. [72] La mayoría de las implementaciones para ARM no utilizan instrucciones vectoriales de neón ya que el código escalar es más rápido. Sin embargo, las implementaciones ARM se pueden acelerar utilizando instrucciones vectoriales SVE y SVE2; Estos están disponibles, por ejemplo, en la CPU Fujitsu A64FX . [73]
IBM z/Architecture admite SHA-3 desde 2017 como parte de Message-Security-Assist Extension 6. [74] Los procesadores admiten una implementación completa de todos los algoritmos SHA-3 y SHAKE a través de las instrucciones KIMD y KLMD utilizando un hardware Motor de asistencia integrado en cada núcleo.