Solution de bidons59 pour Touillette

intro misc

26 août 2025

Principe de touillage

On remarque que le touillage se fait en deux étapes

Étape 1

x = "".join([
    flag[-8::-8],
    flag[-7::-8],
    flag[-6::-8],
    flag[-5::-8],
    flag[-4::-8],
    flag[-3::-8],
    flag[-2::-8],
    flag[-1::-8],
])

Étape 2

print(x[1::2] + x[0::2])

Flag simple

On se fabrique un flag simple

>>> az=''.join([chr(ord('a')+i) for i in range(26)])
>>> AZ=''.join([chr(ord('A')+i) for i in range(26)])
>>> ZeroNeuf=''.join([chr(ord('0')+i) for i in range(10)])
>>> flag = az + AZ + ZeroNeuf + '@!'
>>> print(flag)
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@!'
>>> print(len(flag))
64

Test du slincing

Format du slicing : [start:fin:step], donc [::-1] correspond à la chaîne parcourue du début à la fin, en remontant caractère par caractère :

>>> flag[::-1]
'!@9876543210ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba'

On commence par le 8e caractère de la fin et on remonte de 8 en 8 :

>>> flag[-8::-8]
'4WOGyqia'

Sortie de la première étape en version liste pour faciliter la lecture :

>>> l = [
    flag[-8::-8],
    flag[-7::-8],
    flag[-6::-8],
    flag[-5::-8],
    flag[-4::-8],
    flag[-3::-8],
    flag[-2::-8],
    flag[-1::-8],
    ]
>>> for ligne in l:
   ...:     print(ligne)
4WOGyqia
5XPHzrjb
6YQIAskc
7ZRJBtld
80SKCume
91TLDvnf
@2UMEwog
!3VNFxph

On construit la chaîne de caractères :

>>> x="".join(l)
>>> print(x)
'4WOGyqia5XPHzrjb6YQIAskc7ZRJBtld80SKCume91TLDvnf@2UMEwog!3VNFxph'

Deuxiéme étape : on lit les caractères de deux en deux en commençant par le 2e caractère :

>>> x[1::2]
'WGqaXHrbYIscZJtd0Kue1Lvf2Mwg3Nxh'

Puis en commençant par le premier

>>> x[0::2]
'4Oyi5Pzj6QAk7RBl8SCm9TDn@UEo!VFp'

On concatène

>>> y = x[1::2]+x[0::2]
>>> print(y)
'WGqaXHrbYIscZJtd0Kue1Lvf2Mwg3Nxh4Oyi5Pzj6QAk7RBl8SCm9TDn@UEo!VFp'

Principe inverse

il faut lire le 32e caractère, puis le premier puis le 33e, puis le 2 eme etc

>>> ''.join([z[i+32]+z[i] for i in range(32)])
'4WOGyqia5XPHzrjb6YQIAskc7ZRJBtld80SKCume91TLDvnf@2UMEwog!3VNFxph'

On lit par paquets de 8

>>> [z[8*k:8*k+8] for k in range(8)]
['4WOGyqia',
 '5XPHzrjb',
 '6YQIAskc',
 '7ZRJBtld',
 '80SKCume',
 '91TLDvnf',
 '@2UMEwog',
 '!3VNFxph']

on commence par le dernier caractère, ligne par ligne

>>> [z[7+k*8] for k in range(8)]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

on recommence avec le caractère précédent :

>>> [z[6+k*8] for k in range(8)]
['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']

pour la chaîne complète :

>> [[z[j+k*8] for k in range(8)] for j in range(7,-1,-1)]
[['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
 ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'],
 ['q', 'r', 's', 't', 'u', 'v', 'w', 'x'],
 ['y', 'z', 'A', 'B', 'C', 'D', 'E', 'F'],
 ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'],
 ['O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V'],
 ['W', 'X', 'Y', 'Z', '0', '1', '2', '3'],
 ['4', '5', '6', '7', '8', '9', '@', '!']]

On concatène les lignes :

>>> ["".join([z[j+k*8] for k in range(8)]) for j in range(7,-1,-1)]
['abcdefgh',
 'ijklmnop',
 'qrstuvwx',
 'yzABCDEF',
 'GHIJKLMN',
 'OPQRSTUV',
 'WXYZ0123',
 '456789@!']

Le tout :

>>> "".join(["".join([z[j+k*8] for k in range(8)]) for j in range(7,-1,-1)])
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@!'

On retrouve notre flag simple

Dénoument

>>> f='Z2yFm7bCjR6SMWOCSiw{wqKWoJxTtxP4Hf74mQZ4qmghcu1mdX9HND7u8oxF}JsR'

Étape 2 :

>>> f2 = ''.join([f[i+32]+f[i] for i in range(32)])
>>> print(f2)
'HZf27y4FmmQ7Zb4CqjmRg6hScMuW1OmCdSXi9wH{NwDq7KuW8ooJxxFT}tJxsPR4'

Étape 1 :

>>> ''.join(["".join([f2[j+k*8] for k in range(8)]) for j in range(7,-1,-1)])
'FCSC{WT444hmHuFRyb6OwKxP7Zg197xs27RWiqJxfQmuXDoJZmjMSwotHmqcdN8'