Digest completo
Encadena las 64 rondas y valida el digest SHA-256 completo.
Constrúyelo en tu lenguaje
El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.
Digest Completo de SHA-256
En esta etapa integrarás todos los componentes anteriores para construir la implementación completa de SHA-256: padding, inicialización de valores , expansión de palabras y las 64 rondas de compresión por bloque.
Modelo mental: El algoritmo completo SHA-256
- Valores iniciales de hash (): Las partes fraccionarias de las raíces cuadradas de los primeros 8 números primos.
- Relleno: Aplica el padding estándar al texto de entrada (codificado en UTF-8).
- Para cada bloque de 64 bytes:
- Divide en y expande hasta .
- Inicializa las variables de trabajo: .
- Ejecuta las 64 rondas usando las 64 constantes :
- Suma las variables de trabajo a los acumuladores: .
- Digest final: Concatena en hexadecimal minúsculo (64 caracteres hex).
Tu objetivo en esta etapa
Leer por stdin un JSON con op: "sha256" y una cadena de texto text. Devolver el hash SHA-256 en hexadecimal minúsculo en hex.
Formato de Entrada
{
"op": "sha256",
"text": "abc"
}
Output Format
{
"hex": "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
}
Qué debes hacer paso a paso
- Codifica el texto a UTF-8 bytes: Convierte
texta su secuencia de bytes UTF-8. - Aplica padding: Añade
0x80, ceros hasta 56 mod 64 y la longitud en bits de 64 bits. - Ejecuta la compresión en bloques de 64 bytes.
- Formatea la salida: Concatena los 8 acumuladores en una cadena de exactamente 64 caracteres hexadecimales en minúsculas.
- Emite la salida: Escribe
{"hex": hashHex}en stdout.
Criterios de aceptación
- ✅ Produce el digest exacto del estándar FIPS 180-4 para vectores de prueba conocidos (como
"abc"). - ✅ Devuelve una cadena de 64 caracteres hexadecimales en minúsculas.
Del bloque a las rondas
Antes de integrar, prepara las operaciones de 32 bits: rotación a la derecha, desplazamiento lógico, Choice y Majority. Distingue las sigmas pequeñas de expansión de las mayúsculas de compresión. Conserva el estado inicial de cada bloque para sumarlo al estado de trabajo después de las 64 rondas; todas las sumas son módulo 2^32. No derives las constantes con flotantes.
Usa FIPS 180-4: §4.1.2 define funciones, §4.2.2 las constantes, §5.3.3 el estado inicial y §6.2.2 el orden completo de actualización. Revisa una ronda en papel antes de procesar varios bloques.
Formato de salida y errores
Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto.
Para entradas inválidas, usa stderr con la palabra error, stdout vacío y código 1. Para entradas válidas, código 0. Usa números JSON enteros cuando el resultado sea entero.