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

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, применялись особые правила, но сами правила он не описывает.