The mathematics behind blockchain (parte IV): Función, constante y procesado de la función hash SHA-256
Szabo recordaba que había visto un documento de 2002 de la ‘Federal Information Proccessing Stantards’ que habla sobre la ‘Secure hash standard’. Rebuscando entre sus papeles encontró este informe que trataba sobre las funciones de hash y una de ellas era la SHA-256.
La función hash SHA-256 utiliza seis funciones lógicas, donde cada función opera en palabras de 32 bits, que se representan como x, y y z. El resultado de cada función es una nueva palabra de 32 bits (Federal Information Processing Standards, 2002).
Supongamos que la longitud del mensaje, M, es ‘l’ bits. Agregue el bit «1» al final del mensaje, seguido de k bits cero, donde k es la solución no negativa más pequeña de la ecuación (l + 1 + k ≡ 448mod512). Luego tenemos el bloque de 64 bits que es igual al número ‘l’ expresado el uso en una representación binaria. Por ejemplo, el mensaje «abc» (8 bits ASCII) tiene longitud (8 x 3 = 24), por lo que el mensaje se rellena con un bit, luego (448 – (24+1) = 423) bits cero, y luego la longitud del mensaje, para convertirse en el mensaje relleno de 512 bits.
La longitud del mensaje rellenado ahora debe ser un múltiplo de 512 bits.
Por tanto, la función hash inicia un vector que depende de la función hash cambiaría sus valores, pero siempre de una manera fija. Con todo esto y por medio de la función se aplica diferentes operaciones y tras una etapa final se obtiene la función hash del mensaje (Nakamoto, S., 2008).
Por tanto, para el mensaje de un bloque con función hash SHA-256, M, sea la cadena ASCII de 24 bits (l = 24) «abc», que es equivalente a siguiente cadena binaria:
01100001 01100010 01100011
Después de completar el preprocesado, cada bloque de mensajes, siguiendo los siguientes pasos:
Para i=1 a N:
1. Preparar la función hash del mensaje, {Wt}:
{
}
0 ≤ t ≤ 15
16 ≤ t ≤ 25
El mensaje se rellena agregando un bit «1», seguido de 423 bits «0» y terminando con el valor hexadecimal 00000000 00000018 (la representación de dos palabras de 32 bits de la longitud, 24). Por lo tanto, el mensaje final rellenado consta de un bloque (N = 1).
Las palabras del bloque de mensaje rellenado se asignan a las palabras W0, …, W15 de la programación de mensajes:
2. Inicia el proceso del trabajo de 8 variables, a, b, c, d, e, f , g y h, con el (i-1)st del valor de la función del hash:
{
}
Para SHA-256, el valor hash inicial, H (0), es:
3. De t=0 a 25:
{
}
La siguiente tabla muestra los valores hexadecimales para a, b, c, d, e, f, g y h después de pasar t del ciclo «for t = 0 to 25»:
4. Calcular el i ésimo valor de hash intermedio H (i):
{
}
Eso completa el procesado del primer y único bloque de mensajes, M(1). El valor de hash final, H(1), se calcula para ser:
Después de repetir los pasos uno a cuatro un total de N veces (es decir, después de procesar M (N)), la función hash del mensaje de 256 bits resultante del mensaje, M, es:
Por tanto, la función hash del mensaje de 256 bits resultante es:
ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
Continuará…
Referencias:
- Federal Information Processing Standards (2002) SECURE HASH STANDARD. Publication 180-2. Enlace web: http://everyspec.com/NIST/NIST-FIPS/FIPS_PUB_180-2(AUG_2002)_3221/