Padding de SHA-256
Añade el bit uno, ceros y la longitud de 64 bits hasta completar bloques de 512 bits.
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.
Relleno del Mensaje en SHA-256 (Padding)
Las funciones de dispersión criptográfica como SHA-256 procesan los mensajes en bloques de tamaño fijo de 64 bytes (512 bits). Para que cualquier mensaje quepa en un múltiplo exacto de 64 bytes, se aplica un esquema de relleno (padding) estándar estricto (FIPS 180-4).
Modelo mental: La regla de relleno de SHA-256
Dado un mensaje de entrada de bytes:
- Byte de inicio: Se agrega inmediatamente después del mensaje el byte
0x80(un bit1seguido de siete ceros10000000). - Ceros de alineación: Se agregan bytes
0x00hasta que la longitud total del bloque sea exactamente 56 bytes módulo 64 (dejando exactamente 8 bytes libres al final del bloque de 64 bytes). - Longitud en bits (64 bits big-endian): Los últimos 8 bytes (16 caracteres hex) codifican la longitud original del mensaje en bits () como un entero de 64 bits en orden big-endian.
- El bloque resultante siempre tiene una longitud múltiplo de 64 bytes (128 caracteres hexadecimales).
Tu objetivo en esta etapa
Leer por stdin un JSON con op: "pad" y una cadena de bytes en hexadecimal hex. Aplicar el relleno de SHA-256 y devolver la cadena hexadecimal completa en hex.
Formato de Entrada
{
"op": "pad",
"hex": "616263"
}
Formato de Salida
{
"hex": "61626380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018"
}
Qué debes hacer paso a paso
- Calcula longitudes iniciales:
- Longitud en bytes:
origByteLen = hex.length / 2. - Longitud original en bits:
origBitLen = BigInt(origByteLen * 8).
- Longitud en bytes:
- Añade el byte 0x80:
- Concatena
"80"al final dehex.
- Concatena
- Calcula los ceros de relleno:
- El tamaño del mensaje con el
80escurLen = origByteLen + 1bytes. - Encuentra cuántos ceros añadir para que
(curLen + padZeros) % 64 === 56:padZeros = (56 - (curLen % 64) + 64) % 64. - Concatena
"00".repeat(padZeros).
- El tamaño del mensaje con el
- Añade la longitud en bits (8 bytes = 16 hex):
- Convierte
origBitLena hexadecimal con 16 caracteres de relleno con ceros a la izquierda:bitLenHex = origBitLen.toString(16).padStart(16, "0"). - Concatena
bitLenHex.
- Convierte
- Emite la salida: Escribe
{"hex": hexRelleno}en stdout.
Criterios de aceptación
- ✅ Agrega el byte
0x80tras el mensaje. - ✅ Rellena con ceros hasta 56 bytes módulo 64.
- ✅ Codifica la longitud en bits original en 64 bits big-endian.
- ✅ La longitud final es múltiplo exacto de 128 caracteres hexadecimales.
Cómo empezar y comprobar tu avance
Abre el README de la plantilla de tu lenguaje y ejecuta desde su raíz el comando build de shipcode.yml, si existe, seguido de run. La plantilla está incompleta: al principio debe fallar con un diagnóstico de implementación pendiente. Después de desarrollar esta etapa, usa shipcode test; conserva los comportamientos de las etapas anteriores y usa shipcode submit cuando pasen.
Puedes usar una biblioteca JSON para el sobre de entrada y salida. Esa biblioteca no debe resolver el algoritmo del proyecto. Si tu lenguaje no incluye JSON, añade una dependencia documentada y ajusta el comando build de shipcode.yml; comprueba la instalación en una carpeta limpia.
Los fragmentos con Math, .shift() o notación similar expresan ideas de algoritmo; no requieren JavaScript. Adáptalos a los tipos y bibliotecas de tu lenguaje. Un byte no equivale siempre a un carácter: en formatos binarios cuenta bytes y declara la codificación.
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.