Requiem Cipher

Categoría: Esteganografía / Crypto Dificultad: Insane

0. Resumen del reto

El reto entrega un archivo MIDI que, a simple vista, parece una pieza musical normal. Sin embargo, el archivo contiene varias capas ocultas:

  1. Una clave AES escondida en eventos MIDI concretos.

  2. Un conjunto de bits ocultos en otra pista/canal del MIDI.

  3. Esos bits están desordenados mediante una permutación pseudoaleatoria.

  4. Al reordenarlos se reconstruye un código QR.

  5. El QR no contiene la flag directamente, sino un IV:ciphertext.

  6. Con la clave AES recuperada se descifra el ciphertext y se obtiene la flag.

El flujo completo es:

MIDI → clave AES → bits ocultos → deshacer permutación → QR → IV+ciphertext → AES-CBC → flag

1. Análisis inicial

Un archivo MIDI no es audio como tal. No almacena una onda sonora, sino instrucciones musicales:

  • qué nota se toca;

  • cuándo se toca;

  • con qué intensidad;

  • en qué canal;

  • en qué pista.

Esto lo hace muy interesante para esteganografía, porque se pueden ocultar datos en campos que no son evidentes para quien solo escucha la melodía.

En este reto, los datos relevantes no están en el sonido como espectrograma, sino en los eventos MIDI.

2. Inspección básica del MIDI

Lo primero es leer el archivo y observar sus eventos.

Instalamos la librería necesaria:

Código de inspección:

Esto nos permite ver eventos como:

Estas repeticiones son sospechosas porque aparecen con patrones muy concretos.

3. Hipótesis de ocultación

Después de inspeccionar el MIDI, se observan tres grupos relevantes:

Canal
Nota
Posible uso

Canal 0

Varias notas

Música normal / ruido

Canal 2

Notas 73 y 74

Clave AES

Canal 9

Nota 35

Bits ocultos del QR

Otros canales

Varias notas

Ruido / distracción

La hipótesis es:

  • la música principal es decorativa;

  • la clave AES está escondida en el canal 2;

  • la información visual está escondida en el canal 9;

  • el resto de eventos sirven para que el archivo parezca natural.

4. Recuperación de la clave AES

4.1. Patrón encontrado

En el canal 2 aparecen eventos note_on con notas 73 y 74.

El patrón es:

Cada byte de la clave se divide en dos nibbles:

Además, cada valor se codifica usando la velocity:

Finalmente, el byte reconstruido está ofuscado con XOR 0x55:

4.2. Código para extraer la clave

Aquí filtramos únicamente:

  • mensajes note_on;

  • canal 2;

  • notas 73 y 74.

4.3. Reconstrucción byte a byte

La clave AES final tiene 16 bytes, por tanto corresponde a AES-128.

5. Extracción de bits ocultos

5.1. Canal oculto del QR

El siguiente patrón aparece en:

El campo velocity codifica bits:

Esto es esteganografía musical porque la información está escondida en la intensidad de golpes de percusión.

5.2. Código de extracción

En este punto tenemos una cadena de bits, pero todavía no podemos reconstruir el QR directamente.

6. Problema: los bits no están en orden

Si intentamos interpretar estos bits de forma directa, el QR no se reconstruye correctamente.

Esto indica que los bits han sido permutados.

La permutación se genera usando una seed derivada de la clave AES:

Esto significa que no podemos ordenar los bits correctamente sin recuperar antes la clave.

Por eso el orden correcto de resolución es:

7. Deshacer la permutación

7.1. Generar la misma permutación

El reto usó esta permutación para desordenar los bits. Para revertirla hacemos la operación inversa.

7.2. Reordenar los bits

Ahora payload_bits contiene los bits en el orden original.

8. Reconstrucción del QR

8.1. Formato interno

Los primeros 8 bits indican el tamaño del QR:

Después vienen los píxeles:

Cada bit representa un píxel:

8.2. Crear la imagen

Al abrir recovered_qr.png, aparece un código QR válido.

9. Lectura del QR

El QR no contiene la flag directamente. Contiene dos valores separados por ::

Ejemplo de formato:

El primer valor es el IV usado en AES-CBC. El segundo es el ciphertext.

Podemos leer el QR manualmente con un lector de QR, o automáticamente con OpenCV.

Instalación:

Lectura automática:

10. Descifrado AES-CBC

Una vez tenemos:

  • key, recuperada desde el MIDI;

  • iv, leído desde el QR;

  • ciphertext, leído desde el QR;

podemos descifrar.

Resultado:

11. Solver completo

12. Flujo mental del jugador

Un jugador debería razonar así:

13. Por qué es esteganografía musical

No se oculta texto dentro de metadatos, ni se añade un archivo al final. La información se distribuye dentro de eventos musicales aparentemente normales:

  • intensidades de notas;

  • canales MIDI;

  • notas concretas;

  • orden pseudoaleatorio;

  • ruido de otras pistas.

El archivo puede sonar como una pieza normal, pero al analizar su estructura se revela el contenido oculto.

14. Conclusión

Este reto combina varias áreas:

  • análisis de formato MIDI;

  • esteganografía en eventos musicales;

  • reconstrucción visual mediante QR;

  • permutaciones pseudoaleatorias;

  • criptografía simétrica AES-CBC.

La dificultad no está en una sola operación, sino en correlacionar todas las capas:

Esto convierte el reto en una cadena completa de razonamiento, no en una simple extracción directa.

Last updated