PAUL GUERRERO software engineer
← retos

Euskal Encounter 34 · Solve It 5

Solve It 5 — Drawings in the wall

Resuelto
  • #ctf
  • #criptografía
  • #ia
En uno de mis viajes, dentro de una cueva encontré los siguientes símbolos. ¿Me ayudas a descifrarlos?
Enunciado del reto

Cómo se resolvió

  1. Catorce horas sin converger

    71 formas, 25 signos distintos, y media docena de solvers de sustitución en castellano contra ellos. Ninguno cerró nunca. Cuando fallan tantos métodos buenos, lo que está mal es el modelo del reto.

  2. Un buscador visual, no un solver

    Arrastrar la lámina de símbolos limpios a Google Lens los identificó al instante: elamita lineal, una escritura de la Edad del Bronce descifrada en 2022. Con ella venía su tabla de valores fonéticos.

  3. Noruego escrito sin vocales

    Cada signo aporta la consonante de su celda y las vocales casi no se escriben, así que hay que reconstruir, no leer. El esqueleto h·v·d·s·t·d·n solo encaja con «hovedstaden»: la capital.

  4. La frase describe, no nombra

    El noruego habla de una capital escondida en Doriath, a orillas del Esgalduin, excavada por enanos, con mil cuevas. Hay que deducir qué caverna de Tolkien es — y el título del reto describe sus muros tallados.

Contraseña MENEGROTH

La pista no estaba en los símbolos. El título del reto describía la respuesta desde el primer minuto, y tardamos catorce horas en mirarlo.

Esas catorce horas se fueron en atacar el criptograma como lo que parecía ser: una sustitución monoalfabética con texto en castellano. Análisis de frecuencias, solvers de patrones contra diccionario, hill-climbing, simulated annealing, cifrado de Hill; pruebas en castellano, inglés y euskera. Nada convergió nunca. Y ese «nada converge nunca» era el dato más valioso de la noche, aunque no supimos leerlo: cuando media docena de métodos independientes y bien implementados fallan sobre el mismo texto, la conclusión no es que necesitas un séptimo método. Es que tu modelo del problema está mal.

Mal en algo muy concreto: todos los ataques asumían que un signo es una letra, y esta escritura no funciona así. El texto es noruego escrito como un abjad —se anotan las consonantes y la mayoría de vocales se omiten, como en árabe o hebreo— sobre la tabla fonética del elamita lineal, una escritura de la Edad del Bronce. Abajo está la solución completa, verificada signo a signo, y los callejones en corto, que también enseñan. El remate lo puso otro miembro del equipo por una vía distinta de la que veníamos siguiendo, que es como se resuelven las cosas cuando sois varios.

El criptograma

Inscripción del reto: tres líneas de símbolos geométricos dorados sobre fondo oscuro, con barras verticales entre grupos de signos

Lo mecánico salió bien y rápido: segmentar la imagen, recortar cada glifo y agruparlos por similitud visual. El resultado: 71 signos, 25 distintos, 22 palabras. La barra | separa palabras; || cierra frase. Etiquetando los signos como S01..S25:

L1  S01-S02 | S03-S04 | S01-S05 | S06-S07-S08-S01 | S09-S03-S01-S06-S10-S01-S05 |
    S11 | S01-S02 | S12-S08-S13-S06-S07 | S14-S07-S02 | S15-S14-S16-S02

L2  S17 | S18-S14-S01-S05 | S16-S19 | S12-S08-S13-S05 | S12-S06-S20-S08-S15-S11-S05 |
    S16-S19 | S01-S13-S04-S07-S04 | S17-S04 | S21-S05-S07-S05 | S22-S23

L3  S15-S24-S05 | S09-S25-S04

Lámina con los 25 símbolos distintos ya limpios, etiquetados de S01 a S25: rombos con variantes, líneas verticales con puntos, zigzags, tramas rayadas y aspas

La identificación de los signos se verificó a fondo —distancias de píxel entre grupos, para descartar que dos formas parecidas fueran el mismo signo partido en dos— y era correcta: las cuatro variantes de rombo son signos distintos de verdad. El único error de transcripción, que pagaríamos después, fue de corte: durante el concurso leímos la última palabra de la línea 2 (S22-S23) pegada a la primera de la línea 3, como un solo token de cinco signos. Un salto de línea también separa palabras, y no lo tratamos como tal.

Catorce horas de callejones

Los solvers ya están listados arriba; ninguno convergió, y ahora se sabe por qué: no había biyección signo-letra que encontrar. Lo que merece contarse es lo que hicimos cuando dejaron de converger.

Pasamos a fijar cribs a mano: adivinar una palabra y propagar sus letras. Una palabra de siete signos «era» mientes, otra pues; más tarde, en clave leet, cu4l y v0c3s. Cada crib nueva encajaba con las anteriores, y la lectura parcial parecía sólida — coherente por dentro y falsa por completo, porque el texto no era castellano. Un conjunto de cribs mutuamente compatibles no valida el idioma: solo demuestra que no se contradicen entre sí. La señal de alarma estaba a la vista —ninguna lectura cerraba del todo— y en vez de tomarla como refutación la excusamos con ofuscación, jerga o leet mixto. Si tu hipótesis necesita una excepción nueva cada vez que la contrastas, la hipótesis es la excepción.

En paralelo corría un bucle más sutil: cada vez que un solver fallaba, volvía la sospecha de que la transcripción estaba mal, se re-verificaba, salía correcta, y a la siguiente vuelta la sospecha regresaba. Lo que paró ese bucle fue pasar cada glifo de píxeles a SVG: con la geometría explícita, cada signo se vuelve una entidad estable que se puede citar en vez de re-mirar, y la duda desaparece. La solución no era mirar con más cuidado; era dejar de mirar.

La identificación: elamita lineal

Con los símbolos limpios, lo que desatascó el reto no fue un solver: fue arrastrar la lámina a un buscador visual (Google Lens). Identificación inmediata: elamita lineal, la escritura de la Elam de la Edad del Bronce, descifrada en gran parte en 2022 por el equipo de François Desset. Ante símbolos sin identificar, lo primero es averiguar qué sistema de escritura son, y para eso el instrumento no es un criptoanalizador, es un buscador.

Contrastando nuestros 25 signos con la lámina de signos elamitas conocidos: 10 correspondencias fuertes, 13 de familia y 2 sin ninguna. El repertorio es geométricamente genérico —rombos, líneas con puntos, rayados—, así que el parecido por sí solo probaba poco; pero la pista era la buena, y con la lámina venían los valores fonéticos. Nuestro primer intento con ellos, leyendo cada signo como la sílaba completa de su celda, no produjo nada legible. La razón está en la sección siguiente.

Antes cayó un último callejón, y conviene contarlo porque acertó por casualidad. Ocho de los 25 signos aparecen una sola vez en el texto, y aquel token mal cortado de cinco signos parecía concentrarlos: tres de sus cinco eran únicos. En un silabario, eso huele a nombre propio — sílabas que el resto del mensaje no necesita. Preseleccionamos topónimos de El Silmarillion asociados a cuevas, y una cuenta de sílabas sobre ese token dejó tres candidatos: Menegroth, Belegost y Androth. La respuesta estaba entre ellos, pero el filtro partía de un conteo que no era el real: con la segmentación correcta, la línea final solo retiene dos de esos ocho signos únicos (otros dos se van con «og») y, sobre todo, no lleva ningún nombre — es «tusen huler», «mil cuevas». Los nombres propios de verdad, Doriath y Esgalduin, viven en las líneas 1 y 2, donde nadie los buscó.

La solución: noruego escrito como abjad

La clave que ningún ataque contempló: cada signo aporta la consonante de su celda en la lámina de Desset, y las vocales se escriben solo a veces. Por eso un mismo signo reaparece con vocales distintas alrededor que simplemente no están escritas, y ningún método que asumiera «un signo, una letra» podía cerrar. La prueba más clara es la palabra de siete signos que ningún crib logró leer: h·v·d·s·t·d·n. Como letras no dice nada; como esqueleto consonántico de una palabra noruega de once letras es inmediata: hovedstaden, «la capital».

Las fusiones de valores no son un invento nuestro, las fuerza la escritura: el elamita no distingue sordas de sonoras (d/t, g/k, b/p) y le faltan letras que el noruego necesita (o, f, j, æ, ø, å). Escribir noruego con él obliga a aproximar. La tabla completa, signo a signo:

S01: te  → d/t     S14: ri2 → r
S02: ta  → t/d     S15: tu2 → d/t
S03: wi  → v       S16: a   → a
S04: ra  → r       S17: pu2 → p/f
S05: na  → n       S18: pe  → b
S06: sa  → s       S19: u2  → v
S07: ki  → k/g     S20: ka  → g
S08: la  → l       S21: ku2 → k
S09: hu  → h       S22: u   → o
S10: ti  → t       S23: ka2 → g
S11: i   → i       S24: si  → s
S12: e   → e       S25: li  → l
S13: wi2 → v

Aplicada al criptograma, palabra a palabra, sale esto:

Det var den skjulte hovedstaden i det alviske riket Doriath.
På bredden av elven Esgalduin, av dverger for kongen, og tusen huler.

«Era la capital escondida del reino élfico de Doriath. A orillas del río Esgalduin, por enanos para el rey, y mil cuevas.»

Las tres últimas palabras del criptograma recompuestas con los glifos limpios: dos signos, barra separadora, tres signos, barra, y otros tres signos

Las tres últimas palabras, leídas con la tabla: o-g | t-s-n | h-l-r → «og tusen huler», «y mil cuevas».

Dos anclas cierran la discusión de si esto es azar: hovedstaden y Esgalduin (siete signos cada una) dan match único contra las 605.000 formas del Norsk Ordbank. Con un abjad de 25 signos, un esqueleto corto encaja con varias palabras; uno de siete consonantes que solo encaja con una, dos veces, no. Fijadas esas dos, el resto de la frase se resuelve sin margen de maniobra.

Quedan dos puntos donde el autor tomó un atajo al codificar, y se declaran en vez de maquillarse: la a de alviske se escribe con el signo de e (S12), y la dd de bredden se colapsa en un solo signo — la escritura no representa consonantes dobles.

La verificación va del revés, y por eso vale: el script no descifra, cifra la frase noruega reconstruida y comprueba que reproduce los 71 signos exactos del criptograma, palabra por palabra. Es la prueba más fuerte de que la lectura no es un ajuste a posteriori.

S06-S07-S08-S01              skjulte      s»S06 k»S07 (j) (u) l»S08 t»S01 (e)  [OK]
S09-S03-S01-S06-S10-S01-S05  hovedstaden  h»S09 (o) v»S03 (e) d»S01 s»S06 t»S10 (a) d»S01 (e) n»S05  [OK]
...
S15-S24-S05                  tusen        t»S15 (u) s»S24 (e) n»S05  [OK]

TOTAL: los 71 signos reproducen el criptograma exactamente

Los paréntesis son las letras que la escritura no representa: las vocales que hay que reconstruir al leer.

Un matiz sobre el texto: no es una cita de El Silmarillion, y por eso ninguna búsqueda de frase textual daba con nada. El autor escribió su propia frase con el léxico exacto de la traducción noruega de Nils Ivar Agøy — alviske, la forma de Agøy para «élfico», aparece trece veces en ese libro, y su pasaje sobre el Esgalduin usa las mismas palabras.

El título llevaba la respuesta

MENEGROTH no aparece en el texto: es la respuesta a lo que el texto describe. Menegroth son «las Mil Cavernas», el reino subterráneo de Thingol en Doriath, a orillas del Esgalduin, excavado en la roca por los enanos de Belegost. La frase noruega es su ficha sin el nombre: la capital escondida, el reino élfico de Doriath, el río, los enanos, el rey, las mil cuevas. El jugador tiene que deducir de qué caverna se habla, y ese nombre es la contraseña.

Y ahora la parte que duele, verificada contra el texto de Tolkien:

“Carven figures of beasts and birds there ran upon the walls, or climbed upon the pillars, or peered among the branches entwined with many flowers.”El Silmarillion, «De los Sindar»

En los salones de Menegroth había figuras talladas de bestias y aves recorriendo los muros. Es decir: Drawings in the wall, el título del reto, es una descripción literal de Menegroth. Y el enunciado —«dentro de una cueva encontré los siguientes símbolos»— dice lo mismo otra vez.

El nombre del reto contenía la respuesta desde el primer minuto, mientras nosotros estábamos dentro del criptograma contando frecuencias. No es que la pista fuera sutil: es que no la miramos, porque habíamos decidido que el problema era criptográfico y el título era decoración. El mismo error del callejón —modelo equivocado del problema— cometido un nivel más arriba.

Lo que nos llevamos

Este reto es el ejemplo más claro de la serie de que más cómputo no arregla un modelo equivocado del problema. Toda la potencia se fue en criptoanálisis cada vez más sofisticado sobre una premisa falsa, y lo que movió la aguja fueron dos gestos gratis: cambiar el formato del dato y pasar la imagen por un buscador visual.

Si tuviéramos que quedarnos con una sola cosa, es la del SVG. Pasar los glifos de píxeles a geometría es lo que despegó el razonamiento del reconocimiento, y sirve para cualquier cosa que empiece en una imagen. Lo demás lo sabíamos y aun así lo hicimos mal: que el enunciado es input y no decoración, que hay que averiguar qué escritura tienes delante antes de atacar el cifrado, y que «nunca cierra del todo» es una refutación y no un detalle pendiente de explicar.

Cayó, así que es un writeup de victoria. Pero con la lección al revés: el trabajo caro no sirvió de nada, y el reto lo cerró la persona que se salió del marco en el que los demás llevábamos catorce horas encerrados.

Solución:

MENEGROTH

El material — los scripts, los glifos limpios y el writeup técnico completo de este nivel están en euskal34/solve-it/5.