Español

Herramientas de desarrollo · Calculadora de hash SHA

SHA-256 Paso a paso: relleno, programación de mensajes y rondas 64

· Cómo funciona

sha-256 criptografía APIS del navegador javascript

Diagrama que muestra el relleno de mensajes, la división de bloques, el bucle de procesamiento de ronda 64 y la combinación de hash final
Ilustración de vector original de ToolAcre

SHA-256 rellena tu entrada, la divide en bloques de 512 bits y ejecuta cada uno a través de 64 rondas de mezcla. Esta publicación explica cada etapa en un lenguaje sencillo sin necesidad de tener experiencia en criptografía.

¿Qué sucede realmente con sus bytes? La caja negra que la mayoría de los desarrolladores nunca abren

SHA-256 es un algoritmo determinista que transforma cualquier entrada en una huella digital de 256 bits (32 bytes). Lo que desde fuera parece una caja negra es en realidad una secuencia de pasos bien definidos. Comprender esos pasos elimina el misterio y le permite verificar la corrección, rastrear errores y comprender por qué el resultado es el que es. Cada parte del algoritmo es pública; la fuerza proviene del diseño, no del secreto.

El algoritmo opera en bloques de 512 bits. Si su entrada es más corta, se rellena. Si es más largo, se divide en varios bloques, cada uno de los cuales se procesa en secuencia, y la salida de cada bloque alimenta al siguiente. Una vez procesados todos los bloques, tiene ocho números de 32 bits que, concatenados, forman el resumen final de 256 bits.

Relleno: agregar un bit 1, ceros y la longitud del mensaje de 64 bits para alcanzar un múltiplo de 512 bits

El paso de relleno es determinista y formalizado. Después de su entrada real, agregue un solo bit 1 (en la práctica, el byte 0x80 si su entrada termina en un límite de bytes). Luego agregue cero bits hasta que le falten 64 bits para un múltiplo de 512 bits. Finalmente, agregue una codificación big-endian de 64 bits de la longitud de entrada en bits. Este relleno garantiza que cada mensaje sea un múltiplo de 512 bits y codifica la longitud original para que entradas idénticas de diferentes longitudes no puedan producir el mismo resumen.

Para la entrada abc (3 bytes = 24 bits), el mensaje rellenado es 512 bits (un bloque): los tres bytes 61 62 63, seguidos de 0x80, seguidos de ceros, seguidos del Codificación de 64 bits de 24 (que es 0x00...0x18 en un campo big-endian de 64 bits). El mensaje ahora llena exactamente un bloque de 512 bits. Para una cadena vacía, el relleno agrega 0x80, seguido de ceros, seguido de 0x00...0x00 (que indica 0 bits de entrada). Para una entrada más larga como un archivo de 100 bytes, el relleno llenaría el último bloque hasta 512 bits e indicaría 800 bits de longitud original.

Los valores iniciales y las constantes los fija el algoritmo; su derivación histórica está fuera de la evidencia del repositorio

El algoritmo comienza con ocho variables de trabajo de 32 bits, inicializadas en los primeros 32 bits de las partes fraccionarias de las raíces cuadradas de los primeros ocho números primos. Se trata de constantes codificadas, visibles en cualquier implementación de referencia y en el código fuente de las bibliotecas criptográficas. Existen porque el uso de constantes fijas de las matemáticas evita sospechas de una puerta trasera oculta. La herramienta ToolAcre utiliza la implementación Web Crypto del navegador, que aplica estas mismas constantes.

El algoritmo también utiliza 64 constantes redondas, derivadas de los primeros 32 bits de las partes fraccionarias de las raíces cúbicas de los primeros 64 números primos. Estos también son fijos y públicos. Las constantes sirven como material de mezcla adicional; cambiarlos rompería el algoritmo y produciría resúmenes diferentes.

El cronograma de mensajes: expandir 16 palabras a 64 con turnos y rotaciones

La programación de mensajes expande 16 palabras (512 bits) en 64 palabras (2048 bits) mediante una fórmula específica. Para las rondas 0-15, las palabras provienen directamente del bloque de entrada. Para las rondas 16-63, cada nueva palabra se calcula tomando dos palabras anteriores (en compensaciones específicas), aplicando una rotación y un desplazamiento, aplicando XOR en otra palabra y almacenando el resultado. La fórmula es determinista y reversible dentro del contexto de un bloque, pero la expansión extiende la influencia de la entrada en todas las 64 rondas.

La fórmula de expansión utiliza operaciones de rotación a la derecha (un desplazamiento circular de bits donde los bits que se caen de un extremo reaparecen en el otro) y desplazamiento a la derecha. La rotación conserva todos los bits pero cambia sus posiciones; El desplazamiento a la derecha descarta bits. La combinación de rotaciones, cambios y operaciones XOR garantiza que cada bit de la entrada influya en varias palabras del programa.

Una ronda: las funciones Ch, Maj y Sigma descritas como operaciones de mezcla de bits y cómo se actualizan ocho variables de trabajo

Cada una de las rondas 64 procesa una palabra del programa de mensajes y actualiza las ocho variables de trabajo. La función principal implica seis operaciones: una mezcla condicional (a menudo llamada Ch, para "elegir") que selecciona bits en función de una variable de control, una función mayoritaria (Maj) que elige el valor más común entre tres variables, dos funciones de mezcla especiales (Sigma_0 y Sigma_1) que rotan y desplazan las variables de trabajo, y el módulo de suma 2^32. Toda la aritmética se realiza en palabras de 32 bits, por lo que el desbordamiento se soluciona.

La función "elegir" toma tres entradas de 32 bits y, para cada posición de bit, selecciona el bit de la primera entrada si un bit de control es 1, o el bit de la segunda entrada si el bit de control es 0. La función mayoritaria analiza tres entradas y, para cada posición de bit, genera el valor de bit que aparece con mayor frecuencia entre las tres. Se trata de operaciones no lineales que rompen la linealidad y garantizan que pequeños cambios de entrada se propaguen de forma impredecible a través del estado.

Encadenamiento de bloques y producción del resultado: agregar el resultado de cada bloque al estado de ejecución

Cada ronda actualiza las ocho variables de trabajo rotándolas e incorporando un nuevo valor calculado a partir de la constante de la ronda actual, la palabra de programación del mensaje y el estado anterior. Las primeras siete variables de trabajo cambian: la octava se convierte en la primera, la primera se convierte en la segunda, y así sucesivamente. El nuevo octavo se calcula a partir de las variables antiguas utilizando las funciones de mezcla. Después de 64 rondas, tienes ocho nuevos valores de 32 bits. Estos se agregan (módulo 2^32) a las constantes iniciales, produciendo el estado hash final para este bloque.

Para un mensaje de varios bloques, los ocho valores de un bloque se convierten en el estado inicial para el siguiente bloque. La cadena garantiza que un cambio en cualquier parte de la entrada afecte a todos los bloques posteriores. Cuando llegas al bloque final, cada bit de la entrada ha influido en la salida final.

Ejemplo resuelto y lo que no cubre: seguimiento del relleno y el recuento de bloques para un mensaje corto; las pruebas de seguridad están fuera de alcance

Para la entrada abc, el mensaje cabe en un bloque de 512 bits después del relleno. El relleno agrega 424 bits, lo que genera un total de 512 bits. El programa de mensajes lo expande a 64 palabras. Cada ronda consume una palabra y actualiza las ocho variables de trabajo a través de las funciones de mezcla. Después de las rondas 64, se aplica XOR al estado con las constantes iniciales, lo que produce el resumen final ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad.

Este es un vector de prueba publicado: el mismo cálculo en la misma entrada siempre produce la misma salida. La herramienta ToolAcre realiza este cálculo exacto a través de la implementación Web Crypto del navegador. Puede verificarlo aplicando hash abc y comparando el resultado con el vector conocido. Cualquier navegador que implemente Web Crypto correctamente producirá el mismo resultado; el algoritmo no admite atajos ni caminos alternativos.

Conclusión: Web Crypto realiza una mezcla determinista SHA-256 sin exponer un secreto

El algoritmo es público y cada paso es determinista. Las funciones de mezcla (Ch, Maj, Sigma_0, Sigma_1) se eligieron para que no fueran lineales, lo que significa que cambiar un bit de entrada no cambia de manera predecible un bit de salida. La expansión de las palabras del mensaje 16 a 64 garantiza que toda la entrada influya en todo el cálculo. Las rondas 64 y el encadenamiento de estado significan que la salida es sensible a cada bit de la entrada y el repositorio utiliza la salida resultante como un resumen determinista. La resistencia a colisiones es una propiedad de seguridad con límites, no una promesa de que las salidas duplicadas sean matemáticamente imposibles.

Las pruebas criptográficas están más allá del alcance de esta publicación. El punto clave es que ahora sabes qué hace realmente el algoritmo. No es magia ni una caja negra. Si desea verificar que ToolAcre esté aplicando hash correctamente, rastree su propia entrada a través de estos pasos o use una implementación de referencia en otro idioma y compare los resultados. La implementación del navegador y cualquier referencia correcta producirán resúmenes idénticos para entradas idénticas.