Aquest estiu, la segona sessió de les vermutacions va ser sobre criptografia, i en Ramon ens va posar com a exercici desencriptar un text encriptat mitjançant un xifratge de substitució. Aquest xifrat es pot trencar amb un full i un llapis, i una mica de paciència. Per anar una mica més ràpid, jo vaig utilitzar un petit script en perl que havia fet fa un temps i que està només acabat a mitges, però és més o menys operatiu (però per exemple només agafa textos amb A-Z, sense Ç o lletres per l’estil). Al resoldre’l, em van demanar que pengés l’arxiu, i així ho he fet aquí (és el subsolve).
Subsolve llegeix un text encriptat de stdin o d’un arxiu de text, i llavors permet anar trencant interactivament el text (i la clau). Evidentment, va bé saber (o tenir-ne una suposició raonable) la llengua en què està escrit el text. En aquest cas, subsolve permet comparar les freqüències del text amb una taula de freqüències de l’idioma, si es té aquesta taula. Les taules han d’estar guardades en arxius amb el nom llengua.ngr, on llengua és el codi de la llengua (per exemple, jo utilitzo en per anglès, ca per català, etc.) i n és la longitud de la cadena de la que es recompta la freqüencia (1 per lletres, 2 per dígrams, etc.). L’arxiu ha de contenir a cada línia una lletra, un o més espais i un número (la seva freqüència). Per exemple, l’arxiu amb la llista de freqüències de lletres en català (ca.1gr) seria:
a 12.55 b 1.32 c 3.60 ç 1.06 d 3.94 e 13.89 f 1.00 g 1.28 h 0.72 i 6.99 j 0.30 k 0.00 l 7.74 m 3.16 n 6.40 o 5.71 p 2.72 q 1.35 r 6.76 s 8.43 t 6.11 u 4.18 v 1.40 w 0.00 x 0.52 y 0.00 z 0.01
Per analitzar un text català encriptat, guardat a l’arxiu exemple.txt, es crida l’script amb
./subsolve.pl -f exemple.txt --lang ca --spaces
L’opció --spaces separa les lletres en grups de cinc. Es poden posar menys caràcters per línia amb l’opció -w o --width (per exemple, -w 30).
Una vegada dins, l’opció help o ? ens llista les accions possibles, i help <acció> mostra ajuda específica per una acció (per exemple, help count). count n (o simplement n) compta les freqüències de grups de n lletres. add Ab afegeix la correspondència A->b, on A és una lletra del text encriptat i b la corresponent en el text original. remove Ab ho elimina. show text mostra el text (majúscules la part encriptada, minúscules la part ja resolta). show key mostra la clau. search <cadena> n busca cadena al text, i mostra els resultats envoltats de text a dreta i esquerra de llargada n. La cadena pot contenir majúscules i minúscules (i el programa entén què signifiquen), i també expressions regulars senzilles. Per exemple search A.d 2 busca cadenes que continguin la lletra encriptada A, seguida de qualsevol lletra, seguida de la lletra del text original d, i retorna els resultats amb dues lletres a l’esquerra i a la dreta; o search [AB]C busca la cadena AC o BC; o search [AB]{2} busca les cadenes AA, AB, BA o BB. Per a més informació, feu servir help, llegiu-vos el codi o pregunteu-ho aquí! Comentaris o extensions a l’script són més que benvinguts.
En Ramon també ens va posar un altre exercici: trencar el xifrat Vigenère. Però això ja és una mica més difícil…
