Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воган Ли - Python для хакеров (Библиотека программиста) - 2023.pdf
Скачиваний:
5
Добавлен:
07.04.2024
Размер:
14.76 Mб
Скачать

Дополнительная литература      131

Для конспирации вам не следует сохранять открытый или шифрованный текст в файле. Лучше воспользуйтесь вырезанием из оболочки и вставкой. Только не забывайте потом копировать в буфер какую-нибудь безобидную информацию, чтобы не оставить уличающих вас следов.

Если вы захотите сделать программу поизящнее, то можете перекопировать текст в буфер прямо из Python с помощью модуля pyperclip, написанного Элом Свейгартом. Подробности — на странице https://pypi.org/project/pyperclip/.

Итоги

В этой главе мы поработали с defaultdic и Counter из модуля collections, choice() из модуля random, а также replace(), enumerate(), ord() и repr() из Python Standard Library. В результате у нас получилась программа шифрования, основанная на технике одноразового блокнота, которая производит невзламываемые криптограммы.

Дополнительная литература

Роман «Ключ к Ребекке», написанный Кеном Фоллеттом, по праву стал бестселлером — исторические детали, точные описания Каира во время Второй мировой войны и захватывающая шпионская история не оставляют читателя равнодушным.

Книга «The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography»1 (Anchor, 2000) Саймона Сингха (Simon Singh) — увлекательный обзор развития криптографии на протяжении нескольких эпох, в том числе и подробное описание применения одноразового блокнота.

Если вам понравилось работать с шифрами, прочитайте книгу «Cracking Codes with Python»2 (No Starch Press, 2018), написанную Элом Свейгартом. Предназначенная для тех, кто только начинает изучение как криптографии, так и Python, эта книга описывает многие виды шифрования, включая обратное, шифр Цезаря, перестановочный шифр, подстановочный, аффинный и шифр Виженера.

В книге «Impractical Python Projects: Playful Programming Activities to Make You Smarter»3 (No Starch Press, 2019) Ли Вогана (Lee Vaughan) вы найдете информацию о дополнительных шифрах, таких как Union route cipher (ва-

1

Сингх С. «Книга шифров. Тайная история шифров и их расшифровки».

2

Свейгарт Э. «Криптография и взлом шифров на Python».

3

Воган Л. «Непрактичный Python. Занимательные проекты для тех, кто хочет поумнеть».

132      Глава4. Отправкасуперсекретныхсообщенийспомощьюкнижногошифра

риация маршрутного шифра), шифре ограждения рельсов и нулевом шифре Треваньона, а также о технике письма с помощью невидимых электронных чернил.

Практический проект: составление

графика символов

Если на вашей машине установлена matplotlib (инструкции содержатся на с. 31 раздела «Установка библиотек Python»), вы сможете с помощью столбчатой диаграммы визуально представить частотность доступных в романе «Затерянный мир» символов. Это дополнит вывод в оболочке каждого символа и числа его вхождений, реализуемый программой rebecca.py.

Интернет изобилует образцами кода для графиков matplotlib, так что достаточно вбить в поиске «создание простой гистограммы matplotlib». Прежде чем строить диаграмму, следует упорядочить количества в порядке уменьшения.

Мнемоника для запоминания наиболее распространенных букв английского языка звучит как «etaoin». Если составить гистограмму в порядке убывания, то можно видеть, что датасет «Затерянного мира» не исключение (рис. 4.2).

Заметьте, что самый распространенный символ — пробел. Это упрощает шифрование пробелов, что еще больше усложняет криптоанализ.

Рис. 4.2. Частотность использования символов в цифровой версии «Затерянного мира»

Практический проект: отправка секретов...      133

Решение под названием practice_barchart.py вы найдете в приложении к книге или на ее сайте.

Практический проект: отправка секретов

шифром времен Второй мировой войны

Немецкие войска в Северной Африке во время Второй мировой войны действительно использовали роман «Ребекка» в качестве ключа к книжному коду. Вместо кодирования сообщения буква за буквой предложения составлялись из отдельных слов книги, которые обозначались номером страницы, строкой и положением в этой строке.

Скопируйте и отредактируйте программу rebecca.py, чтобы в ней использовались не буквы, а слова. В качестве начальной подсказки я покажу, как с помощью спискового включения загружать текстовый файл в виде списка слов, а не символов:

with open('lost.txt') as f:

words = [word.lower() for line in f for word in line.split()] words_no_punct = ["".join(char for char in word if char.isalpha())

for word in words]

print(words_no_punct[:20]) # Вывести первые 20 слов для проверки работоспособности

Вывод должен получиться таким:

['i', 'have', 'wrought', 'my', 'simple', 'plan', 'if', 'i', 'give', 'one', 'hour', 'of', 'joy', 'to', 'the', 'boy', 'whos', 'half', 'a', 'man']

Обратите внимание, что вся пунктуация, включая апострофы, удалена. В сообщениях будет соблюдаться это условие.

Вам также потребуется обработать слова, такие как имена собственные и географические названия, которые не встречаются в «Затерянном мире». Для этого мы применим «режим первой буквы», когда получатель использует только первую букву каждого слова между флагами. В качестве флагов обычно пускают в ход часто встречающиеся слова, например a и the, в удвоенном виде. Измените их использование, чтобы упростить определение начальных и конечных флагов. В этом случае a a указывает начало режима первой буквы, а the the — его окончание. К примеру, для обработки фразы Sidi Muftah with ten tanks сначала прогоните ее как есть, чтобы определить недостающие слова.

Введите открытый или шифрованный текст: sidi muftah with ten tanks

Введите 'encrypt' или 'decrypt': encrypt

Смещение (1-365) = 5

Введите название файла с его расширением: lost.txt

134      Глава4. Отправкасуперсекретныхсообщенийспомощьюкнижногошифра

Слова sidi нет в словаре. Слова muftah нет в словаре. Слова tanks нет в словаре.

шифрованный текст =

[23371, 7491]

дешифрованный открытый текст = with ten

Определив недостающие слова, перефразируйте сообщение, чтобы записать их в режиме первой буквы. В сниппете ниже я выделил первые буквы серым:

Введите открытый или шифрованный текст: a a so if do in my under for to all he the the

with ten a a tell all night kind so the the

Введите 'encrypt' или 'decrypt': encrypt

Смещение (1-365) = 5

Введите название файла с его расширением: lost.txt

шифрованный текст =

 

 

 

[29910,

70641, 30556, 60850, 72292,

32501,

6507, 18593, 41777, 23831, 41833,

16667,

32749, 3350, 46088, 37995, 12535,

30609, 3766, 62585, 46971, 8984,

44083,

43414, 56950]

 

 

 

дешифрованный открытый текст =

a a so if do in my under for to all he the the with ten a a tell all night kind so the the

В «Затерянном мире» символ a используется 1864 раза и the — 4442 раза. Если придерживаться коротких сообщений, то ключи повторяться не должны. В противном случае вам придется использовать несколько флаговых символов или отключить функцию check_for_fail() и согласиться на некоторые повторения.

Можете смело придумать собственный метод обработки проблемных слов. Будучи отличными организаторами, немцы однозначно имели нечто на уме, иначе бы изначально не рассматривали использование книжного шифра.

Простое решение этой задачи с использованием метода первой буквы под названием practice_WWII_words.py находится в приложении к книге или на странице https://nostarch.com/real-world-python/.