U.S. Cyber Command Valentine’s Day 2021 Crypto Challenge (Puzzle 5)

Pour la Saint Valentin 2021, l'U.S. Cyber Command propose dans un tweet de résoudre une douzaine de puzzles de cryptographie. Cliquez ici pour les récupérer. Une excellente initiative qui suscitera peut-être des vocations...
Pourquoi ne pas s'y essayer ? Nous verrons bien où cela nous mène... Je publierai sur ce site les solutions auxquelles je serai parvenu, sous la forme des notes prises chemin faisant, rendant donc compte d'éventuels errements, ce qui sera plus vivant.
Aujourd'hui, la solution du puzzle 5.
Comme d'habitude, je fais l'inventaire des éléments fournis. D'abord, une matrice de nombres :
3	46	5	1
4	13	5	6
1	1	2	18
3	29	16	9
6	4	3	22
2	5	1	17
5	3	13	45
6	1	1	4
2	37	7	5
9 lignes et 4 colonnes. 36 nombres en tout, entre 1 et 46.
Rapidement avec Python, pour éviter de mon tromper, je calcule les fréquences des nombres utilisés. Il y a 17 nombres différents, ici par ordre de fréquence décroissante :
1	6
5	5
3	4
2	3
4	3
6	3
13	2
7	1
9	1
16	1
17	1
18	1
22	1
29	1
37	1
45	1
46	1
Par ailleurs, des mots qui désignent différents types d'amour :
STORGE	6 caractères
PHILIA	6 caractères
EROS	4 caractères
AGAPE	5 caractères
4 mots. 21 caractères parmi les suivants :
ABCDEFGHIJKLMNOPQRSTUVWXYZ
A___E_GHI__L__OP_RST______
Rien de flagrant. Un peu de Python pour déterminer les indices des lettres des mots dans l'alphabet, en partant de 1 pour "A" :
STORGE: [19, 20, 15, 18, 7, 5]
PHILIA: [16, 8, 9, 12, 9, 1]
EROS: [5, 18, 15, 19]
AGAPE: [1, 7, 1, 16, 5]
Pas mieux.
Enfin, une date : 1960. C'est une année bissextile, donc 366 jours avec le 29 février. Et d'après ce que je peux lire ici ou là en cherchant sur son histoire, c'est aussi dans les années 60 que la crypto commence à trouver des usages non gouvernementaux, à la faveur du développement de l'informatique.
Inutile de tenter d'extraire les octets ou les LSB des composantes des pixels, car l'image est fournie en JPG, format qui est très rarement utilisé pour compresser en loseless. En fait, je ne sais même pas s'il est possible de compresser en loseless en JPG. Je regarde tout de même le fichier dans HxD, histoire de voir si du texte ne traîne pas quelque part. Rien. Pour être bien sûr de mon coup, j'extrais le texte en clair avec strings64. Rien non plus.
Commencons bêtement à chercher un lien entre les 4 mots et les 36 nombres. Je tente une substitution à la César. L'alphabet est la concaténation de tous les mots fournis, et je remplace chaque nombre par le caractère à l'indice correspondant, modulo la longueur de l'alphabet. Tant que j'y suis, je pousse tout de suite jusqu'à faire cycler l'alphabet sur la droite d'un caractère, et cela jusqu'à retomber sur l'alphabet initial. De plus, je lis le résultat en ligne (de gauche droite et de haut en bas) et en colonne (de haut en bas et de gauche à droite) :
----- STORGEPHILIAEROSAGAPE -----
ORGSREGESSTGOHSIEROSTGSAGOEOESSRTSPG
ORSOETGETRESHRGOSSGGTSOSESPSEGISAORG
----- ESTORGEPHILIAEROSAGAP -----
TOREOARGEESATPOHGOTESRESRTATGEEOSOER
TOETGSRGSOAEPORTEORRSOTEAEEEGAHESTOR
----- PESTORGEPHILIAEROSAGA -----
STOPTIORPPESSERPRTSPEOPOOSISRPPTERGO
STPSREORETIPETOSPROOERSPIPGPRSPPOSTO
----- APESTORGEPHILIAEROSAG -----
ESTASLTOAAPOEGEEOSEAPTARTELEOAASPERT
ESAEOPTOPSLAGSTEAETTPEEALARAOOEAREST
----- GAPESTORGEPHILIAEROSA -----
PESGEISTGGARPRAGTEPGASGESPIPTGGEAAOS
PEGPTASTAEIGRESPGASSAAPGIGOGTRGGEPES
----- AGAPESTORGEPHILIAEROS -----
APEAPHESAAGEAOIRSPAAGEAAEAHASAAPGITE
APAASGESGPHAOPEAAIEEGIAAHATASERAAAPE
----- SAGAPESTORGEPHILIAERO -----
GAPSAPPESSAAGTLOEAGSAPSIPGPGESSAALSP
GASGEAPEAAPSTAPGSLPPALGSPSSSEAOSIGAP
----- OSAGAPESTORGEPHILIAER -----
AGAOGEAPOOSIASITPGAOSAOLAAEAPOOGSIEA
AGOAPSAPSGEOSGAAOIAASIAOEOEOPITOLAGA
----- ROSAGAPESTORGEPHILIAE -----
SAGRAGGARROLSEHSAASROGRIGSGSARRAOHPG
SARSAOGAOAGREAGSRHGGOHSRGRPRALSRISAG
----- EROSAGAPESTORGEPHILIA -----
OSAESRAGEERIOPPEGSOERAEHAOROGEESRPAA
OSEOGRAGRSREPSAOEPAARPOEREAEGIEEHOSA
----- AEROSAGAPESTORGEPHILI -----
ROSAOOSAAAEHRAEPAORAESAPSRORAAAOEEGS
ROARAESAEOOAAOSRAESSEERAOAGAAHPAPROS
----- IAEROSAGAPESTORGEPHIL -----
EROIRTOSIIAPEGGASREIAOIEOETESIIRAGAO
ERIESAOSARTIGROEIGOOAGEITIAISPAIEERO
----- LIAEROSAGAPESTORGEPHI -----
AERLESROLLIEAARGOEALIRLGRASAOLLEIRSR
AELAOIROIESLAERALRRRIRALSLSLOEGLGAER
----- ILIAEROSAGAPESTORGEPH -----
IAEIAEERIILGISOARAIILEIREIEIRIIALOOE
IAIIRLERLAEISAEIIOEELOIIEIOIRGAIRIAE
----- HILIAEROSAGAPESTORGEP -----
LIAHIPAEHHIRLOTSEILHIAHOALPLEHHIITRA
LIHLEIAEIIPHOIALHTAAITLHPHRHERSHOLIA
----- PHILIAEROSAGAPESTORGE -----
ILIPLAIAPPHOIRSOALIPHIPTIIAIAPPLHSEI
ILPIAHIAHLAPRLIIPSIIHSIPAPEPAOOPTILI
----- EPHILIAEROSAGAPESTORG -----
HILEIGLIEEPTHEERIIHEPLESLHGHIEEIPEAL
HIEHIPLIPIGEEILHEELLPEHEGEAEITRESHIL
----- GEPHILIAEROSAGAPESTOR -----
PHIGHAILGGESPAPELHPGEIGEIPAPLGGHEPII
PHGPLEILEHAGAHIPGPIIEPPGAGIGLSEGEPHI
----- RGEPHILIAEROSAGAPESTO -----
EPHRPSHIRRGEEIAAIPERGHRPHESEIRRPGALH
EPREIGHIGPSRIPHERAHHGAERSRLRIEARPEPH
----- ORGEPHILIAEROSAGAPEST -----
GEPOEOPHOORPGLGIHEGORPOAPGOGHOOERGIP
GEOGHRPHREOOLEPGOGPPRGGOOOIOHPIOAGEP
----- TORGEPHILIAEROSAGAPES -----
RGETGREPTTOARIALPGRTOETGERRRPTTGOAHE
RGTRPOEPOGRTIGERTAEEOARTRTHTPALTGRGE
Rien. Sans doute, on voit apparaître des mots de quelques lettres ici et là, mais cela ne veut rien dire, car l'alphabet est petit. C'est un artefact.
Bon, essayons d'être moins stupide, donc de réfléchir avant de se lancer dans du brute-forcing. Quelle est la structure du puzzle ? Comment a-t-il été conçu, c'est-à-dire quelles contraintes ont pu peser sur cette conception ?
Comment relier la date, les mots, la matrice de nombres ? D'abord, s'il y a 4 mots, il y a aussi 4 colonnes : un par colonne ? Pourquoi pas. Dans le même ordre de rapprochement, 1960, c'est un nombre de 4 chiffres.
Maintenant, pourquoi des nombres de 1 à 46 ? Pourquoi la première colonne ne contient-elle que des nombres à un chiffre, de 1 à 6 ? Il y a 52 semaines dans une année. Et 7 jours dans une semaine. Un rapport possible ? Je trouve un calendrier de l'année 1960, mais sa contemplation ne m'inspire rien.
En tout cas, les nombres ne sont pas sortis d'un carré de Polybe, ou toute autre méthode d'association d'un caractère à un tuple, car les nombres sont à 1 ou 2 chiffres.
Après avoir laissé reposer quelques jours, je cherche "wikipedia storge eros" sur Google, et je tombe sur un livre.
C'est un livre écrit par C.S. Lewis en... 1960 ! Je le télécharge via un lien mentionné dans la page.
Je pense immédiatement que une série de nombres doit pouvoir s'interpréter comme les coordonnées d'un mot dans le livre. Par exemple, en allant récupérer un mot qui se trouverait à la 1ère position de la 5ème phrase du 46ème paragraphe du 3ème chapitre pour "3:46:5:1". C'est vraiment bateau, vu dans tous les films, mais bon...
Indice encourageant, le livre contient 6 chapitres, et le premier nombre des séries est compris entre 1 et 6. De plus, le 3ème chapitre qui serait visé par le premier nombre de la première série "3:46:5:1" contient 46 paragraphes...
Je tente de récupérer les mots ainsi localisés. Je reprends la version TXT dans Notepad++, et j'isole chaque chapitre dans un fichier. Puis j'utilise Python pour localiser les mots. Pour parvenir à traiter le texte, je dois rechercher et remplacer quelques caractères dans Notepad++, notamment des doubles guillemets qui ne sont pas ceux du jeu ASCII, sans quoi plantage.
Mais j'ai tôt fait de constater que délimiter les phrases va être une galère absolue, car les fins de phrase ne sont pas évidentes à localiser :
  • un "." peut servir dans une abréviation comme "Mrs." ;
  • un "?" doit-il être considéré comme marquant une fin de phrase ;
  • etc.
Bref, comme le nombre de séries est vraiment très limité, je recherche manuellement pour m'éviter des erreurs. Ce qui donne :
3	46	5	1		That
4	13	5	6		perhaps
1	1	2	18		a
3	29	16	9		(?)
6	4	3	22		is
2	5	1	17		I
5	3	13	45		(?)
6	1	1	4		a
2	37	7	5		(?)
Pas concluant, mais il y a encore bien des ambiguités sur les césures dans le TXT. En conséquence, je me réfère au PDF qui doit avoir préservé la mise en forme de l'original pour tirer cela au clair. Ce qui donne :
3	46	5	1		She
4	13	5	6		was
1	1	2	18		a
3	29	16	9		child
6	4	3	22		and
2	5	1	17		I
5	3	13	45		was
6	1	1	4		a
2	37	7	5		home ?
L'hésitation sur le dernier mot vient de la structure d'un paragraphe qui contient une citation sur deux lignes après une ligne de texte :
Shakespeare has described the satisfaction of a tyrannous lust as something

Past reason hunted and, no sooner had,
Past reason hated.
Les trois lignes doivent-elles être considérées comme un, deux ou trois paragraphes ?
Toutefois, "She was a child and I was a home" est cohérent. 32 caractères, 9 mots, donc 8 espaces, soit 24 caractères si on les retire : ce n'est pas le flag, qui fait 11 caractères, 2 mots, donc 10 caractères si on retire l'espace. Il faut chercher quelque chose de plus...
Je cherche cette phrase sur Google. Rien. Je tente dans le moteur de recherche de l'U.S. Cyber Command 🙂 Les mecs doivent se marrer s'ils consultent les requêtes faites sur leur site. J'espère qu'ils bannissent les mecs qui brute-forcent d'ailleurs.... Rien.
Le dernier mot de la phrase pose peut-être problème. De fait, en cherchant "She was a child and I was a" sur Google, je tombe sur le vers "She was a child and I was a child", un vers d'un poème d'Edgar Allan Poe, intitulé Annabel Lee.
Le titre du poème fait 10 caractères et un espace. Je tente...
C'est ainsi que je tombe sur cette image :
Au suivant !
U.S. Cyber Command Valentine’s Day 2021 Crypto Challenge (Puzzle 5)