Que yo sepa, un archivo solo puede tener un hash y un hash corresponde solo a ese archivo (dejando a un lado el 2 file one hash bug
). Usando ese conocimiento, ¿es posible hacer un algoritmo para recrear un archivo usando únicamente el hash?
Teóricamente sí, técnicamente extremadamente difícil aunque los hashes son funciones matemáticamente irreversibles.
Tomemos un ejemplo. El tamaño máximo de entrada para un algoritmo SHA1 es 2 ^ 64−1 bits. Por lo tanto, con un algoritmo de hash, aparentemente estás mapeando todos los archivos posibles de 2 ^ 64−1 bits a un valor de longitud fija de 160 bits.
En teoría, puede haber numerosas colisiones, ya que estamos mapeando de un conjunto más grande a un conjunto más pequeño.
En ese caso, si hay una tabla de búsqueda con hashes de todos los valores posibles de {M}, podemos buscar los valores de hash en la tabla y podemos reducir los mensajes posibles de un hash a un puñado de colisiones que el valor de hash puede tener. En el ejemplo anterior, si se proporciona el valor hash A, podemos estar seguros de que el mensaje sería M1 o M4 o M10. Si conocemos el tamaño aproximado del archivo, se puede hacer una suposición educada para señalar el mensaje real.
Técnicamente es bastante imposible debido a la gran cantidad de mensajes posibles.
En primer lugar, el hash es siempre una función unidireccional. (Idealmente) No hay manera de "aplicar ingeniería inversa" a la función hash analizando los valores hash.
Segundo, no hay forma de que un hash pueda llevar información (o metadatos) sobre el archivo.
Los algoritmos de hash (como MD4 y los algoritmos SHA posteriores) utilizan variables de 32 bits con funciones booleanas a nivel de bits como los operadores lógicos AND, OR y XOR para trabajar desde el archivo / texto de entrada hasta el hash de salida.
Lea otras preguntas en las etiquetas hash file-encryption md5