La mayoría de las funciones de hash criptográficas operan en un estado interno de tamaño fijo y procesan el mensaje para ser bloqueado bloque a bloque, donde un bloque es un número de bits. MD5, SHA-1 y SHA-2 siguen la construcción Merkle-Damgård que opera de la siguiente manera:
- Sea S una matriz de bits N , inicializada a un valor predefinido. N es el tamaño del estado interno y puede ser diferente del tamaño final del hash.
- Actualice el estado en función de cada bloque de mensajes sucesivamente. Más precisamente, para cada bloque de mensajes M i , establezca S: = C (M i , S). La función C se conoce como la función de compresión; toma un bloque de K -bit y un valor de estado de N -bit y genera un nuevo valor de N -bit state.
- Para los últimos bits de entrada, que pueden no formar un bloque completo (si la longitud del mensaje no es un múltiplo de la longitud del bloque), aplique una función de relleno a S que tome en cuenta la longitud del mensaje. (La construcción Merkle-Damgård requiere un método de relleno específico que no estoy describiendo aquí).
- Devuelva F (S) donde F se denomina función de finalización. F toma un estado de N -bit como entrada y devuelve un n -bit hash.
La función de compresión se llama así porque toma K + N bits de entrada y devuelve solo N bits de salida. Por supuesto, esto significa que hay muchas colisiones: pares distintos (M i , S) que producen el mismo estado resultante. Sin embargo, si se hace correctamente, es decir, si es computacionalmente imposible encontrar colisiones para la función de compresión, entonces el hash en sí también es resistente a colisiones.
Hay funciones hash criptográficas no Merkle-Damgård, por ejemplo, SHA-3, que utiliza una construcción de esponja . El método operativo es un poco diferente, pero el principio básico es el mismo:
- Trabaja con un estado de tamaño fijo.
- Transforme el estado basado en un bloque de mensajes a la vez.
- Aplicar relleno al último bloque.
- Aplique una función de finalización al estado interno para devolver el valor de hash.
Los hash no criptográficos a menudo dependen de la aritmética (pero este enfoque no tiende a producir funciones hash criptográficas rápidas). Utilizan aritmética modular como función de compresión para mantener el estado actual en un tamaño fijo.