Шифровальщик · Шаг 4 из 4
Ключ по столбцам
В девятнадцатом веке отставной офицер заметил слабое место Виженера: ключ повторяется. Если длина ключа известна, шифровку можно разложить на столбцы — в первый каждая буква, что шифровалась первой буквой ключа, во второй — второй, и так далее. Каждый столбец зашифрован обычным Цезарем, а Цезаря вы уже умеете взламывать.
Что сделать
Найдите ключ Виженера известной длины: разложите буквы шифровки по столбцам и подберите сдвиг каждого столбца вашим шагом 3.
Что приходит
shifrovka— текст, зашифрованный Виженеромdlina— длина ключа; букв в шифровке не меньшеpodobrat_sdvig— ваш шаг 3:podobrat_sdvig(stolbec, chastoty_yazyka)даёт сдвиг столбцаchastoty_yazyka— словарь весов букв; передайте его вpodobrat_sdvigкак есть
Что вернуть
Ключ — строку из dlina строчных букв: буква с номером сдвига каждого столбца, по порядку.
Допишите функцию klyuch_vizhenera в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Утилита зовёт klyuch_vizhenera на команду «взломать» для каждой длины ключа от 1 до 12 и выбирает ключ, при котором расшифровка больше всего похожа на русский текст. Решите шаг — и записку можно прочитать без ключа.
Шифровка «Где вы, бабушка?» и длина 3. Русские буквы подряд, строчными, — «гдевыбабушка»; столбцы: «гваш», «дыбк», «ебуа». В проверке вместо настоящего шага 3 стоит игрушка — она отвечает номером первой буквы столбца: г — 3, д — 4, е — 5. Буквы с этими номерами — ключ «где».
Возьмите из шифровки только русские буквы алфавита абвгдеёжзийклмнопрстуфхцчшщъыьэюя (заглавные — строчными), по порядку. Это и есть то, что шифровалось ключом: пробелы и знаки ключа не тратили (шаг 1).
Столбец номер j (с нуля, j от 0 до dlina − 1) — буквы с местами j, j + dlina, j + 2·dlina… в этой последовательности, склеенные в строку. Для каждого столбца позовите podobrat_sdvig(stolbec, chastoty_yazyka); буква алфавита с этим номером — очередная буква ключа.
Верните ключ строкой. Ничего, кроме переданного podobrat_sdvig, для подбора сдвига звать не нужно.
Образцовый тест целиком
podobrat_sdvig = lambda stolbec, chastoty_yazyka: "абвгдеёжзийклмнопрстуфхцчшщъыьэюя".index(stolbec[0])
klyuch_vizhenera("Где вы, бабушка?", 3, podobrat_sdvig, {})
'где'
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.