HackTheBox Writeup

BabyEncryption

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'encryption
  • decrypt.py — script d'exemple de déchiffrement
  • msg.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)

  1. Trouver l'inverse multiplicatif de 123 modulo 256. Ici l'inverse est 179 car (123 * 179) % 256 == 1.
  2. Appliquer la formule inverse sur chaque octet chiffré c : m = ((c - 18) * 179) % 256.
  3. 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 123 modulo 256.
  • 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)