Message lointain
Description du challenge
- Nom du CTF : 404CTF 2025
- Catégorie : Crypto
- Difficulté : Intro
- Date : Mai 2025
On nous donne l'algorithme suivant :
from flag import FLAG
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}-!"
n = len(charset)
def encrypt(message):
encrypted = []
for char in message:
if char in charset:
x = charset.index(char)
y = pow(2, x, n+1)
encrypted.append(charset[y])
return ''.join(encrypted)
print("ENCRYPTED FLAG : ", encrypt(FLAG))
# ENCRYPTED FLAG : 828x6Yvx2sOnzMM4nI2sQ
Analyse de l'algorithme
Pour chaque caractère du message :
- On calcule son index dans
charset - On élève 2 à la puissance de cet index modulo
n+1(oùnest la longueur decharset). - Le caractère chiffré est ensuite le caractère à l'index obtenu dans
charset.
Déchiffrage
Pour déchiffrer le message, nous devons inverser le processus.
Pour chaque caractère chiffré, nous devons :
- Trouver sa position
ydans le charset. - Tester toutes les valeurs possibles de
xtel quepow(2, x, n+1) == y(exponantiation modulaire). - Pour chaque
xtrouvé, nous pouvons récupérer le caractère original à l'indexxdanscharset.
On a alors la fonction Python suivante pour déchiffrer le message :
def decrypt():
encrypted_flag = "828x6Yvx2sOnzMM4nI2sQ"
decrypted = []
for char in encrypted_flag:
if char in charset:
y = charset.index(char)
found = False
for x in range(len(charset)):
if pow(2, x, n+1) == y:
decrypted.append(charset[x])
found = True
break
if not found:
decrypted.append('?')
return ''.join(decrypted)
print("DECRYPTED FLAG : ", decrypt())
FLAG
404CTF{C0nstEllAt!0n}