- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему 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. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
4
Отправка суперсекретных сообщений с помощью книжного шифра
«Ключ к Ребекке» — это роман-бестселлер Кена
Фоллетта, который получил широкое признание
критиков. Его действие происходит в Каире во время
Второй мировой войны и основано на реальных собы- тиях. Сюжет повествует о преследовании нацистского шпиона офицером британской разведки. Название романа относится к использованной шпионом системе шифрования,
вкоторой ключом выступал известный готический роман «Ребекка», написанный Дафной дю Морье. «Ребекка» считается одним из величайших романов XX века, и германские военные действительно использовали его во время войны
вкачестве кодовой книги.
Шифр «Ребекка» представляет собой разновидность одноразового шифровального блокнота, невзламываемой техники шифрования, когда размер требуемого ключа не меньше самого отправляемого сообщения. Отправитель и получатель располагают копией блокнота, верхнюю страницу которого после однократного использования вырывают и уничтожают.
Одноразовые блокноты обеспечивают абсолютную безопасность — взломать такой шифр не получится даже с помощью квантового компьютера. Несмотря
Одноразовый блокнот 115
на это, у таких блокнотов есть ряд недостатков, которые не позволяют использовать их повсеместно. Основные проблемы — это необходимость безопасно транспортировать и доставлять блокноты отправителю и получателю, хранить их, а также ручное кодирование и декодирование сообщений.
В «Ключе к Ребекке» для использования шифра обе стороны должны знать правила шифрования и иметь в наличии одинаковую редакцию книги. В этой главе мы преобразуем описанный в романе ручной метод в более безопасную и удобную в использовании цифровую технику. Вы поработаете с полезными функциями из Python Standard Library и модулями collections и random. Вы также немного больше узнаете о Юникоде — стандарте, используемом для обеспечения универсальной совместимости таких символов, как буквы и числа, между всеми платформами, устройствами и приложениями.
Одноразовый блокнот
Одноразовый блокнот (OTP, One-Time-Pad) — это упорядоченный набор листов с напечатанными на них случайными числами, обычно объединенными в группы по пять (рис. 4.1). Чтобы блокноты было удобно прятать, их делают такими маленькими, что иногда без увеличительного стекла и не прочтешь. Несмотря на архаичный вид, такие блокноты позволяют создавать самые безопасные шифры в мире, поскольку каждая буква шифруется уникальным ключом. В результате техники криптоанализа, например анализ частоты появления букв, для них просто не работают.
73983 91543 74556 01283
24325 88622 92061 02865
22764 47630 14408 80067
13154 81950 11992 84763
46381 99463 49155 40241
98484 77841 03878 14645
11774 73919 83946 40337
12396 26327 76612 12471
18432 41657 93893 10041
77381 39150 47951 83242
34211 02998 15002 08183
Рис. 4.1. Пример страницы одноразового блокнота
116 Глава4. Отправкасуперсекретныхсообщенийспомощьюкнижногошифра
Чтобы зашифровать сообщение с помощью одноразового блокнота на рис. 4.1, мы начнем с присвоения каждой букве алфавита числа из двух цифр. A будет равна 01, В — 02 и т. д., как показано в таблице ниже.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
|||||||||||||||||||||||||
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
Далее преобразуем буквы короткого сообщения в числа:
H |
E |
R |
E |
|
K |
I |
T |
T |
Y |
|
K |
I |
T |
T |
Y |
Оригинальное сообщение |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
08 |
05 |
18 |
05 |
|
11 |
09 |
20 |
20 |
25 |
|
11 |
09 |
20 |
20 |
25 |
Буквы, преобразованные в числа |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Начиная с верхней левой части страницы и читая слева направо, мы присваиваем числовую пару (ключ) каждой букве и прибавляем ее к числовому значению этой буквы. Вы будете работать с парами чисел с основанием 10, поэтому при получении суммы больше 100 используйте модульную арифметику для усечения значения до последних двух цифр (103 станет 03). Числа в затененных ячейках таблицы ниже представляют результат модульной арифметики.
H |
E |
R |
E |
|
K |
I |
T |
T |
Y |
|
K |
I |
T |
T |
Y |
Оригинальное сообщение |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
08 |
05 |
18 |
05 |
|
11 |
09 |
20 |
20 |
25 |
|
11 |
09 |
20 |
20 |
25 |
Буквы, преобразованные в числа |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
98 |
39 |
15 |
|
43 |
74 |
55 |
60 |
12 |
|
83 |
24 |
32 |
58 |
86 |
Из OTP отправителя |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
03 |
57 |
20 |
|
54 |
83 |
75 |
80 |
37 |
|
94 |
33 |
52 |
78 |
11 |
Криптограмма |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Последняя строка в таблице представляет криптограмму. Обратите внимание, что символы KITTY, повторяющиеся в чистом тексте, не повторяются в зашифрованном. Каждый шифр KITTY уникален.
Чтобы расшифровать криптограмму обратно в обычный текст, получатель использует такую же страницу из идентичного одноразового блокнота. Он располагает свои числовые пары под парами криптограммы и производит вычитание. Если получается отрицательное число, используется вычитание по модулю (прибавление 100 к значению криптограммы перед вычитанием). В завершение полученные числовые пары преобразуются обратно в буквы.
81 |
03 |
57 |
20 |
|
54 |
83 |
75 |
80 |
37 |
|
94 |
33 |
52 |
78 |
11 |
Криптограмма |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
98 |
39 |
15 |
|
43 |
74 |
55 |
60 |
12 |
|
83 |
24 |
32 |
58 |
86 |
Из OTP получателя |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
08 |
05 |
18 |
05 |
|
11 |
09 |
20 |
20 |
25 |
|
11 |
09 |
20 |
20 |
25 |
Преобразование числа в буквы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
H |
E |
R |
E |
|
K |
I |
T |
T |
Y |
|
K |
I |
T |
T |
Y |
Расшифрованный текст |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Шифр «Ребекка» 117
Чтобы гарантировать отсутствие повторов ключей, количество букв в сообщении не может превышать количество ключей в блокноте. Это вынуждает использовать короткие сообщения, которые проще шифровать/дешифровать и которые дают криптоаналитику меньше возможностей расшифровать сообщение. Помимо этих, есть и другие инструкции:
Прописывать числа словами (к примеру, TWO для 2).
Заканчивать предложения символом X вместо точки (к примеру, CALL AT NOONX).
Прописывать словами любую другую пунктуацию, которой нельзя избежать (к примеру, COMMA).
В конце исходного сообщения ставить XX.
Шифр «Ребекка»
В книге «Ключ к Ребекке» нацистский шпион использует разновидность одноразового блокнота. Идентичные редакции романа «Ребекка» приобретаются в Португалии. Два экземпляра шпион оставляет у себя, и еще два отправлены штабу фельдмаршала Роммеля в Северной Африке. Зашифрованные сообщения передаются по радио на заранее заданной частоте. В день отправляется не более одного сообщения, причем сеанс связи происходит строго в полночь.
Чтобы использовать ключ, шпион берет текущую дату — скажем, 28 мая 1942 года, и складывает день с годом (28 + 42 = 70). Так участники определяют, какую страницу романа нужно использовать в качестве страницы блокнота. Поскольку май — это пятый месяц в году, каждое пятое слово в предложении не учитывается. Так как использовать шифр «Ребекка» планировалось только относительно короткий промежуток времени в 1942 году, шпиону не нужно было беспокоиться о повторах в календаре, которые могли вызвать повторы в ключах.
Первым сообщением шпиона было: HAVE ARRIVED. CHECKING IN. ACKNOWLEDGE («Прибыл. Регистрируюсь. Подтвердите получение»). Начиная с верхней части страницы 70, он продолжал читать, пока не встретил букву H. Это был 10-й символ без учета каждой пятой буквы. Десятой в алфавите идет буква J, поэтому в криптограмме для представления буквы H он использовал именно ее. Следующая буква, A, шла через три буквы после H, значит, для ее шифра использовалась третья буква алфавита, С. Так продолжалось, пока не было зашифровано все сообщение. Как утверждает автор романа, к редким буквам, таким как X и Z, применялись особые правила, но сами правила он не описывает.