XOR — Chiffrement simple et attaques

XOR CTF

Propriétés XOR

A XOR A = 0
A XOR 0 = A
A XOR B XOR B = A   (auto-inverse)

c = p XOR k
p = c XOR k  (même opération !)

Crib Dragging — même clé deux fois

# c1 = p1 XOR k
# c2 = p2 XOR k
# c1 XOR c2 = p1 XOR p2  (la clé disparaît !)

c1 = bytes.fromhex("...")
c2 = bytes.fromhex("...")
result = bytes(a^b for a,b in zip(c1,c2))
# Si on sait que p1 contient "the " à la pos 5
# XOR avec "the " -> obtenir p2 à cette position

Casser XOR single-byte

def crack_xor(ct):
    best = (0, 0, b"")
    for key in range(256):
        pt = bytes(b^key for b in ct)
        score = sum(c in b" etaoinETAOIN" for c in pt)
        if score > best[0]:
            best = (score, key, pt)
    return best[1], best[2]

key, plaintext = crack_xor(bytes.fromhex("1b37..."))