Advertencia: Respuesta larga
creo que todas estas respuestas están perdiendo una propiedad muy importante de las funciones hash criptográficas: No sólo es imposible calcular el mensaje original que fue hash para obtener un hash dado, es imposible calcular cualquier mensaje que haría hash a un valor hash dado. Esto se llama resistencia a la preimagen.
(Por "imposible" - me refiero a que nadie sabe cómo hacerlo en menos tiempo del que se necesita para adivinar cada mensaje sea posible hasta que adivinar la que fue ordenada en su hash.)
(A pesar La creencia popular en la inseguridad de MD5, MD5 todavía es preimagen resistente. Cualquier persona que no me crea es libre de darme cualquier cosa que tenga valores hash a 2aaddf751bff2121cc51dc709e866f19
. Lo que MD5 no tiene es collision resistance, que es algo completamente diferente).
Ahora, si la única razón por la que no puede "trabajar al revés" en una función hash criptográfica fue porque la función hash descarta datos para crear el hash, entonces no garantizaría la resistencia de la imagen: todavía puede "trabajar hacia atrás", e inserte datos aleatorios donde la función de hash descarte los datos, y aunque no aparezca el mensaje original, usted tendría todavía se le ocurre un mensaje que hash al valor de hash deseado. Pero no puedes.
Entonces la pregunta es: ¿Por qué no? (O, en otras palabras, ¿cómo hace que una función sea resistente a las imágenes?)
La respuesta es que las funciones hash criptográficas simulan sistemas caóticos. Toman tu mensaje, lo dividen en bloques, mezclan esos bloques, hacen que algunos de los bloques interactúen entre ellos, mezclan esos bloques y lo repiten muchas veces (bueno, una función de hash criptográfica hace eso, otros tienen su métodos propios). Dado que los bloques interactúan entre sí, el bloque C no solo tiene que interactuar con el bloque D para producir el bloque A, sino que tiene que interactuar con el bloque E para producir el bloque B. Ahora, seguro, puede encontrar los valores de los bloques C, D, E que produciría los bloques A y B en su valor de hash, pero a medida que retrocede, de repente necesita un bloque F que interactúa con C para hacer D, y con E para hacer B, y ningún bloque de ese tipo puede hacer ambas cosas en ¡al mismo tiempo! Debe haber adivinado los valores incorrectos para C, D y E.
Si bien no todas las funciones hash criptográficas son exactamente como se describió anteriormente con la interacción de bloques, tienen la misma idea: que si intenta "trabajar hacia atrás", Va a terminar con un montón de callejones sin salida, y el tiempo que le toma probar suficientes valores para generar una preimagen es del orden de cientos o millones de años (dependiendo de la función de hash), no mucho mejor que el tiempo que tomaría simplemente probar los mensajes hasta que encuentres uno que funcione.
No vi tu edición. Creo que lo has resumido en esas dos balas. –
Sí, el "consenso" en las respuestas a la [pregunta que enlazó] (http://stackoverflow.com/questions/330207/how-come-md5-hash-values-are-not-reversible) es totalmente incorrecto. Acabo de agregar otra respuesta corrigiendo esto. –
La razón de la propiedad de reversibilidad no es la "cantidad infinita de cadenas de entrada", también debería ser el caso cuando limita la entrada a algo pequeño (como alrededor del tamaño de salida). –