On recopie les deux listes ...
u=['99', 'f0', '11', '31', '3f', 'f6', '9d', '52']
v=['89', 'fa', '1f', '34', '38', 'eb', '8c', '59']
On convertit les chaînes hexadécimales en entiers
u = [int(x,16) for x in u]
v = [int(x,16) for x in v]
Et on calcule le XOR des deux cryptogrammes, qui est aussi celui des deux textes clairs :
xx = [u[i]^v[i] for i in range(len(u))]
On récupère la liste de mots anglais de 8 lettres en minuscules :
with open('/usr/share/dict/words','r') as dico:
dd = [w.rstrip().lower() for w in dico]
dd8=[list(map(ord,w)) for w in dd if len(w)==8]
Et on va calculer le XOR de chacun d'eux avec xx
. Si le résultat est dans le dictionnaire, on a probablement trouvé un des mots.
def f(w):
return [w[i]^xx[i] for i in range(8)]
res = [w for w in dd8 if f(w) in dd8]
print (len(res))
print (''.join(map(chr,res[0])))
print (''.join(map(chr,res[1])))