Diferencia entre keccak256 y sha3

He estado revisando la implementación de keccak256 y sha3-256 que sigue el estándar FIPS. La función de esponja tarda un tiempo en establecerse, pero he notado una diferencia en la implementación:

Me di cuenta de que web3.js usa la implementación crypto-js de sha3: https://github.com/brix/crypto-js/blob/develop/src/sha3.js A partir de ahí, reúno la var LFSR = 0x01;

que se establece en 0x06 en sha3-256. ¿Estoy en lo correcto en esta observación?

¿Qué otras diferencias hay?

He confirmado con casos de prueba que esta es la diferencia fundamental en los 2 algoritmos. También he probado con Solidity.

Respuestas (2)

de una respuesta a ¿Cuáles son las diferencias clave entre el borrador del estándar SHA-3 y la presentación de Keccak? :

  1. No, no lo hicieron, los niveles internos y de seguridad no se han cambiado desde el borrador de la presentación de Keccak, solo ha cambiado la regla de relleno.
  2. El cambio de relleno es la única diferencia, esto permite que los futuros modos de hash de árbol, así como las salidas actuales de SHAKE, generen diferentes resúmenes con los mismos parámetros de seguridad y entradas de mensajes. Se agregan hasta 4 bits adicionales, lo que mantiene el relleno completo dentro de un límite de bytes, lo que hace que las implementaciones con entrada de octeto solo puedan cambiar a SHA-3 desde Keccak con el cambio a una sola línea de código.
  3. El cambio de relleno no tiene un impacto negativo en la seguridad de SHA-3.

Keccak y sha-3 no son lo mismo. En 2007, el Instituto Nacional de Estándares y Tecnología de EE. UU. (NIST) inició una competencia sobre SHA-3. En 2012, el equipo de Keccak ganó la competencia. A partir de ese momento, los desarrolladores implementaron muchas soluciones "sha3" basadas en Keccak. Sin embargo, en 2014, NIST modificó la solución Keccak y lanzó FIPS 202, y esta propuesta actualizada se convierte en el estándar oficial SHA-3 en agosto de 2015. Muchos programas "antiguos" todavía usan Keccak y no se actualizan al estándar oficial SHA-3.

El código "antiguo" basado en Keccak no genera el mismo valor hash que SHA-3. Por lo tanto, si usa una biblioteca "sha3", debe tener muy claro que la biblioteca se basa en Keccak o se basa en SHA-3 estándar. Una solución simple es hacer una prueba de entrada vacía:

La salida estándar SHA-3 es:

a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

Muchas salidas antiguas de Keccak-256 son:

c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

desde aquí

La idea clave detrás de SHA-3 se basa en permutaciones no codificadas, a diferencia de otras construcciones típicas de funciones hash que utilizan permutaciones codificadas. Keccak tampoco hace uso de la transformación Merkle-Damgard que se usa comúnmente para manejar mensajes de entrada de longitud arbitraria en funciones hash. En Keccak se utiliza un enfoque más nuevo, llamado construcción de esponja y compresión. Es un modelo de permutación aleatoria. Se han estandarizado diferentes variantes de SHA-3, como SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128 y SHAKE256

Si alguna vez usaste esto:

  web3.utils.soliditySha3()

eben aunque el nombre es Sha3 pero en realidad está implementado por keccak256