มีแผ่นเวลาเดียวซึ่งทำงานดังนี้:
ได้รับข้อความ "สวัสดี" และคีย์ "asdfg" มันสร้าง "hwoqu" ใช้ได้กับตัวอักษรภาษาอังกฤษ 26 ตัวเท่านั้น ผลลัพธ์คือ (h(7) + a(0))%26 = h(7), (e(4) + s(18))%26 = w(22) เป็นต้น
ดังนั้นฉันจึงมีข้อความเข้ารหัสสองรายการที่สร้างขึ้นตามด้านบนโดยใช้คีย์เดียวสำหรับข้อความเข้ารหัสทั้งสอง ฉันควรจะสามารถถอดรหัสข้อความธรรมดาโดยไม่จำเป็นต้องเข้าถึงคีย์
ขั้นตอนในการทำเช่นนี้คืออะไร?
จนถึงตอนนี้ ฉันได้ลอง XORing ข้อความรหัสสองตัว เช่น สำหรับตัวอักษรแต่ละตัวใน c1 และ c2 ให้แปลงเป็นค่าตัวเลขที่สอดคล้องกัน และ XOR ตัวอักษรตัวที่ n ของ c1 ด้วยตัวอักษรตัวที่ n ของ c2 เพื่อสร้าง c3
ฉันควรใช้สิ่งนั้นกับคำเดาเช่น "the" โดย exoring กับ c3นี่คือส่วนที่ฉันติดอยู่ ฉันไม่รู้ว่าฉันควรจะมองหาอะไรที่นี่
แก้ไข:
เนื่องจากเป็นการเพิ่มมากกว่า XOR นี่คือสิ่งที่ฉันเขียน:
c1 = "ujhantamawmuzvgkterrykub"
c2 = "bpgxmkymbbpyxmogoehdefgh"
แผ่นเข้ารหัสและถอดรหัส:
def oneTimePad (ข้อความ รหัส):
message_out = ""
สำหรับฉันในช่วง (len (ข้อความ)):
ดัชนี = (letters.find(ข้อความ[i]) + letter.find(code[i]))%26
message_out+= ตัวอักษร[ดัชนี]
ส่งคืน message_out
def otpDecrypt (รหัส, คีย์):
message_out = ""
สำหรับฉันในช่วง (len (คีย์)):
ดัชนี = (letters.find(cipher[i]) - letter.find(key[i]))%26
message_out+= ตัวอักษร[ดัชนี]
ส่งคืน message_out
แครกเกอร์:
def padCracker(m1, m2, เดา): # m1, m2 รายการตัวเลข
m3 = รายการ(แผนที่(แลมบ์ดา x, y: (x + y) %26, m1, m2))
ตรวจสอบ = [] # m3 + เดา mod 26
GuessNum = รายการ (แผนที่ (แลมบ์ดา c : ตัวอักษร. ค้นหา (c), เดา))
สำหรับผมในช่วง(len(m3)-len(เดา)+1):
ตรวจสอบ = รายการ (แผนที่ (แลมบ์ดา x, y: (x+y)%26, GuessNum, m3[i: i+len(เดา)]))
พิมพ์(กาเครื่องหมาย, สิ้นสุด="")
สตริง = ""
สำหรับจำนวนในการตรวจสอบ:
สตริง += ตัวอักษร[จำนวน]
พิมพ์ (สตริง)
พิมพ์ (padCracker (m1,m2, "bcd"))
สิ่งนี้ชี้ให้เห็นว่า c1 เริ่มต้นด้วย "the" และ c2 ด้วย "และ" ด้วยคีย์ "bcd" แต่ฉันไม่รู้ว่าจะรับคีย์ที่เหลือได้อย่างไร