Función MD5

La función MD5 es un algoritmo criptográfico que toma una entrada de cualquier longitud y produce un resumen del mensaje de 128 bits de longitud. El resumen también es llamado “hash” o “huella digital” de la entrada. MD5 es usado en situaciones donde un mensaje muy largo necesita ser procesado o comparado rápidamente. Se aplica comúnmente en la creación y verificación de firmas digitales y la comprobación de la modificación de algún archivo.

MD5 fue diseñado por el criptógrafo Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts) en 1991.

La codificación del MD5 de 128 bits es representada típicamente como un número de 32 símbolos hexadecimales.

Al aplicar la función MD5 a una entrada cualquiera se produce una codificación. En caso de que la entrada cambie aunque sea un bit se producirá una codificación totalmente diferente.


Por ejemplo:

MD5("hola mundo") = 0ad066a5d29f3f2a2a1c7c17dd082a79

Un cambio en el texto produce una salida completamente diferente.

MD5("Hola mundo") = f822102f4515609fc31927a84c6db7f8

Otro ejemplo sería la codificación de un campo vacío:

MD5("") = d41d8cd98f00b204e9800998ecf8427e


Codificado

El algoritmo MD5 divide la entrada en bloques de 512 bits cada uno. 64 bits son insertados al final del último bloque, los cuales son usados para almacenar la longitud original del mensaje. Si el último bloque es menor a 512 bits, son agregados bits extra al final del bloque.

Después cada boque es dividido en 16 palabras de 32 bits cada uno. Estos serán denotados por .


Inicialización del buffer

Un búfer de cuatro palabras (A, B, C, D) se usa para calcular el resumen del mensaje. Aquí cada una de las letras A, B, C, D representa un registro de 32 bits. Estos registros se inicializan con los siguientes valores hexadecimales:

palabra A:   01 23 45 67
palabra B:   89 ab cd ef
palabra C:   fe dc ba 98
palabra D:   76 54 32 10


Tabal T

MD5 usa una tabla T de 64 elementos. Cada elemento es obtenido de la función aritmética

Ti = abs(sin(i + 1)) * 232

Funciones auxiliares

El algoritmo MD5 usa cuatro funciones auxiliares, cada una tiene una entrada tres palabras de 32 bits y produce una salida de una palabra de 32 bits. Cada función aplica operaciones lógicas AND, OR, NOT y XOR.

F(X, Y, Z) = (X and Y) or (not(X) and Z)
G(X, Y, Z) = (X and Z) or (Y and not(Z))
H(X, Y, Z) = X xor Y xor Z
I(X, Y, Z) = Y xor (X or not(Z))

Procesamiento

El valor de los cuatro buffers es mezclado con la entrada, usando las funciones auxiliares. Existen cuatro rondas, cada una de 16 operaciones

Ronda 1.
[abcd k s i] denotarán la operación:      

Hacer las siguientes 16 operaciones.
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]


Ronda 2.
[abcd k s i] denotarán la operación:      

Hacer las siguientes 16 operaciones.
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]


Ronda 3.
[abcd k s i] denotarán la operación:      

Hacer las siguientes 16 operaciones.
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]


Ronda 4.
[abcd k s i] denotarán la operación:      

Hacer las siguientes 16 operaciones.
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

Ahora se realizan las sumas.

Donde , , y son los valores iniciales del buffer.

El resumen del mensaje es la salida producida por , , y .


Referencias

  1. Wade Trappe, Lawrence C. Washington. (2006). Introduction to Cryptography with Coding Theory. United States: Prentice Hall.