BabyEncryption
- Catégorie : Crypto
- Difficulté : Intermédiaire (à vérifier)
Résumé
Petit challenge de chiffrement par transformation linéaire sur les octets : chaque octet m est chiffré par (123*m + 18) % 256.
Fichiers fournis
chall.py— script d'exemple d'encryptiondecrypt.py— script d'exemple de déchiffrementmsg.enc— message chiffré (hex)
Description
Le chiffrement applique une fonction affine sur chaque octet : c = (123 * m + 18) mod 256. Pour déchiffrer, il faut utiliser l'inverse multiplicatif de 123 modulo 256 et inverser la translation.
Solution (rapide)
- Trouver l'inverse multiplicatif de
123modulo256. Ici l'inverse est179car(123 * 179) % 256 == 1. - Appliquer la formule inverse sur chaque octet chiffré
c: m = ((c - 18) * 179) % 256. - Reconstruire la chaîne à partir des octets décodés (UTF-8 si approprié).
Exemple de fonction de déchiffrement (déjà présent dans le dépôt) :
def decryption(ct_hex):
ct_bytes = bytes.fromhex(ct_hex)
msg = [((b - 18) * 179) % 256 for b in ct_bytes]
return bytes(msg).decode('utf-8')
# Usage : lire `msg.enc` puis appeler decryption
Indices
- Chercher l'inverse modulaire de
123modulo256. - Tester la sortie sur un interpréteur Python avant d'écrire un script complet.
Références
- Introduction aux inverses modulaires et arithmétique modulaire.
Contenu original
import string
#from secret import MSG
def encryption(msg):
ct = []
for char in msg:
ct.append((123 * char + 18) % 256)
return bytes(ct)
ct = encryption(MSG)
f = open('./msg.enc','w')
f.write(ct.hex())
f.close()
def decryption(ct_hex):
ct_bytes = bytes.fromhex(ct_hex)
msg = []
for encrypted_char in ct_bytes:
msg.append(((encrypted_char - 18) * 179) % 256)
return bytes(msg).decode('utf-8')
# Exemple de donnée chiffrée fournie
encrypted_message_hex = "6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921"
original_message = decryption(encrypted_message_hex)
print(original_message)