Существует одноразовый блокнот, который работает следующим образом:
при наличии сообщения «hello» и ключа «asdfg» он производит «hwoqu». Он работает только с 26 английскими буквами. Результат: (h(7) + a(0))%26 = h(7), (e(4) + s(18))%26 = w(22) и т.д.
Итак, у меня есть два зашифрованных текста, созданных, как указано выше, с использованием одного ключа для обоих зашифрованных текстов. Я должен уметь взламывать простые тексты без доступа к ключу.
Какова процедура для этого?
До сих пор я пытался выполнить XOR над двумя зашифрованными текстами, то есть для каждой буквы в c1 и c2 преобразовать в соответствующее числовое значение и XOR n-й буквы c1 с n-й буквой c2, чтобы сгенерировать c3.
Затем я должен использовать это с угадывающим словом, таким как «the», заставляя это против c3.Это та часть, где я застрял, я не знаю, что я должен искать здесь.
Редактировать:
Итак, поскольку это дополнение, а не XOR, вот что я написал:
c1 = "уджхантамузвгктеррикуб"
c2 = "bpgxmkymbbpyxmogoehdefgh"
клавиатурное шифрование и дешифрование:
def oneTimePad (сообщение, код):
сообщение_выход = ""
для i в диапазоне (len (сообщение)):
индекс = (letters.find (сообщение [i]) + Letters.find (код [i]))% 26
message_out+= буквы[индекс]
вернуть message_out
def otpDecrypt (шифр, ключ):
сообщение_выход = ""
для i в диапазоне (длина (ключ)):
index = (letters.find(шифр[i]) - Letters.find(ключ[i]))%26
message_out+= буквы[индекс]
вернуть message_out
взломщик:
def padCracker(m1, m2, предположения): # m1, m2 список чисел
m3 = список (карта (лямбда x, y: (x + y)% 26, m1, m2))
check = [] # m3 + мод предположения 26
угадайЧисло = список(карта(лямбда с: буквы.найди(с), угадай))
для i в диапазоне (len(m3)-len(предположение)+1):
проверка = список (карта (лямбда x, y: (x + y)% 26, предположениеЧисло, m3 [i: i + len (предположение)]))
распечатать (проверить, конец = "")
строка = ""
для номера в чеке:
строка += буквы [число]
печать (строка)
печать (padCracker (m1, m2, "BCD"))
это говорит о том, что c1 начинается с «the», а c2 с «and» с ключом «bcd», но я не знаю, как получить остальную часть ключа