Có một miếng đệm một lần hoạt động như sau:
đưa ra thông báo "xin chào" và khóa "asdfg", nó tạo ra "hwoqu". Nó chỉ hoạt động với 26 chữ cái tiếng Anh. Đầu ra là (h(7) + a(0))%26 = h(7), (e(4) + s(18))%26 = w(22) v.v.
Vì vậy, tôi có hai bản mã được tạo như trên bằng cách sử dụng một khóa duy nhất cho cả hai bản mã. Tôi được cho là có thể bẻ khóa các văn bản đơn giản mà không cần truy cập vào khóa.
Thủ tục để làm điều này là gì?
Cho đến nay, tôi đã thử XOR hai văn bản mật mã, tức là đối với mỗi chữ cái trong c1 và c2, hãy chuyển đổi thành giá trị số tương ứng của nó và XOR chữ cái thứ n của c1 với chữ cái thứ n của c2, để tạo thành c3.
Sau đó, tôi phải sử dụng từ đó với một từ đoán như "the" bằng cách loại bỏ từ đó chống lại c3.Đây là phần mà tôi bị mắc kẹt, tôi không biết những gì tôi phải tìm kiếm ở đây.
Chỉnh sửa:
Vì vậy, vì nó là phần bổ sung chứ không phải XOR, nên đây là những gì tôi đã viết:
c1 = "ujhantamawmuzvgkterrykub"
c2 = "bpgxmkymbbpyxmogoehdefgh"
pad mã hóa và giải mã:
def oneTimePad(tin nhắn, mã):
message_out = ""
cho tôi trong phạm vi (len (tin nhắn)):
index = (letters.find(message[i]) + alphabet.find(code[i]))%26
message_out+= chữ cái[chỉ mục]
trả lại thông báo_out
def otpDecrypt(mật mã, khóa):
message_out = ""
cho tôi trong phạm vi (len (phím)):
chỉ số = (letters.find(cipher[i]) - alphabet.find(key[i]))%26
message_out+= chữ cái[chỉ mục]
trả lại thông báo_out
bánh quy giòn:
def padCracker(m1, m2, đoán): # m1, m2 danh sách các số
m3 = list(map(lambda x, y: (x + y) %26, m1, m2))
kiểm tra = [] # m3 + đoán mod 26
GuessNum = danh sách (bản đồ (lambda c : alphabet.find(c), đoán))
cho tôi trong phạm vi (len (m3) - len (đoán) +1):
kiểm tra = danh sách (bản đồ (lambda x, y: (x+y)%26, GuessNum, m3[i: i+len(đoán)]))
in (kiểm tra, kết thúc = "")
chuỗi = ""
cho num trong kiểm tra:
chuỗi += chữ cái[num]
in (chuỗi)
in(padCracker(m1,m2, "bcd"))
điều này gợi ý rằng c1 bắt đầu bằng "the" và c2 bằng "and" với khóa "bcd" nhưng tôi không biết cách lấy phần còn lại của khóa