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'