A ver, iré por pasos:
Primero se ha de alargar el mensaje hasta que su longitud en bits sea congruente con 448 mod 512, lo que significa que la longitud dividida entre 512 ha de dar de resto 448. Este alargamiento se hace añadiendo un 1 obligatorio y tantos ceros como sea necesario. Hay que tener en cuenta que el 1 se añade siempre, aunque la longitud del mensaje ya sea congruente, por lo que siempre se añadirán entre 1 y 512 bits.
Se concatena al final del mensaje alargado una representación de 64 bits de la longitud original del mensaje (sin alargar). Si los 64 bits no son suficientes para representar la longitud, se cogen los 64 bits de menor peso. Después de esto, tendremos un mensaje de longitud múltiplo de 512 y de 32 bits (una palabra), ya que cada bloque de 512 bits contiene 16 palabras de 32 bits.
Para calcula la salida, es necesario utilizar un buffer de cuatro palabras, A, B, C, y D, que se inicializan con los siguientes valores hexadecimales:
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
También se defines cuatro funciones:
F(X,Y,Z) = (X AND Y) OR ((NOT X) AND Z)
G(X,Y,Z) = (X AND Y) OR (Y AND (NOT Z))
H(X,Y,Z) = X XOR Y XOR Z
I(X,Y,Z) = Y XOR (X OR (NOT Z))
Estas funciones utilizan tres palabras como entrada (B, C y D) y dan una como salida y cada función es aplicada dicieséis veces antes de pasar a la siguiente de la siguiente forma:
M[k] T[ i] B
| | |
A---------------------------------+------+-----------+----<<s-----+
|
B---- |
| |
C-------Función que toque---salida
|
D----
El resultado de eso es la nueva B, la nueva A es la anterior D, la nueva C es la anterior B y la nueva D es la anterior C. M[k] es un bloque de 32 bits del mensaje y T[ i] es un elemento de una tabla de 64 elementos (16 veces cada función por cuatro funciones = 64 rondas) que es igual a la parte entera de 4294967296 el valor absoluto del seno de i. El operador (+) de la representación indica una suma módulo 2^32 y y <<s es una rotación a la izquierda de s bits.
Como he dicho, se hace 16 veces este paso con cada función, donde los valores de las cuatro palabras de la vuelta anterior son los iniciales de la siguiente vuelta. Una vez se han hecho las 16 vueltas con una función, se pasa a la siguiente función con los valores de las cuatro palabras de la anterior vuelta. Los valores iniciales de la cuatro palabras son aquellos con los que las hemos inicializado.
La salida se obtiene de A, B, C y D, donde D es el byte más significativo y A el menos significativo.
Espero que te haya quedado claro.
Un saludo de ghastlyX
