from pwn import xor
cipher = bytes.fromhex('...')
key = b'KEY'print(xor(cipher, key))
# Clé de 1 octet : tester toutes les valeursfor k inrange(256):
out = xor(cipher, bytes([k]))
ifb'flag'in out orb'CTF'in out:
print(k, out)
python
from pwn import xor
from string import printable
defscore(data):
returnsum(chr(c) in printable orchr(c) in'\n\t'for c in data)
# Retrouver la clé répétée octet par octet, pour chaque longueur candidate
best = Nonefor size inrange(1, 33):
key = bytes(
max(range(256), key=lambda k: score(xor(cipher[i::size], bytes([k]))))
for i inrange(size)
)
plain = xor(cipher, key)
if best isNoneor score(plain) > best[0]:
best = (score(plain), key, plain)
print(best[1], best[2])
# Détecter ECB : blocs identiques
blocks = [cipher[i:i+16] for i inrange(0, len(cipher), 16)]
print(len(blocks), len(set(blocks)), 'blocs uniques')
# Byte-at-a-time : envoyer des préfixes choisisfor pad inrange(16):
payload = b'A' * pad
# comparer les blocs avec un oracle d'encryption
# Padding oracle : modifier le bloc précédent pour contrôler le padding# P_i = D(C_i) XOR C_{i-1}# Pour obtenir un octet, brute force C_{i-1}[j] jusqu'à un padding valide
bash
# Outils
pip install paddingoracle
# Ou implémentation maison : 256 essais par octet, détecter "invalid padding"