Construye tus propias funciones SHA-256 y HMAC
Etapa 1 de 7v2 · 157608d8

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 LL bytes:

  1. Byte de inicio: Se agrega inmediatamente después del mensaje el byte 0x80 (un bit 1 seguido de siete ceros 10000000).
  2. Ceros de alineación: Se agregan bytes 0x00 hasta 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).
  3. Longitud en bits (64 bits big-endian): Los últimos 8 bytes (16 caracteres hex) codifican la longitud original del mensaje en bits (Limes8L imes 8) como un entero de 64 bits en orden big-endian.
  4. 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

json
{
  "op": "pad",
  "hex": "616263"
}

Formato de Salida

json
{
  "hex": "61626380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018"
}

Qué debes hacer paso a paso

  1. Calcula longitudes iniciales:
    • Longitud en bytes: origByteLen = hex.length / 2.
    • Longitud original en bits: origBitLen = BigInt(origByteLen * 8).
  2. Añade el byte 0x80:
    • Concatena "80" al final de hex.
  3. Calcula los ceros de relleno:
    • El tamaño del mensaje con el 80 es curLen = origByteLen + 1 bytes.
    • Encuentra cuántos ceros añadir para que (curLen + padZeros) % 64 === 56: padZeros = (56 - (curLen % 64) + 64) % 64.
    • Concatena "00".repeat(padZeros).
  4. Añade la longitud en bits (8 bytes = 16 hex):
    • Convierte origBitLen a hexadecimal con 16 caracteres de relleno con ceros a la izquierda: bitLenHex = origBitLen.toString(16).padStart(16, "0").
    • Concatena bitLenHex.
  5. Emite la salida: Escribe {"hex": hexRelleno} en stdout.

Criterios de aceptación

  • ✅ Agrega el byte 0x80 tras 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.