Există un pad unic care funcționează după cum urmează:
dat mesajul „hello” și cheia „asdfg”, acesta produce „hwoqu”. Funcționează doar cu cele 26 de litere engleze. Ieșirea este (h(7) + a(0))%26 = h(7), (e(4) + s(18))%26 = w(22) etc.
Deci am două texte cifrate create ca mai sus folosind o singură cheie pentru ambele texte cifrate. Ar trebui să pot sparge textele simple fără a avea nevoie de acces la cheie.
Care este procedura pentru a face asta?
Până acum, am încercat să trimit XOR cele două texte cifrate, adică pentru fiecare literă din c1 și c2, convertiți la valoarea sa numerică corespunzătoare și XOR a n-a literă a lui c1 cu a n-a literă a c2, pentru a genera c3.
Apoi ar trebui să-l folosesc cu un cuvânt ghicitor ca „the” exorându-l împotriva c3.Aceasta este partea în care sunt blocat, nu știu ce ar trebui să caut aici.
Editați | ×:
Deci, deoarece este mai degrabă o adăugare decât un XOR, iată ce am scris:
c1 = „ujhantamawmuzvgkterrykub”
c2 = „bpgxmkymbbpyxmogoehdefgh”
pad criptează și decriptează:
def oneTimePad(mesaj, cod):
message_out = ""
pentru eu în rază (len (mesaj)):
index = (litere.găsește(mesaj[i]) + litere.găsește(cod[i]))%26
mesaj_out+= litere[index]
return message_out
def otpDecrypt(cifr, cheie):
message_out = ""
pentru i în interval (len (cheie)):
index = (litere.găsiți(cifr[i]) - litere.găsiți(cheie[i]))%26
mesaj_out+= litere[index]
return message_out
biscuitul:
def padCracker(m1, m2, ghici): # m1, m2 listă de numere
m3 = listă(hartă(lambda x, y: (x + y) %26, m1, m2))
verifica = [] # m3 + ghici mod 26
guessNum = listă(hartă(lambda c: letters.find(c), guess))
pentru i în interval(len(m3)-len(ghici)+1):
verificare = listă(hartă(lambda x, y: (x+y)%26, guessNum, m3[i: i+len(ghici)]))
print(verificare, sfârşit="")
șir = ""
pentru num in check:
șir += litere[num]
print(șir)
print(padCracker(m1,m2, "bcd"))
asta sugerează că c1 începe cu „the” și c2 cu „și” cu cheia „bcd”, dar nu știu cum să obțin restul cheii