XOR — Chiffrement simple et attaques
★★★★★
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..."))