¿Qué es el algoritmo SHA-2?
Si ha leído nuestro otro artículo, probablemente tenga una idea bastante clara de por qué usamos SHA-2 y qué hace en un sentido general. Pero¿Qué sucede realmente cuando nos acercamos?¿Cómo podemos tomar una frase como “el hashing es complicado” y enviarla a través de un sitio web? Calculadora SHA-256 , y terminar con un hash como este:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
¿Cómo es que una simple letra “A” nos da algo igualmente complejo?
559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd
¿Cómo puede toda la Declaración de Independencia resultar en algo tan similar a una sola letra, pero también con valores tan diferentes?
639505bee7bdae68f224b0d5bcb1c324d0e33011d2302839b7bedfab4515a1bb
¿Qué sucede realmente dentro del algoritmo SHA-2?
¿Cómo funciona el algoritmo SHA-2?
investigaremoscómo funciona el algoritmo SHA-2 a través de un ejemplo, repasando cada paso que lleva nuestro mensaje, 'el hash es complicado', y de alguna manera nos da el resultado complicado de:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Demostraremos SHA-256 porque es la iteración más utilizada. SHA-224, SHA-384, SHA-512, SHA-512/224 y SHA-512/256 funcionan de manera similar, excepto queLos dos primeros algoritmos tienen un tamaño de bloque de 512 bits, mientras que los últimos cuatro tienen un tamaño de bloque de 1024 bits.Tenga en cuenta que SHA-384, SHA-512, SHA-512/224 y SHA-512/256 también incluyen 80 rondas, en lugar de las 64 que describiremos.
También utilizan algunos números de entrada ligeramente diferentes en varios puntos del algoritmo. SHA-512/224 y SHA-512/256 son versiones truncadas de SHA-512, lo que significa que el hash final es solo los 224 o 256 bits más a la izquierda, respectivamente.Puedes referirte a FIPS 180-4 para los detalles.
Convirtiendo a binario
Cuando ingresamos 'el hashing es complicado' en una función hash SHA-256, lo primero que sucede es que los datos se convierten a binarios. Para simplificar la explicación, esto se debe esencialmente a queLos humanos y las máquinas hablan, entienden y trabajan en idiomas separados.. Si bien para nosotros es fácil pensar con palabras, las computadoras lo hacen todo con ceros y unos. Cada vez que los usamos, convierten nuestras letras y palabras al lenguaje binario que entienden para poder realizar cálculos. Sin embargo, todo esto generalmente se hace sin que nos demos cuenta, brindándonos una experiencia de usuario fluida.
Convertimos letras, números y símbolos a binario usando el Código estándar americano para el intercambio de información (ASCII) , que es básicamente un sistema que un comité de personas inteligentes acordó para traducir entre los dos idiomas.
Si recurrimos a un tabla ASCII , podemos ver que la primera letra de nuestra frase, una “h” minúscula, se escribe como “01101000” en binario. Según la misma tabla, una “a” minúscula es “01100001”, mientras que una “s” es “01110011” y una “h” es “01101000”. La letra “i” es “01101001”, mientras que “n” es “01101110” y “g” es “01100111”. El código binario para un espacio aparece en la tabla en la parte superior de la segunda columna como el carácter ASCII 'SP', en la misma fila que el número decimal 32. Es '00100000'.
En lugar de repasar cada letra de nuestra frase de ejemplo, simplemente la ingresaremos en una Convertidor de ASCII a binario . Al escribirlo nos da:
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 01101101 01110000 01101100 01101001 01100011 01100001 01110100 0110010
Lo anterior no tiene ningún sentido para nosotros como humanos, pero para las máquinas, dice, 'el hash es complicado'.
SHA-2 y relleno
Una vez que hayamos reescrito nuestra frase en binario, el siguiente paso es agregar relleno, que es esencialmente un montón de datos adicionales que agregamos a nuestra entrada para que tenga una longitud fija. También ayuda a prevenir ataques de extensión de longitud . Las diferentes versiones de SHA-2 tienen los siguientes tamaños de bloque:
- SHA-224 – 512 bits
- SHA-256 – 512 bits
- SHA-384 – 1024 bits
- SHA-512 – 1024 bits
- SHA-512/224 – 1024 bits
- SHA-512/256 – 1024 bits
Estos tamaños de bloque son la cantidad de datos que el algoritmo SHA-2 procesa de una sola vez. Hemos demostrado que las funciones hash son capaces de procesar entradas siempre que la Declaración de Independencia (SHA-256 en realidad pueda aceptar entradas que sean órdenes de magnitud más grandes , hasta 264-1, que es un número tan grande que realmente no tienes que preocuparte por los límites superiores del algoritmo). Sin embargo, no procesa toda esta información de una sola vez.
En cambio, en el caso de SHA-256, procesa la información en bloques de datos de 512 bits. En nuestro ejemplo, las cosas son relativamente sencillas, porquenuestra entrada 'el hashing es complicado' tiene menos de 512 bits de datos–son 176 bits. Puedes calcularlo contando cada dígito binario, o contando cada letra más los dos espacios y luego multiplicando por 8, porque cada carácter tiene una longitud de un byte.
Sin embargo, a menudo necesitamos hacer hash de entradas que tienen una longitud mucho mayor que 512 bits. En estos casos, el mensaje simplemente se divide en bloques. Si necesitáramos codificar un mensaje de 10.000 bits, simplemente tendríamos que dividirlo en varios bloques de 512 bits.
En nuestro ejemplo, sólo tenemos 176 bits de datos, pero necesitamos llenar un bloque de 512 bits. Esto significa quenecesitaremos agregar 336 bits de rellenopara completarlo. SHA-2 utiliza el siguiente esquema de relleno:
- Se agrega un “uno”después de los datos del mensaje binario que se están procesando.
- Luego, se agregan ceros hasta que la longitud de los datos de entrada más el adicional del paso anterior sumen 448 bits. En nuestro ejemplo, tenemos una longitud de entrada de 176 bits, más la del paso anterior, lo que nos lleva a 177 bits. Por tanto, necesitamos 448 menos 177 ceros. Si hacemos los cálculos, tenemos quesuma 271 ceros.
- El últimos 64 bits del bloque final (512 bits menos los 448 bits que ya hemos rellenado en los pasos anteriores) se reservan para mostrar la longitud del mensaje en binario . Como solo estamos tratando con un bloque de datos, el final debe incluir esta longitud de mensaje de 64 bits. La longitud de nuestro mensaje en bits es 176, que es 10110000 en binario . Esto irá al final del bloque, y los números anteriores se completarán con más ceros (en los casos en que tengamos una entrada mucho mayor, estos ceros serán reemplazados por el mensaje de mayor longitud escrito en binario).
Si lo juntamos todo, terminamos con el siguiente bloque acolchado de 512 bits para el mensaje 'el hashing es complicado':
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 01101101 01110000 01101100 01101001 01100011 01100001 01110100 0110010 1 0000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10110000
Si cuenta los unos y los ceros, verá que hay 512 bits de datos en el bloque anterior. Los primeros 176 bits son el mensaje de entrada en binario, “el hashing es complicado”. Le sigue el 1, que hemos puesto en negrita y subrayado para que sea más fácil de ver. Luego tenemos los 271 ceros, seguidos de la longitud del mensaje de 64 bits, que también está en negrita y subrayada. La longitud de este mensaje está precedida por ceros, como mencionamos anteriormente.
En SHA-384, SHA-512, SHA-512/224 y SHA-512/256, el esquema de relleno es esencialmente el mismo, excepto que cada bloque debe llenarse con 1024 bits de datos yel bloque final tiene las siguientes diferencias:
- En el segundo paso, se añaden ceros hasta alcanzar una longitud de 896 bits, en lugar de 448 bits.
- En el paso final, se reservan 128 bits del bloque para agregar la longitud del mensaje.
Si estuviéramos ejecutando nuestro ejemplo con SHA-384, SHA-512, SHA-512/224 o SHA-512/256, el bloque acolchado se vería muy parecido, excepto que tendría 448 ceros adicionales del segundo paso. , y otros 64 ceros del paso final.
Entradas mayores que 448 bits (para SHA-224 y SHA-256) y 896 bits (para SHA-384, SHA-512, SHA-512/224 y SHA-512/256)
A menudo necesitamos codificar entradas de mensajes que son mayores que los tamaños de bloque de 512 bits o 1024 bits, lo que significa que debemos dividir los datos en varios bloques. El punto de corte para dividir bloques es en realidad 447 bits u 895 bits, porque se debe incluir al menos un bit de relleno, más la longitud del mensaje de 64 o 128 bits.
Esto significa queSi tiene exactamente 448 bits (u 896 bits) de datos que necesita hash, deberá dividirlos en dos bloques.. El primer bloque incluirá la totalidad de los datos, más 64 (o 128) bits de relleno (el seguido de 63 o 127 ceros). El segundo bloque tendrá otros 448 (u 896) ceros, con la longitud del mensaje de 64 bits (o 128 bits) etiquetada al final de la misma manera que mostramos en la sección anterior.
449 bits (u 897 bits) de datos también ocuparían dos bloques de datos y, en su lugar, tendrían un uno más 62 (o 126) ceros de relleno antes de la longitud del mensaje.
Por otro lado,447 bits (u 895 bits) de datos podrían caber en un solo bloque. Incluiría los 447 (u 895) bits, luego el relleno de un solo uno , seguido de la longitud del mensaje de 64 o 128 bits.
El sistema funciona igual para entradas de datos más grandes. Los datos se dividen en tantos bloques como sea necesario para que se incluyan todos los datos., más al menos un dígito de relleno y con la longitud del mensaje de 64 bits agregada al final del bloque final. En el caso de 5000 bits de datos de entrada y los tamaños de bloque de 512 bits de SHA-224 o SHA-256, la entrada se dividiría en 10 bloques. Los primeros nueve solo incluirían los datos de entrada, mientras que el décimo incluiría los últimos 392 bits de datos de entrada, un uno , 55 ceros y luego la longitud del mensaje de 64 bits al final. Esto suma un total de 5120 bits de datos, que es 10 multiplicado por 512.
En el caso de SHA-384, SHA-512, SHA-512/224 o SHA-512/256, esos mismos 5000 bits de datos se dividirían en seis bloques de 1024 bits. Los primeros cuatro solo incluirían los datos de entrada. El quinto bloque incluiría los últimos 904 bits de datos, un uno y luego 119 ceros como relleno. Los 5.000 bits de datos no caben dentro de cinco bloques porque los 904 bits de datos finales exceden el límite para el último bloque, que es de 896 bits. El sexto bloque incluiría 896 ceros y luego la longitud del mensaje de 128 bits al final.
El algoritmo principal SHA-2
A continuación tenemos una representación gráfica del algoritmo SHA-2:
El algoritmo SHA-2
A menos que hayas tratado con algoritmos similares antes, probablemente no tenga mucho sentido. No te preocupes, porque vamos a dedicar mucho tiempo a explicarlo detalladamente.
Lo primero que vale la pena señalar es que el diagrama muestra Ronda 0, Ronda T y Ronda 63. La Ronda 0 es la primera ronda, mientras que la Ronda T es esencialmente un marcador de posición que representa cualquier ronda intermedia, porque sería difícil de manejar dibujar docenas de rondas. La ronda 63 es la ronda final, lo que nos da un total de 64 rondas si comenzamos desde 0.Tenga en cuenta que SHA-384, SHA-512, SHA-512/224 y SHA-512/256 implican 80 rondas en lugar de 64, por lo que el proceso que vamos a describir es algo diferente en estas versiones del algoritmo SHA-2.
Cada una de estas rondas presenta sus propias entradas y cálculos, y los resultados de algunos cálculos se convierten en entradas para los siguientes. Como probablemente esté empezando a darse cuenta, el algoritmo SHA-2 es complicado e implica una gran cantidad de pasos y cálculos.
La entrada del mensaje M
Mantendremos las cosas simples en este ejemplo usando solo nuestro único bloque de entrada de 512 bits, en lugar de una entrada más larga y complicada que requiere una serie de bloques. Si tuviéramos que describir el proceso para entradas de datos más largas, necesitaríamos repetir por completo gran parte del proceso largo y complicado que estamos a punto de diseñar, con cada uno de los diferentes bloques de datos de entrada.
Si miras la parte superior izquierda del diagrama de arriba, verásLa entrada del mensaje (M). Este es el bloque acolchado de 512 bits de nuestro mensaje 'el hash es complicado':
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 01101101 01110000 01101100 01101001 01100011 01100001 01110100 01100101 01100100 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10110000
Nuestra entrada de mensajes se divide primero en dieciséis palabras de 32 bits etiquetadas como W0es w.quince:
- En0– 01101000 01100001 01110011 01101000
- En1– 0110100 01101110 01100111 00100000
- Endos– 01101001 01110011 00100000 01100011
- En3– 01101111 01101101 01110000 01101100
- En4– 01101001 01100011 01100001 01110100
- En5– 01100101 01100100 10000000 00000000
- En6– 00000000 00000000 00000000 00000000
- En7– 00000000 00000000 00000000 00000000
- En8– 00000000 00000000 00000000 00000000
- En9– 00000000 00000000 00000000 00000000
- En10– 00000000 00000000 00000000 00000000
- Enonce– 00000000 00000000 00000000 00000000
- En12– 00000000 00000000 00000000 00000000
- En13– 00000000 00000000 00000000 00000000
- En14– 00000000 00000000 00000000 00000000
- Enquince– 00000000 00000000 00000000 10110000
Convertir a hexadecimal
Antes de continuar, convertiremos los dígitos binarios anteriores a otro sistema de numeración llamado hexadecimal. Si has estado prestando mucha atención, habrás notado que nuestro hash incluye un montón de letras:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Esto se debe a que los hashes generalmente se escriben en hexadecimal, que es simplemente una forma diferente de contar, de la misma manera que el sistema binario y el decimal al que todos estamos acostumbrados son diferentes.
El binario es un sistema de base 2, lo que básicamente significa que tienes dos opciones, un 1 y un 0, antes de tener que empezar a representar información con una mayor cantidad de dígitos.
Nuestro sistema decimal habitual es base 10, lo que significa que tenemos 10 opciones, 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9, antes de que se nos acaben y tengamos que empezar a combinar números para representar números más grandes. cantidades de datos, como cuando combinamos un 1 y un 0 para formar 10.
El hexadecimal es un sistema de base 16, lo que significa que tenemos 16 opciones:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
Cuando usamos base 16, el valor de 10 no es el mismo valor cómodo con el que crecimos. En cambio, un 10 en base 16 es en realidad el número 16 al que estamos acostumbrados en decimal. En base 10, nuestro familiar número decimal 10 se representa con unaa, 11 esb, 12 esC,13 esd, 14 esyy 15 esF.
Profundizar demasiado en hexadecimal distraerá la atención del tema principal en cuestión, pero puede encontrar más información. aquí .
Todo lo que necesita saber es que estamos cambiando nuestra entrada de binario a hexadecimal, y lo haremos ingresando nuestros valores binarios en un convertidor sencillo en línea (Si está intentando esto usted mismo y copiando los números binarios de arriba, elimine los espacios). Debería darte:
- En0– 68617368
- En1– 346E6720
- Endos– 69732063
- En3-6F6D706C
- En4– 69636174
- En5– 65648000
- En6– 00000000
- En7– 00000000
- En8– 00000000
- En9– 00000000
- En10– 00000000
- Enonce– 00000000
- En12– 00000000
- En13– 00000000
- En14– 00000000
- Enquince– 000000B0
Programación de mensajes: encontrar los otros valores de W
El algoritmo SHA-2
Si examinas el diagrama detenidamente, notarás que una de las entradas para la Ronda 63 es W63. solo tenemos w0es w.quinceHasta ahora, esto implica que necesitamos otros 48 valores antes de tener todas nuestras entradas W. En las versiones SHA-384, SHA-512, SHA-512/224 y SHA-512/256 del algoritmo, necesitaríamos 80 valores en total, por lo que necesitaríamos derivar 64 adicionales.
Estas entradas se calculan en el cuadro marcadohorario de mensajesen el diagrama. En ambos casos, los derivamos usando la siguiente fórmula:
Ent=p1(ENt-2) + Wt-7+p0(ENt-15) + Wt-16
¿Confundido? No nos culpen a nosotros, culpen a los criptógrafos que lo diseñaron. Comencemos intentando explicar algunos de los valores de la ecuación anterior.
tes esencialmente un sustituto de cualquier ronda que estemos haciendo.Si estamos en la primera ronda, que los ingenieros gentilmente llaman Ronda 0,tes 0. Entoncessi ves w0, significa el valor de W en la Ronda 0. Usamos esta notación porque usaremos una gran cantidad de valores diferentes para W en varias etapas del algoritmo. Muchas de las otras variables también utilizan valores cambiantes a lo largo de las etapas del algoritmo.
El siguiente valor que probablemente le confunda es:
pag1(X)
El símbolo se conoce comosigma, y junto al número 1 representa la siguiente función:
pag1(x) = ROTR17(X) ⊕ R.O.T.R.19(X) ⊕ SHR10(X)
Antes de que podamos comprender completamente cómo funciona la programación de mensajes, necesitaremos explicar esta función.
Operaciones de turno
El ROTR de la ecuación anterior indica que necesitamos realizar unadesplazamiento circular a la derechasobre el valor que le sigue, x. Se desplaza según el número de bits que se muestra en superíndice. Tomemos el primer segmento:
R.O.T.R.17(X)
Lo anterior en realidad solo dice cambiar el valorX 17 bitshaciabien. Para darle un ejemplo de cómo funciona esto, si el valor de x es 1000 1001 y queremos realizar un desplazamiento circular a la derecha de solo1 poco, básicamente tomaríamos el valor en la columna de la derecha:
1000 1001
Y muévelo hacia la izquierda:
1100 0100
Para demostrar el concepto nuevamente, esta vez con un desplazamiento circular hacia la derecha de 3 bits, tomamos el mismo número:
1000 1001
Esta vez, tomamos cada uno de los tres dígitos de la derecha y los movemos hacia la izquierda:
0011 0001
Este tipo de operación está involucrada tanto en la primera sección de la ecuación, como en la del medio, con cambios de17y19bits respectivamente.
La última parte de la ecuación dice:
SHR10(X)
El SHR nos indica que realicemos una operación similar, aunque ligeramente diferente, conocida comodesplazamiento lógico a la izquierda. En este caso, desplazamos a la izquierda el valor x por el número de bits en superíndice,10y luego rellene el lado derecho con ceros. Tomemos el mismo número que antes para demostrar cómo funciona:
1000 1001
Realizaremos un desplazamiento de 10 bits hacia la izquierda en 10 pasos, con el último dígito en negrita únicamente para ayudarle a realizar un seguimiento de su progreso:
0001 0010
0010 0100
01001000
10010000
0010 0000
0100 0000
1000 0000
0000 0000
0000 0000
0000 0000
Durante los primeros siete movimientos, vimos que los datos se movían lentamente hacia la izquierda y eran reemplazados por ceros a la derecha. Para el octavo movimiento, todos los datos originales habían desaparecido por completo y habían sido reemplazados por ceros.
Tenga en cuenta la diferencia entre estedesplazamiento lógico a la izquierdafuncionamiento y lo comentado anteriormentedesplazamiento circular a la derecha. No solo el movimiento ocurre en diferentes direcciones, sino que el desplazamiento circular a la derecha recicla los datos al otro lado, mientras que el desplazamiento lógico a la izquierda los descarta y llena el espacio que se abre con ceros.
Hablar de estos cambios con demasiado detalle nos llevará por la tangente, pero puedes encontrar más información sobre cómo funcionan en este momento. recurso .
operaciones XOR
La parte final de nuestra operación que debemos explicar es la⊕ símbolo, que vincula cada uno de estos componentes. ⊕ significa operación XOR, que es una operación lógica que básicamente significasu salida es verdadera si cualquiera de las entradas es verdadera, pero es falsa si ambas entradas o ninguna de ellas es verdadera.
Es difícil explicar esto sin profundizar en una conferencia completa sobre álgebra booleana y operaciones lógicas. Este enlace le ofrece un pequeño resumen, pero no es necesario comprenderlo en profundidad para obtener una descripción general decente de cómo funciona el resto del algoritmo. Todo lo que tienes que saber es que básicamente sumaremos algunos números, pero usando algunas matemáticas extrañas que probablemente no aprendiste en la escuela.
Resolviendo la primera parte de nuestra ecuación
Ahora que hemos cubierto algunos de los detalles de las operaciones, echemos otro vistazo a la ecuación en la que nos quedamos perplejos:
Ent=p1(ENt-2) + Wt-7+p0(ENt-15) + Wt-16
Dónde:
pag1(x) = ROTR17(X) ⊕ R.O.T.R.19(X) ⊕ SHR10(X)
Y:
pag0(x) = ROTR7(X) ⊕ R.O.T.R.18(X) ⊕ SHR3(X)
Ahora, intentemos calcular el valor de W.16, porque es el primer número que debemos calcular usando esta ecuación. Introduzcamos nuestro valor:
En16=p1(EN16-2) + W16-7+p0(EN16-15) + W16-16
Por lo tanto:
En16=p1(EN14) + W9+p0(EN1) + W0
Conocemos todos los valores W en el lado derecho de la ecuación porque son las palabras W que descubrimos al dividir nuestro bloque de mensajes acolchado. Los valores tanto en binario como en hexadecimal son:
- En0–68617368o01101000 01100001 01110011 01101000
- En1–346E6720o0110100 01101110 01100111 00100000
- En9–00000000o00000000 00000000 00000000 00000000
- En14–00000000o00000000 00000000 00000000 00000000
Antes de ingresar todos los números, averigüemos cuál es el valorpag1(EN14), usando la ecuación que discutimos anteriormente:
pag1(EN14) = ROTR17(EN14) ⊕ R.O.T.R.19(EN14) ⊕ SHR10(EN14)
con la w14valores en hexadecimal, la ecuación se ve así:
pag1(00000000) = ROTR17(00000000) ⊕ R.O.T.R.19(00000000) ⊕ SHR10(00000000)
El primer paso es hacer los cambios que describimos anteriormente para cada sección de la ecuación. Cambiaremos al valor binario para W.14en lugar del hexadecimal, porque facilita ver los turnos que estaremos realizando. Tenga en cuenta que las versiones binaria y hexadecimal son simplemente representaciones diferentes del mismo valor, por lo que cambiarlas cuando sea conveniente no causa ningún problema:
R.O.T.R.17(00000000 00000000 00000000 00000000)
El resultado de la operación anterior será extremadamente predecible porque es todo ceros, pero la repasaremos de todos modos, sólo para darle una idea de lo que está pasando. Dirígete a lo siguiente herramienta en línea e ingrese el valor binario para W14, los 32 ceros, en el campo de entrada marcadoValor. Asegúrate de eliminar los espacios. Ingresar32enTamaño, porque el valor de entrada tiene una longitud de 32 bits. Tipo17en elCambio, para asegurarse de que cambia el valor 17 espacios. Asegúrese de que la dirección esté establecida enBien. Selecciona elCambio circularcuadro y luego haga clicRealizar operación de cambio de bits. Esto realiza el desplazamiento circular a la derecha.
Como era de esperar, esto le dará un valor de:
00000000 00000000 00000000 00000000
Parece que no pasó nada, pero los ceros se movieron. Simplemente no podemos decirlo y parece no tener sentido, porque todos son ceros.
Ahora es el momento de realizar la sección intermedia de la operación:
R.O.T.R.19(00000000 00000000 00000000 00000000)
En este caso todo es igual, excepto elCambioel valor es ahora19. Esto nos da una salida de:
00000000 00000000 00000000 00000000
Ahora para la parte final:
SHR10(00000000 00000000 00000000 00000000)
Recuerde, el SHR representa undesplazamiento lógico a la izquierda, así que esta vez necesitamos modificar la configuración. ElValoryTamañosiguen siendo los mismos, pero debemos asegurarnos de que:
Cambiose establece en10
Direcciónse establece enIzquierda
cambio lógicoestá seleccionado.
Nuevamente, obtenemos el mismo resultado de:
00000000 00000000 00000000 00000000
Si bien esto puede haber parecido un esfuerzo inútil, fue solo porque nuestro número inicial era todo ceros. Cuando realiza estas operaciones con otros números, realmente se producirán cambios.
Las cadenas binarias y hexadecimales de cero son iguales, por lo que cambiaremos estos valores nuevamente a hexadecimal cuando avancemos a la siguiente parte de nuestro cálculo, para que encaje mejor en la página:
pag1(EN14) = 00000000 ⊕ 00000000 ⊕ 00000000
Podemos resolver esta ecuación en este calculadora online por entrar:
00000000encampo a.
SeleccionandoGRATISen el menú desplegable debajo de él.
00000000encampo B.
SeleccionandoGRATISen el menú desplegable debajo de él.
00000000encampo c.
Si lo has hecho bien, debería mostrarse.A XOR B XOR Cen la casilla marcadaexpresión lógica. Te dará la respuesta en el cuadro marcadoResultado de la operación. En este caso, es:
0o00000000o00000000 00000000 00000000 00000000.
Es una respuesta aburrida, pero nos acerca un paso más a resolver nuestra ecuación, porque ahora sabemos que:
pag1(EN14) = 00000000
Si retrocede, verá que solo necesitamos encontrar un componente más y luego podremos resolver la ecuación. Necesitamos encontrar el valor de σ0(EN1), que utiliza la siguiente ecuación:
pag0(x) = ROTR7(X) ⊕ R.O.T.R.18(X) ⊕ SHR3(X)
Como dijimos anteriormente, sabemos que W1es :
346E6720
Por lo tanto:
pag0(346E6720) = ROTR7(346E6720) ⊕ R.O.T.R.18(346E6720) ⊕ SHR3(346E6720)
Esta ecuación es casi exactamente la misma que acabamos de resolver. En aras de la brevedad, no entraremos en ello, pero si desea intentarlo usted mismo, simplemente siga cada uno de los pasos que seguimos anteriormente, pero cambie elCambiocada vez a7,18y3, respectivamente.
pag0(346E6720) =4068DCCE ⊕ 99C80D1B ⊕A3733901
Una vez que lo hayas resuelto, encontrarás que la respuesta es:
pag0(346E6720) =7AD3E8D4
Adición modular
Ahora que conocemos los valores de ambospag1(EN14)ypag0(EN1), finalmente estamos listos para calcular el valor de W16:
En16=p1(EN14) + W9+p0(EN1) + W0
En16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
La ecuación anterior parece relativamente sencilla. Lo único que debemos tener en cuenta es que los signos más representan una suma modular, en lugar de una suma normal.
Para demostrar el concepto con un número decimal de 8 dígitos, si usáramos la suma modular para sumar 1 a 99.999.999, la respuesta no es 100.000.000 como cabría esperar. En cambio, simplemente regresa al inicio de la misma manera que 1 sigue a 12 en un reloj. La respuesta es 0 o 00.000.000. Verificar esta cartilla si necesita una breve introducción a la aritmética modular.
En esencia, la suma modular le permite sumar números sin que su respuesta se alargue. Tome lo siguiente como otro ejemplo decimal:
76,487,639 + 98,094,034
Bajo suma normal, la respuesta sería:
76,487,639 + 98,094,034 =174,581,673
Con la adición modular, simplemente podemos desechar el1, y nuestra respuesta es:
76,487,639 + 98,094,034 =74,581,673
Podemos hacer los mismos cálculos con los números hexadecimales en nuestra ecuación:
En16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
Lo resolveremos usando esto. calculadora online . En nuestro ejemplo, no necesitamos molestarnos en sumar los ceros porque no cambiarán el valor, y simplemente podemos sumar7AD3E8D4y68617368. Si necesita utilizar la misma herramienta para sumar más números en el futuro, simplemente puede realizar la operación varias veces, sumando el siguiente número al resultado de la ecuación anterior.
Podemos resolver nuestra ecuación escribiendo7AD3E8D4en el primer cuadro de la calculadora en línea y68617368en el segundo. Esto nos da un resultado de:
En16= e3355c3c
Recuerde, se supone que esto es una suma modular, por lo que si el resultado hubiera excedido los ocho dígitos, necesitaríamos eliminar el dígito más a la izquierda. Nuestro resultado tiene solo 8 dígitos, por lo que no tenemos que preocuparnos en este caso.
Ha sido un proceso largo y complicado, pero finalmente tenemos la respuesta para W.16. Ese3355c3c. Es necesario realizar el mismo conjunto de cálculos para todos los valores de W, desde W17es w.63.
Hemos demostrado cómo funcionan estos cálculos, por lo que es hora de pasar a los otros aspectos del algoritmo SHA-2.
Las variables de inicialización
Ahora que hemos analizado de dónde provienen todas las entradas W, volvamos a nuestro diagrama:
El algoritmo SHA-2
En la parte superior notarás que dice H.yo-1. Esto representa las variables de trabajo, que actúan como insumos en cada ronda. Hay ocho de estas variables y se actualizan al final de cada ronda. Para empezar, las variables de inicialización, H(0)son:
- h(0)a= 6a09e667
- h(0)b=bb67ae85
- h(0)c= 3c6ef372
- h(0)d= a54ff53a
- h(0) y= 510e527f
- h(0)f= 9b05688c
- h(0) gramos= 1f83d9ab
- h(0)horas= 5be0cd19
Los números anteriores se derivan de las raíces cuadradas de los primeros ocho números primos, pero de dónde provienen realmente no importa para nuestros propósitos. Todo lo que tienes que saber es que debemos comenzar con los números específicos enumerados anteriormente.
En rondas posteriores, estos valores serán diferentes. Para simplificar y representar sus valores cambiantes, el diagrama muestra estas entradas comoa, b, c, d, e, f, g y h, en lugar deh(0)a, h(0)b, etc., o H(1)un, h(1)b, etc..
La constante, K
En cada ronda, tomamos las variables de trabajo y las combinamos con el valor W apropiado para la ronda que describimos en la sección anterior. Si miras hacia el lado derecho de las rondas en el diagrama, verás otra entrada,k. Hay 64 valores separados de 32 bits para K, uno para cada una de las 64 rondas. Se derivan de las raíces cúbicas de los primeros 64 números primos. En hexadecimal, estas constantes de ocho caracteres para cada ronda son las siguientes, leídas de izquierda a derecha antes de descender a la siguiente fila:
|_+_|Tenga en cuenta que los valores de K tienen 64 bits de longitud en SHA-384, SHA-512, SHA-512/224 y SHA-512/256. También hay 80 de estos valores, en lugar de 64. Puede consultarlos en FIPS 180-4 si es necesario.
La operación Maj
Finalmente, tenemos todos nuestros aportes. Ahora es el momento de descubrir cómo los utiliza cada ronda de SHA-2. El siguiente diagrama ofrece un buen resumen de cómo SHA-2 utiliza todas estas entradas:
Los cálculos SHA-2 se realizan en una sola ronda.
Si miras hacia arriba, tenemos las variables de trabajo,h(I a, h(i)b, h(yo)c, h(identificación, h(es decir, h(si, h(yo Gy H(yo)h. Estas son las mismas que las variables de trabajo.a, b, c, d, e, f, g y hen el diagrama para todo el algoritmo SHA-2. En la primera ronda, serán las respectivas variables de inicialización que enumeramos en la sección anterior. Si miras H.(I a, h(i)b, h(yo)c, en la parte superior izquierda, verá que las tres entradas tienen flechas que apuntan a un cuadro,Comandante. Esto representa la siguiente ecuación:
Mayor (a,b,c) = (a Y b) ⊕ (a Y c) ⊕ (b y c)
Para facilitar la lectura de la ecuación, hemos eliminado la H(i)de cada variable y simplemente las dejé comoa,b, yC. Siempre y cuando recuerdes que los valores dea,byCCambie con cada ronda, esto debería hacer que sea más fácil de seguir.
Ya nos hemos ocupado del ⊕ símbolo, peroYen este contexto es nuevo para nosotros. Esta es otra operación del álgebra booleana. Se refiere a una conjunción lógica, que básicamente significa que la salida es verdadera sólo si ambas entradas son verdaderas. Puede Aprende más aquí , pero avanzaremos y simplemente usaremos un calculadora online para realizar esta operación.
Primero, agreguemos las variables de inicialización que enumeramos en elLas variables de inicializaciónsección:
Mayor (6a09e667, bb67ae85, 3c6ef372) = (6a09e667 Y bb67ae85) ⊕ (6a09e667 Y 3c6ef372) ⊕ (bb67ae85 Y 3c6ef372)
La calculadora que estamos utilizando es bastante limitada, por lo que tendremos que realizar el cálculo en varias etapas.
Ingresar6a09e667en entradaA.
SeleccionarYde la lista desplegable a continuación.
Ingresarbb67ae85en entradaB.
Esto te da un resultado de:
2A01A605
Próximo:
Ingresar6a09e667en entradaA.
SeleccionarYde la lista desplegable a continuación.
Ingresar3c6ef372en entradaB.
Esto te da un resultado de:
2808E262
Entonces:
Ingresarbb67ae85en entradaA.
SeleccionarYde la lista desplegable a continuación.
Ingresar3c6ef372en entradaB.
Esto te da un resultado de:
3866A200
Pongamos todas estas respuestas en la ecuación:
Mayor (6a09e667, bb67ae85, 3c6ef372) = 2A01A605 2808E262 3866A200
Ahora sólo nos queda cambiar las entradas en nuestra calculadora online una vez más:
Ingresar2A01A605en entradaA.
SeleccionarGRATISde la lista desplegable a continuación.
Ingresar2808E262en entradaB.
SeleccionarGRATISde la lista desplegable a continuación.
Ingresar3866A200en entradaC.
Esto nos da:
Mayor(a,b,c)=3A6FE667
El ∑0operación
Ahora que tenemos la respuesta paraMayor(a,b,c)Volvamos al diagrama y veamos qué sigue:
Los cálculos SHA-2 se realizan en una sola ronda.
Verás que la flecha deh(I atambién apunta a la∑ símbolo. Esto indica que necesitamos tomar la H(I aingrese y póngalo a través del siguiente cálculo:
∑0(a) = ROTRdos(a) ⊕ R.O.T.R.13(a) ⊕ R.O.T.R.22(a)
Una vez más, hemos dejado de lado la H(i)para mayor claridad. Ya nos hemos ocupado de estosdesplazamientos circulares a la derecha, así como eloperaciones XOR. Esta vez, necesitamos realizar desplazamientos circulares a la derecha de 2, 13 y 22 bits, respectivamente. Volvamos a nuestra calculadora , con nuestro valor pora,6a09e667.
Para la primera sección de este cálculo, ingrese:
6a09e667enValorAsegurarhexadecimalse selecciona en el menú desplegable a la derecha.
32 enTamaño.
2 enCambio.
CerciorarseBienes seleccionado para elDirección.
Haga clic en elCambio circularcaja.
Haga clic en elRealizar operación de cambio de bitsbotón.
Esto le dará un resultado de:
DA827999
Si desea obtener más información sobre cómo se logró este resultado, la calculadora muestra los pasos necesarios para resolver la operación. También puedes consultar elOperaciones de turnosección para más detalles.
Para los dos valores restantes que necesitamos descubrir, solo necesitamos cambiar el valor en elCambiocampo y luego haga clic en elRealizar operación de cambio de bitsbotón nuevamente.
Cambiándolo a13nos da una respuesta de:
333B504F
Cambiándolo a22nos da una respuesta de:
27999DA8
Ahora tenemos todos los valores que necesitamos para terminar la ecuación:
∑0(6a09e667) =DA827999⊕333B504F⊕27999DA8
Volvamos a la calculadora Hemos estado usando para las operaciones XOR y:
IngresarDA827999en entradaA.
SeleccionarGRATISde la lista desplegable a continuación.
Ingresar333B504Fen entradaB.
SeleccionarGRATISde la lista desplegable a continuación.
Ingresar27999DA8en entradaC.
Esto nos da un resultado de:
∑0(6a09e667) = CE20B47E
Suma modular de los resultados.
Si seguimos las flechas de laComandantecaja y el∑cuadro, vemos que las salidas se envían luego como entradas a un cuadro con un+símbolo en él. Esto representaadición modular, que como ya describimos, es muy parecido a la suma normal, excepto que los números simplemente regresan al principio en un punto determinado, en lugar de continuar creciendo. Si desea un repaso con más detalles, consulte la sección anterior sobre adición de módulos.
El diagrama se puede representar mediante la siguiente fórmula:
Maj(a,b,c) + ∑0(un) =3A6FE667+CE20B47E
Estaremos usando el misma calculadora de nuevo.
Ingresar3A6FE667en el primer campo yCE20B47Een el segundo, luego haga clicCalcular. Esto debería darle una respuesta de:
108909ae5
Si prestas mucha atención, podrás notar que la respuesta anterior tiene nueve dígitos, mientras que cada una de las anteriores solo tiene ocho. Si recuerdas cuando introdujimos el concepto de suma modular, mencionamos que es como una suma normal, pero simplemente regresa al principio cuando los números pasan de cierto punto.
Bueno, la calculadora que hemos estado usando no es específicamente para la suma modular; simplemente realiza la suma normal que aprendiste en la escuela primaria (pero con números hexadecimales). Esto significa que no transferirá los números una vez que alcance el límite. Hasta este punto, hemos tenido suerte de que ninguno de nuestros cálculos anteriores condujera a un número de nueve dígitos.
Esta vez hemos acabado con nueve dígitos, cuando en realidad necesitamos que sólo sean ocho. La buena noticia es que es fácil solucionar nuestro problema. Todo lo que tenemos que hacer es eliminar el dígito más a la izquierda, el1. Por lo tanto, nuestra respuesta no es realmente108909ae5. En cambio, es:
08909ae5
Si regresas al diagrama y trazas la línea que sale de este+box como salida, verás que se conecta con otra línea que incluye entradas que aún no hemos tratado.Tendremos que hacer algunos otros cálculos antes de poder volver a este punto..
La función condicional
Esta vez, veamos H(es decir, h(si, h(yo Gen el diagrama. Todos apuntan al cuadro etiquetadoCh, lo que indica que estos valores actúan como entradas en la siguiente función:
Ch(e, f, g) = (e Y f) ⊕ (NO e Y g)
Ya hemos tratado cada una de estas operaciones exceptoNO. Esto representa negación , que también se conoce como complemento lógico. No entraremos en detalles sobre cómo funciona para evitar que nos vayamos por la tangente, pero puedes consultar el enlace o confiar en la calculadora en línea.
Una vez más, hemos eliminado la H(i)de e, f y g, simplemente para que sea más fácil de leer. Todavía estamos trabajando en la Ronda 0, por lo que estos valores serán las variables de inicialización que enumeramos anteriormente:
h(0) y–510e527f
h(0)f–9b05688c
h(0) gramos–1f83d9ab
Tenga en cuenta que en rondas futuras las variables para e, f y g serán diferentes. Por ahora, pongamos estas variables de inicialización en nuestra ecuación:
Ch (510e527f, 9b05688c, 1f83d9ab) = (510e527f Y 9b05688c) ⊕ (NO 510e527f Y 1f83d9ab)
Tendremos que dividir esta ecuación en partes para completarla con nuestra calculadora . Para la primera mitad:
Ingresar510e527fen entradaA.
SeleccionarYde la lista desplegable a continuación.
Ingresar9b05688cen entradaB.
Esto debería darle una respuesta de:
1104400C
Para la segunda mitad de la ecuación:
Selecciona elNobotón a la izquierda de la entradaA.
Ingrese 510e527f en la entradaA.
SeleccionarYde la lista desplegable a continuación.
Ingrese 1f83d9ab en la entradaB.
Esto debería darte un resultado de:
E818980
Volvamos a insertar estas respuestas en la ecuación:
Ch(510e527f, 9b05688c, 1f83d9ab) = (1104400C) ⊕ (E818980)
Termina de resolverlo así:
Asegurándose de queNOya no está seleccionado.
Ingresar1104400Cen entradaA.
SeleccionarGRATISde la lista desplegable a continuación.
IngresarE818980en entradaB.
Esto debería darle una respuesta de:
Ch(e, f, g) = 1F85C98C
∑1: Desplazamiento circular a la derecha
Los cálculos SHA-2 se realizan en una sola ronda.
Si regresa al diagrama, verá que H(es decir, no es sólo una entrada alChecuación que acabamos de realizar.También se convierte en una entrada en otro cuadro marcado con un ∑. Este cuadro significa el siguiente cálculo:
∑1(e) = ROTR6(y) ⊕ R.O.T.R.once(y) ⊕ R.O.T.R.25(y)
Tenga en cuenta que esto∑1(y)La función es casi la misma que la∑0(a)función que realizamos en elEl ∑0operaciónsección. Sin embargo, los dos tienen valores diferentes para los desplazamientos circulares a la derecha.
Hemos omitido la H(i)partes de la ecuación una vez más por razones de simplicidad. Conectemos elh(0) yvalor para elyvalores, porque todavía estamos trabajando enRonda 0. Como comentamos en elLas variables de inicializaciónsección, el valor deh(0) yes510e527f. Por lo tanto:
∑1(510e527f) = ROTR6(510e527f) ⊕ R.O.T.R.once(510e527f) ⊕ R.O.T.R.25(510e527f)
Hemos explicado cómo funcionan estos desplazamientos circulares hacia la derecha varias veces, así que vayamos a nuestro calculadora online e ingresa:
510e527f enValorAsegurarhexadecimalse selecciona en el menú desplegable a la derecha.
32 enTamaño.
6 enCambio.
CerciorarseBienes seleccionado para elDirección.
Haga clic en elCambio circularcaja.
Haga clic en elRealizar operación de cambio de bitsbotón.
Esto debería darnos una respuesta de:
FD443949
Mantenga todos los detalles iguales, excepto cambiar elCambiovalor aoncey haga clic en elRealizar operación de cambio de bitsbotón una vez más. Esto debería darle una respuesta de:
4FEA21CA
Repita el proceso, esta vez simplemente cambiando elCambiovalor a 25. Nuestra respuesta debería ser:
87293FA8
Ahora tenemos cada uno de los resultados que necesitamos para resolver la ecuación. Pongamos cada uno de los valores que acabamos de descubrir en la fórmula:
∑1(510e527f) = FD443949⊕ 4FEA21CA⊕ 87293FA8
Ahora, resolvámoslo volviendo a nuestra calculadora para Operaciones XOR:
Ingresar FD443949 en entradaA.
SeleccionarGRATISde la lista desplegable a continuación.
Ingresar 4FEA21CA en entradaB.
SeleccionarGRATISde la lista desplegable a continuación.
Ingresar87293FA8en entradaC.
Esto nos da un resultado de:
∑1(510e527f) = 3587272B
Adición modular
Volvamos al diagrama para ver hacia dónde dirigirnos a continuación:
Los cálculos SHA-2 se realizan en una sola ronda.
Si nos fijamos en la parte superior derecha, veremos que la variable de trabajo H(yo)htiene una flecha que conduce a un cuadro con unSigno de másen eso. La salida de laChLa operación que ya completamos conduce al mismo cuadro, lo que significa que debemos realizar una suma modular con estos dos valores. Todavía estamos en la mitad de la Ronda 0, por lo que necesitamos usar la variable de inicialización, H(0)horas, como nuestro valor parah. Como comentamos en elLa variable de inicializaciónsección.
h(0)horas= 5be0cd19
La respuesta a la operación Ch fue:
Ch(e, f, g) = 1F85C98C
Por lo tanto necesitamos encontrar la solución a:
5be0cd19+1F85C98C
Vayamos a nuestro calculadora online para suma hexadecimal.
Ingresar5be0cd19en el primer campo, y1F85C98Cen el segundo campo, luego haga clic en calcular. Esto nos da un resultado de:
7b6696a5
Adición más modular
Si traza la flecha que apunta hacia afuera de este cuadro con el+símbolo, verá que se convierte en una entrada a otro cuadro similar, lo que indica una adición más modular. Esta vez, la otra entrada es el resultado que obtuvimos al realizar los movimientos circulares correctos en ∑1(e) en el último∑1: Desplazamiento circular a la derechasección. La respuesta fue:
∑1(510e527f) = 3587272B
Entonces tomemos el resultado de la última sección y sumémoslo al resultado de∑1(y). La ecuación es:
7b6696a5+3587272B
Ve a la calculadora online que acabamos de usar en la sección anterior, e ingresamos7b6696a5en el primer campo, y3587272Ben el segundo campo, luego haga clic en calcular. Esto nos da un resultado de:
b0edbdd0
Agregando el valor W... con una adición aún más modular
Si vuelves a consultar el diagrama, verás que la salida de la operación anterior pasa a otra de lascajas modulares adicionalesindicado por el+firmar. Esta vez, se agrega a uno de los valores W, que son partes de nuestro mensaje acolchado, 'el hash es complicado' (en el caso de los valores W16-EN63, se derivan del mensaje rellenado, en lugar de ser partes del mismo).
todavía estamos enRonda 0, entonces necesitamos usarEn0, que, como comentamos en elConvertir a hexadecimalsección hacia el inicio, es:
En0– 68617368
Si sumamos esto a una ecuación de suma modular junto con la solución de nuestra última sección, obtenemos:
68617368+b0edbdd0
volver a lo mismo calculadora online para sumar números hexadecimales e ingresar68617368en el primer campo,entonces b0edbdd0en el segundo. Hacer clicCalcular, que te dará una respuesta de:
1194f3138
Como señalamos en elSuma modular de los resultados.sección, siempre que uno de nuestros resultados alcance nueve dígitos de longitud en lugar de ocho, debemos revertirlo simplemente eliminando el dígito más a la izquierda, el1. Por lo tanto, el resultado que necesitamos no es en realidad1194f3138. En cambio, es:
194f3138
Añadiendo la constante K... mediante la siempre fiable adición modular
Con la respuesta anterior en la mano, la salida del cuadro apunta a otro que tiene el+ símbolo, indicando una vez más la adición modular. Esta vez, la otra flecha que apunta hacia él dice K.i, lo que significa que ahora es el momento de sumar la constante, K. Enumeramos cada uno de los 64 valores de K enLa constante, Ksección. El valor que necesitamos para la primera ronda, K0es:
428a2f98
Entonces nuestra operación de suma modular debe incluir este valor, más el resultado de la ronda anterior:
428a2f98+194f3138
Ahora debemos regresar a nuestro calculadora online para la suma hexadecimal e ingrese428a2f98en el primer campo, con194f3138en el segundo. Haciendo cliccalcularnos da un resultado de:
5bd960d0
La incorporación modular nunca termina
Regrese al diagrama y siga el resultado de la operación anterior. Se encuentra con otra temida caja modular adicional, esta vez con el valor H(identificacióncomo su otra entrada. Todavía estamos en la Ronda 0, por lo que necesitamos usar la variable de inicialización H(0)d, cual es:
a54ff53a
Por lo tanto necesitamos encontrar la respuesta a:
a54ff53a+5bd960d0
Cuando ponemos estos valores en el mismo calculadora online , terminamos con:
10129560a
Una vez más, nos hemos topado con nueve dígitos, por lo que simplemente debemos eliminar el que está más a la izquierda.1, como se discutió en elSuma modular de los resultados.sección. Por tanto, nuestra respuesta es realmente:
0129560a
¿De dónde vienen las variables de trabajo?
Si sigues la línea que sale del cuadro del símbolo +, verás que termina en una fila de cuadros en la parte inferior, con este cuadro en particular marcadoh(es decir. Hemos mencionado queLa ronda 0 comienza con variables de inicialización, pero esolas siguientes rondas utilizan diferentes variables en su lugar.
Quizás te hayas preguntado de dónde vendrían estas cosas y ahora tienes al menos parte de la respuesta.Los valores en esta fila de cuadros en la parte inferior se convertirán en las variables de trabajo que se utilizarán en la siguiente ronda.
En este caso, la variable de inicializaciónh(0)dse agregó a lo que es esencialmente una mezcla de las otras variables de inicialización H(0) y, h(0)f, h(0) gramosy H(0)horas, junto con una parte de nuestro mensaje de entrada, W0,y la constante, K0. La mezcla resultante,0129560a, luego se convierte en la variable de trabajoh(1 ypara la Ronda 1.
Las otras variables de inicialización siguen procesos similares, modificándose y agregándose entre sí de maneras extrañas para convertirse en nuevas variables de trabajo en la siguiente ronda. Puedes mirar las flechas que apuntan hacia la fila inferior para ver de dónde proviene cada una de las variables de trabajo de la siguiente ronda.
Puede que esto no parezca tan significativo, pero es un componente clave de la estructura que permite que cada hash SHA-2 se vea radicalmente diferente, incluso cuando solo se cambia una letra de la entrada. Recuerde, todavía estamos solo en una parte del camino de la Ronda 0 y quedan 63 rondas más, por lo que hay muchas más oportunidades de mezclar estos valores.
Uniendo ambos lados... con una adición más modular
Recuerda volver a laSuma modular de los resultados.sección donde realizamos la suma modular en los siguientes valores:
Maj(a,b,c) + ∑0(un) =08909ae5
Después de encontrar la solución, tuvimos que hacer una pausa en ese hilo del diagrama mientras descubríamos los otros componentes. Ahora hemos hecho todo lo que teníamos que hacer y estamos listos para volver a hacerlo.
Solo para asegurarnos de que estás siguiendo bien, actualmente estamos enel cuadro + más bajo en el lado izquierdo del diagrama, que se alimenta de la ecuación analizada anteriormente. Nuestro otro insumo en esta ecuación de suma modular es la solución de laLa incorporación modular nunca terminasección, que era:
0129560a
Por lo tanto, estamos tratando de encontrar la solución a:
08909ae5+0129560a
Volvamos a nuestro calculadora online y escribe08909ae5en el primer campo, con0129560aen el segundo. cuando golpeamoscalcular, nos da:
9b9f0ef
Podemos agregar un cero al frente para mantenerlo consistente en 8 dígitos:
09b9f0ef
Esta respuesta luego se coloca en la H(I aranura en la fila inferior, lo que significa quese convertirá en la variable de trabajo H(1)unen la siguiente ronda, Ronda 1.
Ahora que tenemos esta solución, finalmente hemos terminado todos los cálculos involucrados enRonda 0.
Las otras variables de trabajo
Ya hablamos de la variable de trabajo.h(es decir, y ahora la variable de trabajoh(I a también. Ahora es el momento de cubrir de dónde provienen el resto de las variables de trabajo para que podamos usarlas en la Ronda 1 y en cada una de las rondas posteriores.
Como comentamos, en la Ronda 0, las variables de trabajo eran un conjunto de números predefinidos que denominamos variables de inicialización:
- h(0)a= 6a09e667
- h(0)b=bb67ae85
- h(0)c= 3c6ef372
- h(0)d= a54ff53a
- h(0) y= 510e527f
- h(0)f= 9b05688c
- h(0) gramos= 1f83d9ab
- h(0)horas= 5be0cd19
Ahora es el momento de descubrir cuáles serán el resto de estas variables de trabajo para el inicio de la Ronda 1. Afortunadamente, el diagrama lo hace bastante sencillo:
Los cálculos SHA-2 se realizan en una sola ronda.
Si miramos la fila inferior donde diceh(i)b, podemos rastrear la flecha hacia atrás para ver que el valor es simplementeh(I a. Comoh(0)aes6a09e667, esto significa que nuestra variable de trabajo para la Ronda 1,h(1)b, también será6a09e667.
Avanzando haciah(yo)cen la fila inferior, vemos que la flecha se origina en lah(i)bcuadro en la fila superior. Por lo tanto, elh(0)bvalor,bb67ae85, se convertirá en la variable de trabajoh(1)cen la Ronda 1.
Cuando recurrimos ah(identificaciónen la fila inferior, vemos que la flecha lo conecta conh(yo)cen la cima. Por lo tanto,h(1)des el mismo valor queh(0)c, cual es3c6ef372.
Avanzando, la flecha hacia abajoh(es decirproviene de la adición modular deh(identificacióny el resultado que obtuvimos cuando agregamos la consonante. Calculamos este valor en elLa incorporación modular nunca terminasección, por lo tanto el valor parah(1 yes0129560a.
Los valores parah(si,h(yo Gyh(yo)hson fáciles de entender. Si seguimos las flechas de estos valores en la fila inferior, vemos que las flechas se originan enh(es decir,h(siyh(yo G, respectivamente.
Por lo tanto:
h(0) y, que era 510e527f, se convierte enh(1)f.
h(0)f, que era 9b05688c, se convierte enh(1) gramos.
h(0) gramos, que era 1f83d9ab, se convierte enh(1)h.
Solo para resumir, las variables de trabajo que usaremos como algunos de nuestros insumos para la Ronda 1 son:
- h(1)un= 09b9f0ef
- h(1)b= 6a09e667
- h(1)c=bb67ae85
- h(1)d= 3c6ef372
- h(1 y= 0129560a
- h(1)f= 510e527f
- h(1) gramos= 9b05688c
- h(1)h= 1f83d9ab
Ronda 1 (y rondas posteriores)
Hemos terminado la Ronda 0 y sabemos cuáles son las variables de trabajo para la Ronda 1. Si vuelve a consultar laConvertir a hexadecimalsección, también conocemos el valor de W que necesitamos usar en la Ronda 1:
En1= 346E6720
También puede encontrar el valor de K que necesitamos en elLa constante, K, sección. Esta vez, necesitamos el valor en la segunda columna de la fila superior:
k1= 71374491
Ahora tenemos toda la información que necesitamos para comenzar la Ronda 1. Primero, volvamos al diagrama de todo el algoritmo:
El algoritmo SHA-2
Si seguimos las flechas que salen de la parte inferior deRonda 0, verás que apuntan haciaT redondo. La ronda t también tiene entradas de Wty kt.T redondoes solo un sustituto para cada una de las 62 rondas entreRonda 0yRonda 63, porque dibujar 64 rondas no habría sido práctico.
En lugar de eso, imagine que las flechas de la Ronda 0 en realidad se dirigen hacia la Ronda 1 y que las otras entradas en realidad son W.1y k1.
Ahora, volvamos al diagrama de una sola ronda de SHA-2:
Los cálculos SHA-2 se realizan en una sola ronda.
Como lo indican los dos diagramas, para completar la Ronda 1 simplemente debemos repetir cada una de las operaciones que realizamos en la Ronda 0. La única diferencia es que comenzamos con valores diferentes. En lugar de W0usamos W1. en lugar de k0usamos k1. En lugar de todos los H0variables de inicialización, utilizamos el H1variables de trabajo. Acabamos de enumerar cada uno de estos aportes que necesitamos para comenzar la Ronda 1, para que tenga toda la información que necesita para comenzar.
Tu primer paso es descubrirMayor (a,b,c). Esta vez, necesitas usar el nuevoLa ronda 1entradas de:
- h(1)un= 09b9f0ef
- h(1)b= 6a09e667
- h(1)c=bb67ae85
Describimos el proceso en elLa operación Majsección. Implicaba operaciones AND y XOR, y lo completamos mediante una serie de pasos utilizando las calculadoras en línea. Una vez que haya repetido el proceso con los nuevos valores de entrada, puede determinar qué hacer a continuación regresando al diagrama o alEl ∑0operaciónsección de nuestro artículo.
En esta sección, realizamos una serie de desplazamientos circulares a la derecha, así como operaciones XOR. Esta vez, necesitas usar el nuevoavalor, H(1)un, cual es:
09b9f0ef
El resto de las operaciones son iguales, incluida la cantidad de bits que necesita desplazar. Una vez que tenga el resultado, es hora de pasar al siguiente paso, que puede encontrar consultando el diagrama o consultando el artículo. Una vez que tenga este resultado, debe continuar avanzando, realizando cada vez las mismas operaciones, pero con los nuevos valores de entrada cuando corresponda.
Como un resumen,Para completar la Ronda 1, debes tener:
- Realizó elOperación mayor.
- Completó el∑0operación.
- Se utilizó la suma modular en estos dos resultados anteriores.
Entonces:
- Completó elfunción condicional.
- Terminado el∑1operación.
- Se realizó una suma modular sobre el resultado de la función condicional y el valor de H.(1)h
- Tomó el resultado del último paso y lo sumó al resultado del ∑1funcionamiento mediante adición modular
- Se agregó este resultado a W1mediante adición modular
- Se utilizó la suma modular para tomar el resultado del último paso y sumar K1
- Se agregó el resultado del paso anterior a H.(1)dcon adición modular
Siguiendo estos pasos, necesitas:
- Toma el resultado que obtuviste cuando sumaste K1(hace dos pasos) y agréguelo a la solución que obtuvo al usar la suma modular para combinar los resultados de laOperación mayory el∑0operación(obtuviste esta respuesta en el tercer paso, al final del primer conjunto de viñetas)
- Utilice el diagrama y nuestras descripciones en elLas otras variables de trabajosección para determinar qué valores se convertirán en H(dos)variables de trabajo que necesitará para la Ronda 2
Una vez que estés en este punto, es hora de queComienza la Ronda 2, esta vez usando la H.(dos)variables de trabajo que acabas de descubrir, junto con Wdosy kdos. La ronda 2 procede exactamente de la misma manera, excepto que utiliza estos nuevos insumos cuando corresponde.
Cuando hayas terminado la Ronda 2, tendrás las variables de trabajo que necesitas para la Ronda 3 y solo necesitarás la W.3y k3valores que enumeramos anteriormente en el artículo para completar las operaciones.
Este proceso se repite en las Rondas 4 y 5 y así sucesivamente, y los resultados se convierten en las variables de trabajo para la siguiente ronda. La única complicación llega en la Ronda 16, donde debes usar la W.16valor que ya calculamos en el primeroAdición modularsección, que estaba hacia el comienzo del artículo.
La tarea se vuelve aún más compleja para las Rondas 17 a 63, porque tendrás que calcular los valores W tú mismo, usando el método descrito enlos otros valores de Wsección y partes posteriores del artículo.
Suponiendo que sobrevivas a la terrible experiencia y logres llegar al final de la Ronda 63, te quedarán ocho H(i)valores como resultados de cada uno de los cálculos que completó a lo largo de la ronda.
El XOR final
Si regresa al diagrama general de la función SHA-2, verá el paso final:
El algoritmo SHA-2
Verá que los resultados de la Ronda 63, que son los ocho valores H finales que habría calculado en esta etapa, se dirigen a una serie de cuadros de suma modulares. Estos cuadros también tienen otras flechas de entrada que se remontan a H(yo-1). Esto significa que las otras entradas en cada una de estas operaciones de suma modular son las variables de inicialización.
Por lo tanto, debe completar los siguientes cálculos de suma modular:
- H finalavalor + H(0)a= d6320dec
- H finalbvalor + H(0)b= c80c83e4
- H finalCvalor + H(0)c=c17915ee
- H finaldvalor + H(0)d= 5de8587b
- H finalyvalor + H(0) y= b8118258
- H finalFvalor + H(0)f= 759b2453
- H finalgramovalor + H(0) gramos=fce812d4
- H finalhvalor + H(0)horas= 7d3df56a
Sólo queda una cosa por hacer: concatenar estos resultados. Esta es sólo una palabra elegante para agregar uno al final del otro en orden. Cuando hagas esto, te quedará:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
El resultado anterior es nuestro hash SHA-2 para 'el hash es complicado'.En el diagrama, esto está representado por elhien el fondo.
Entradas de mensajes más grandes
Si los datos del mensaje inicial hubieran sido mayores de 448 bits, aún no habríamos terminado. Aún necesitaríamos procesar cada uno de los bloques restantes hasta que la totalidad de los datos de entrada hayan pasado por el algoritmo SHA-2.
Si este fuera el caso, no habríamos concatenado nuestros resultados finales para formar el hash. En cambio, cada uno de estos ochohiLos valores se habrían convertido en las variables de inicialización para el siguiente bloque.
Los pasos habrían sido muy similares a los anteriores, excepto que esta vez nuestros primeros valores de 16 W habrían sido partes del segundo bloque de datos de entrada. Los siguientes 48 valores de W se habrían derivado de estos 16 valores de acuerdo con la fórmula que utilizamos en elprogramación de mensajes: encontrar los otros valores Wsección.
Si solo hay dos bloques de datos de entrada en total que deben procesarse, luego de la Ronda 63 del segundo bloque, los valores H finales se agregan a las variables de inicialización del segundo bloque de la misma manera que acabamos de demostrar para el primer bloque. . Estos resultados luego se concatenarían para formar el hash SHA-2.
Si hay más bloques, las salidas de la Ronda 63 del segundo bloque se convertirían en las variables de inicialización para el tercer bloque. Este proceso continuaría hasta que se hayan procesado todos los bloques de datos de entrada. Las ocho salidas del bloque final luego se concatenarían en el hash SHA-2, de la misma manera que calculamos el hash para un solo bloque de datos de entrada.