- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Дополнительная литература 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/.