¿Qué es una explicación intuitiva de la función hash de Davies-Meyer?

Davies-Meyer es una función de compresión que se puede utilizar para crear funciones de cifrado hash, un ejemplo simple sería una cadena Merkle-Damgard de construcciones Davies-Meyer.

La idea básica de la construcción de DM es que comprime un bloque de texto en “n” bits usando un algoritmo de encriptación poniendo un valor inicial aleatorio de “n” bit como mensaje y usando su bloque de texto como clave. Por lo tanto, el resultado después del cifrado es un bloque de n bits.

Es muy importante luego XOR el resultado del cifrado con el valor inicial, de lo contrario, es muy fácil crear una colisión y eso es un gran no-no para una función hash criptográfica.

Por ejemplo, digamos que no es XOR, solo encripta el IV con el bloque de texto que está troquelando. Llamemos al resultado h.

h = E (IV, texto)

Ahora podemos crear un bloque aleatorio del mismo tamaño que el IV y descifrar.

texto2 = D (IV2, h)

Y ahora sabemos que:

E (IV2, texto2) = h

Luego

E (IV, texto) = E (IV2, texto2)

Y hemos creado una colisión.

Lo dejaré como ejercicio para mostrar por qué eliminar el resultado con el texto sin formato inicial evita estas colisiones fáciles.

Las construcciones de DM se pueden encadenar, puede alimentar el resultado de DM como texto sin formato del próximo DM utilizando el siguiente bloque de texto como clave, etc.

Si no recuerdo mal, SHA256 es una combinación de funciones de compresión de Davies-Meyer que utilizan Merkle-Damgard y SHACAL-2 como algoritmo de cifrado.

Un cifrado de bloque seguro es básicamente una función pseudoaleatoria entre un conjunto (K x M) y otro (CT). El hecho de que sea pseudoaleatorio ayuda a “distribuir uniformemente” las picaduras en el hash (que, a su vez, es necesario para satisfacer la definición de una función hash), por lo que eso explica el hecho de que debe usar un cifrado de bloque.

En cuanto a la alimentación de un bloque del mensaje como clave, cuando realiza una función hash, desea que sea lo más dependiente posible de la entrada, y no puede hacerlo más depende de la entrada que simplemente alimentar toda la entrada, de alguna manera.

Además, el mensaje se trata como la clave, no como el PT para el cifrado de bloque porque, por la definición de un cifrado de bloque, un bloque de texto sin formato tiene la misma longitud que un bloque de texto cifrado, por lo que básicamente tiene que unir extremos que tienen la misma longitud de salida y alimentan el mensaje en el extremo restante.

No he oído hablar de esta función hash antes, pero la busqué y encontré esta función de compresión unidireccional en wikipedia y tenía sentido para mí, espero que ayude.

Editar: Además, si el cifrado de bloque es seguro (produce cosas aparentemente aleatorias), entonces es intuitivamente comprobable que la función hash resultante de este esquema es segura ya que, al generar “cosas aparentemente aleatorias” no puede diferenciar una entrada de otra, por lo tanto, tener que mirar a través de muchas entradas posibles para encontrar una colisión.