КулЛиб - Классная библиотека! Скачать книги бесплатно 

Криптография с секретным ключом [Фрэнк Рубин] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Фрэнк Рубин

Криптография с секретным ключом

Secret Key
Cryptography
CIPHERS, FROM SIMPLE TO UNBREAKABLE

FRANK RUBIN
Foreword by RANDALL K. NICHOLS

Криптография
с секретным ключом
Ш И Ф Р Ы – ОТ П РО СТ Ы Х ДО Н Е В С К Р Ы В А Е М Ы Х

Ф Р Э Н К РУ Б И Н
С предисловием Рэндалла К. Николса

Москва, 2023

УДК 004.382
ББК 32.973-018
Р82

Р82

Рубин Ф.
Криптография с секретным ключом / пер. с англ. А. А. Слинкина. – М.: ДМК
Пресс, 2022. – 386 с.: ил.
ISBN 978-5-97060-748-0
В книге объясняется, как создавать шифры с секретным ключом – от простых, для
которых хватает карандаша и бумаги, до очень сложных, применяемых в современной
компьютерной криптографии. Вы научитесь конструировать 30 невскрываемых шифров, измерять стойкость шифров и гарантированно обеспечивать их безопасность,
противостоять гипотетическим ультракомпьютерам будущего. А для развлечения
предлагается вскрыть несколько несложных мини-шифров.
Издание предназначено для профессиональных инженеров, специалистов по
информатике и криптографов-любителей.

УДК 004.382
ББК 32.973-018

Copyright © DMK Press 2022. Authorized translation of the English edition © 2022 Manning
Publications. This translation is published and sold by permission of Manning Publications, the owner
of all rights to publish and sell the same.
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой
бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

ISBN 978-1-6334-3979-5 (англ.)
ISBN 978-5-97060-748-0 (рус.)

© Manning Publications, 2022
© Перевод, оформление, издание, ДМК Пресс, 2022

Оглавление
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18




















Введение................................................................................................................... 24
Что такое криптография?. .................................................................................... 27
Предварительные сведения................................................................................. 41
Инструментарий криптографа............................................................................ 48
Подстановочные шифры. ..................................................................................... 61
Контрмеры. .............................................................................................................. 94
Перестановка..........................................................................................................109
Цилиндрический шифр Джефферсона.............................................................128
Фракционирование...............................................................................................135
Фракционирование переменной длины..........................................................163
Блочные шифры.....................................................................................................188
Принципы безопасного шифрования. .............................................................214
Потоковые шифры. ...............................................................................................246
Одноразовый блокнот..........................................................................................276
Матричные методы...............................................................................................292
Трехпроходный протокол....................................................................................326
Коды..........................................................................................................................342
Квантовые компьютеры............................................................................................

Содержание
Оглавление........................................................................................................... 5
Вступительное слово. ..................................................................................... 13
Предисловие....................................................................................................... 16
Благодарности.................................................................................................. 18
Об этой книге. .................................................................................................. 19
Об авторе.......................................................................................................... 22
Об иллюстрации на обложке. ........................................................................ 23

1
2

Введение....................................................................................................... 24

3

Предварительные сведения......................................................... 41

4

Инструментарий криптографа............................................. 48

Что такое криптография?......................................................... 27
2.1
2.2
2.3
2.4
2.5
2.6
2.7

3.1
3.2
3.3
3.4
3.5
3.6

4.1

Невскрываемые шифры..................................................................... 28
Виды криптографии............................................................................ 30
Симметричная и асимметричная криптография........................ 32
Блочные и потоковые шифры. ......................................................... 33
Механические и цифровые шифры................................................. 33
Зачем выбирать шифр с секретным ключом?.............................. 37
Зачем создавать собственный шифр?............................................. 38

Биты и байты. ....................................................................................... 41
Функции и операторы. ....................................................................... 42
Булевы операторы............................................................................... 43
Системы счисления............................................................................. 44
Простые числа. ..................................................................................... 46
Модульная арифметика. .................................................................... 46

Система оценивания........................................................................... 49

4.2
4.3
4.4
4.5
4.6

5

Подстановка.......................................................................................... 50

4.2.1

Коды Хаффмана.......................................................................... 51

4.5.1

Цепной генератор цифр. ........................................................... 56

4.6.1

Шифр Базери типа 4.................................................................. 59

Перестановка........................................................................................ 52
Фракционирование............................................................................. 53
Генераторы случайных чисел............................................................ 54
Полезные комбинации, бесполезные комбинации..................... 58

Подстановочные шифры............................................................... 61
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9

Простая подстановка. ......................................................................... 62
Перемешивание алфавита................................................................. 67
Номенклаторы...................................................................................... 70
Многоалфавитная подстановка. ...................................................... 70
Шифр Беласо. ........................................................................................ 71
Метод Касиски...................................................................................... 72
Индекс совпадения.............................................................................. 76
И снова об индексе совпадения. ...................................................... 77
Вскрытие многоалфавитного шифра.............................................. 78

5.9.1
5.9.2
5.9.3

Вскрытие шифра Беласо. .......................................................... 78
Вскрытие шифра Виженера...................................................... 81
Вскрытие общего многоалфавитного шифра......................... 83

5.10 Автоключ. .............................................................................................. 85
5.11 Бегущий ключ....................................................................................... 86
*5.12 Моделирование роторных машин................................................... 88

5.12.1 Однороторная машина............................................................. 90
5.12.2 Трехроторная машина.............................................................. 91
5.12.3 Восьмироторная машина.......................................................... 92

6

Контрмеры. .............................................................................................. 94
6.1
6.2
6.3
6.4
6.5
*6.6
6.7
6.8
6.9

7

Двойное шифрование......................................................................... 95
Null-символы........................................................................................ 96
Прерванный ключ................................................................................ 96
Омофоническая подстановка........................................................... 99

6.4.1

Шифр 5858..................................................................................100

Подстановка биграмм и триграмм.................................................100
Сокрытие сообщений в изображениях..........................................101
Добавление null-битов. .....................................................................103
Объединение нескольких сообщений. ..........................................105
Внедрение сообщения в файл..........................................................107

Перестановка.........................................................................................109
7.1
7.2

Маршрутная перестановка...............................................................109
Столбцовая перестановка.................................................................111

7.2.1
7.2.2

Cysquare......................................................................................115
Перестановка слов....................................................................116

Содержание

8

7.3
7.4
7.5
7.6
7.7
7.8
7.9

8
9

Двойная столбцовая перестановка.................................................117
Столбцовая перестановка с циклическим сдвигом....................118
Перестановка со случайными числами.........................................120
Селекторная перестановка...............................................................121
Перестановка с ключом.....................................................................122
Деление перестановки пополам. ....................................................125
Множественные анаграммы............................................................126

Цилиндрический шифр Джефферсона...............................128
8.1
8.2

Вскрытие при наличии известных слов........................................131
Вскрытие при наличии только шифртекста.................................132

Фракционирование............................................................................135
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
9.10
9.11
9.12
9.13

Квадрат Полибия.................................................................................136
Шифр Плейфера..................................................................................137

9.2.1
9.2.2

Вскрытие шифра Плейфера.....................................................139
Укрепление шифра Плейфера...................................................140

9.6.1

Bifid с сопряженной матрицей.................................................150

Шифр Two Square................................................................................142
Шифр Three Square. ............................................................................143
Шифр Four Square................................................................................146
Шифр Bifid.............................................................................................148

Диагональный Bifid............................................................................151
Квадраты 6×6........................................................................................152
Шифр Trifid...........................................................................................152
Шифр Three Cube. ...............................................................................154
Прямоугольные сетки........................................................................156
Шестнадцатеричное фракционирование.....................................157
Битовое фракционирование............................................................158

9.13.1 Шифр Cyclic 8×N. .......................................................................159

9.14 Другие виды фракционирования. ..................................................160
9.15 Повышение стойкости блоков.........................................................161

10

Фракционирование переменной длины.............................163
10.1
10.2
10.3
10.4
10.5

Шифр Morse3........................................................................................164
Моном-биномные шифры................................................................165
Периодические длины.......................................................................167
Подстановка Хаффмана. ...................................................................168
Таг-системы Поста..............................................................................171

10.5.1
10.5.2
10.5.3
10.5.4

Таги одинаковой длины.............................................................172
Таги разной длины.....................................................................174
Несколько алфавитов...............................................................176
Короткие и длинные перемещения..........................................177

10.6 Фракционирование в системах счисления по другим
основаниям...........................................................................................177
10.7 Сжатие текста.......................................................................................178

Содержание

9

10.7.1 Метод Лемпеля–Зива...............................................................178
10.7.2 Арифметическое кодирование.................................................181
10.7.3 Адаптивное арифметическое кодирование...........................184

11

Блочные шифры....................................................................................188
11.1 Подстановочно-перестановочная сеть..........................................189
11.2 Стандарт шифрования данных (DES).............................................191

11.3
11.4
11.5
11.6
11.7

11.2.1 Double DES..................................................................................192
11.2.2 Triple DES. ..................................................................................193
*11.2.3 Быстрая перестановка битов.................................................194
11.2.4 Неполные блоки. ........................................................................195

Умножение матриц. ...........................................................................196
Умножение матриц. ...........................................................................197
Улучшенный стандарт шифрования (AES)...................................198
Фиксированная подстановка и подстановка с ключом.............200
Инволютивные шифры. ....................................................................201

11.7.1
11.7.2
11.7.3
*11.7.4
11.7.5

Инволютивная подстановка...................................................202
Инволютивная многоалфавитная подстановка...................202
Инволютивная перестановка..................................................202
Инволютивный блочный шифр................................................203
Пример – шифр Poly Triple Flip. ...............................................204

11.8 Подстановки переменной длины. ..................................................204
11.9 Пульсирующие шифры......................................................................205
11.10 Сцепление блоков...............................................................................208

11.10.1 Многоалфавитное сцепление...................................................209
11.10.2 Зашифрованное сцепление.......................................................210
11.10.3 Сцепление с запаздыванием.....................................................210
11.10.4 Внутренние отводы..................................................................210
11.10.5 Сцепление ключей......................................................................211
11.10.6 Сводка режимов сцепления. .....................................................211
11.10.7 Сцепление с неполными блоками.............................................211
11.10.8 Сцепление блоков переменной длины......................................211

11.11 Укрепление блочного шифра...........................................................212

12

Принципы безопасного шифрования..................................214
12.1 Большие блоки.....................................................................................214
12.2 Длинные ключи...................................................................................215

12.2.1 Избыточные ключи...................................................................216

12.3 Конфузия...............................................................................................217
12.3.1
12.3.2
12.3.3
12.3.4
12.3.5
12.3.6
12.3.7
12.3.8

Коэффициент корреляции........................................................219
Линейность по основанию 26...................................................223
Линейность по основанию 256.................................................226
Включение закладки..................................................................227
Конденсированная линейность................................................231
Гибридная нелинейность..........................................................232
Конструирование S-блока........................................................232
S-блок с ключом.........................................................................236

Содержание

10

12.4 Диффузия..............................................................................................236
12.5 Насыщение...........................................................................................240
Резюме..............................................................................................................245

13

Потоковые шифры............................................................................246
13.1
13.2
13.3
13.4
13.5
13.6
13.7
13.8
13.9
13.10
13.11
13.12
13.13
13.14

Комбинирующие функции...............................................................247
Случайные числа.................................................................................248
Мультипликативный конгруэнтный генератор..........................249
Линейный конгруэнтный генератор..............................................253
Цепной XOR-генератор.....................................................................254
Цепной аддитивный генератор. .....................................................256
Сдвиговый XOR-генератор...............................................................256
FRand......................................................................................................257
Вихрь Мерсенна...................................................................................259
Регистры сдвига с линейной обратной связью. ..........................259
Оценивание периода. ........................................................................261
Укрепление генератора.....................................................................263
Комбинирование генераторов. .......................................................264
Истинно случайные числа. ...............................................................268

13.14.1 Линейное суммирование с запаздыванием..............................268
13.14.2 Наложение изображений..........................................................269

13.15 Обновление случайных байтов.......................................................270
13.16 Синхронизированные гаммы..........................................................272
13.17 Функции хеширования......................................................................273

14

Одноразовый блокнот....................................................................276
14.1 Шифр Вернама.....................................................................................278
14.2 Запас ключей........................................................................................280

14.2.1 Возвращение ключей в оборот.................................................281
14.2.2 Комбинированный ключ............................................................281
14.2.3 Ключ выбора. .............................................................................281

14.3 Индикаторы. ........................................................................................282
14.4 Алгоритм распределения ключей Диффи–Хеллмана................283
*14.4.1 Построение больших простых чисел, старый подход. ..........285
14.4.2 Построение больших простых чисел, новый подход..............286

15

Матричные методы. .......................................................................292
15.1
15.2
15.3
15.4
15.5

Обращение матрицы. ........................................................................293
Матрица перестановки......................................................................296
Шифр Хилла. ........................................................................................296
Шифр Хилла, компьютерные версии.............................................299
Умножение больших целых чисел..................................................303

15.5.1 Умножение и деление сравнений..............................................304

*15.6 Решение линейных сравнений........................................................305

15.6.1 Приведение сравнения...............................................................305
15.6.2 Правило половины.....................................................................306

Содержание

11

15.6.3 Лесенка.......................................................................................308
15.6.4 Цепные дроби.............................................................................309

15.7 Шифры на основе больших целых чисел. .....................................310
15.8 Умножение на малое число..............................................................311
15.9 Умножение по модулю P...................................................................313
15.10 Изменение основания.......................................................................315
*15.11 Кольца....................................................................................................317
15.12 Матрицы над кольцом.......................................................................318
15.13 Построение кольца.............................................................................319
15.13.1 Гауссовы целые числа. ...............................................................321
15.13.2 Кватернионы.............................................................................322

15.14 Нахождение обратимых матриц.....................................................323

16

Трехпроходный протокол............................................................326
16.1 Метод Шамира.....................................................................................328
16.2 Метод Мэсси–Омуры.........................................................................329
16.3 Дискретный логарифм. .....................................................................329
16.3.1
16.3.2
16.3.3
16.3.4
16.3.5

Логарифмы.................................................................................330
Степени простых чисел............................................................330
Коллизия.....................................................................................331
Факторизация...........................................................................331
Оценки........................................................................................333

16.4.1
16.4.2
16.4.3
16.4.4
16.4.5
16.4.6
16.4.7
16.4.8

Коммутативное семейство матриц......................................334
Мультипликативный порядок.................................................334
Максимальный порядок............................................................335
Атаки Эмили.............................................................................336
Некоммутативное кольцо. ......................................................337
Решение билинейных уравнений...............................................337
Слабые элементы......................................................................339
Как сделать побыстрее............................................................339

16.4 Матричный трехпроходный протокол. .........................................333

16.5 Двусторонний трехпроходный протокол......................................340

17
18

Коды................................................................................................................342
17.1

Джокер...................................................................................................343

Квантовые компьютеры..............................................................346
18.1
18.2
18.3
18.4
18.5
18.6
18.7
18.8

Суперпозиция......................................................................................347
Квантовая запутанность. ..................................................................348
Исправление ошибок.........................................................................349
Измерение............................................................................................350
Квантовый трехэтапный протокол.................................................351
Квантовое распределение ключей. ................................................352
Алгоритм Гровера...............................................................................352
Уравнения.............................................................................................353

18.8.1 Перестановки............................................................................353

Содержание

12

18.8.2
18.8.3
18.8.4
18.8.5

Подстановки..............................................................................354
Карты Карно. ............................................................................354
Промежуточные переменные. .................................................355
Известный открытый текст.................................................355

18.9 Минимизация......................................................................................356

18.9.1 Восхождение на вершину. .........................................................356
18.9.2 Тысяча вершин...........................................................................357
18.9.3 Имитация отжига....................................................................358

18.10 Квантовая имитация отжига............................................................360
18.11 Квантовая факторизация..................................................................360
18.12 Ультракомпьютеры.............................................................................360
18.12.1 Подстановка..............................................................................361
18.12.2 Случайные числа........................................................................362
18.12.3 Ультраподстановочный шифр US-A. .....................................363
18.12.4 Ультрапотоковый шифр US-B................................................364

Развлечения......................................................................................................366
Задачи................................................................................................................369
Эпилог................................................................................................................371
Предметный указатель.................................................................................374

Вступительное слово
От тайных дешифровальных колец до правительственных директив,
задачи сокрытия и обнаружения информации в составе другой информации давно будоражили человеческий ум. Криптология – завораживающий предмет, с которым на практике сталкивался едва ли
не всякий школьник. И вместе с тем имеются веские причины, по
которым эта дисциплина на протяжении веков была окутана глубочайшей тайной, поскольку государства использовали ее для защиты
своего самого секретного оружия. В военных и дипломатических делах к криптографии всегда относились в высшей степени серьезно.
Не будет преувеличением сказать, что успехи и провалы криптографии влияли на исход войн и ход истории, и точно так же они определяют нашу современную историю.
Возьмем сражение при Энтитеме в ходе Гражданской войны
в США, произошедшее в сентябре 1862 года близ Шарпсбурга, штат
Мэриленд, в котором Федеральная армия под командованием Джорджа Макклеллана противостояла армии Конфедерации под командованием Роберта Ли. За несколько дней до него два солдата федералов нашли недалеко от лагеря листок бумаги, оказавшийся копией
приказа Ли, в котором были подробно изложены планы вторжения
в Мэриленд. Приказ не был зашифрован. Располагая этой информацией, Макклеллан точно знал местоположение рассеянных отрядов
и смог уничтожить армию Ли, не дав им соединиться.
Успехи и провалы криптографии оказывали влияние и на более
близкие к нам события. Сокрушительное поражение русской армии
при Танненберге в августе 1914 года стало прямым следствием перехвата сообщений немцами. Удивительно, но сообщения русских
передавались открытым текстом, потому что у полевых командиров
не было ни шифров, ни ключей. Поэтому русские не могли безопасно
координировать действия соседних подразделений.

Вступительное слово

14

50 лет холодной войны, последовавшей за Второй мировой вой­
ной, тоже стали результатом провала криптографии, на этот раз со
стороны японцев в битве за Мидуэй в 1942 году. Американские криптоаналитики взломали японские коды и могли читать многие донесения Объединенного флота. Подобные истории – вотчина классической криптографии. Книга «Криптография с секретным ключом»
как раз на этом поле и играет.
Никто не сможет лучше доктора Фрэнка Рубина провести интересующегося читателя по всем закоулкам классической криптологии
на любительском уровне, от математических истоков до социальных
последствий. Доктор Рубин получил образование в области математики и информатики. Тридцать лет он проработал в компании IBM,
в отделе автоматизации проектирования, и свыше 50 лет занимался криптографией. Доктор Рубин был редактором журнала «Cryptologia» и других изданий. Он автор десятков статей по математике
и компью­терным алгоритмам, а также тысяч математических головоломок.
«Криптография с секретным ключом» – не просто новая версия
классической книги Helen F. Gaines «Elementary Cryptanalysis». Здесь
предмет рассматривается с древних времен до эры квантовых компьютеров. И, что немаловажно, описывается уникальный метод измерения стойкости шифра1,2.
Книга выходит в стратегически важный момент. Это своевременный и существенный вклад в понимание критической технологии.
Не важно, испытывает ли читатель бескорыстный интерес к криптологии как таковой или занимается практической защитой информации, материал, изложенный на этих страницах, благодаря глубине
и широте охвата станет желанным источником полезной информации, а сама книга – ценным пополнением библиотеки.
– Рэндалл К. Николс, DTM
Рэндалл К. Николс – бывший президент
Американской ассоциации криптограмм,
отвечавший, в частности, за обзоры книг;
директор программы сертификации беспилотных летательных систем
на предмет кибербезопасности в Канзасском университете в Салине:
заслуженный профессор отделения послевузовского образования
в области кибербезопасности и компьютерно-технической экспертизы
в колледже Ютики.

1

2

И в книге R. K. Nichols «ICSA Guide to Cryptography», и в классическом
труде Брюса Шнейера «Прикладная криптография» приведены методы
оценки стойкости шифров и случайности. Первая посвящена в основном
классической криптографии, вторая – в большей степени современным
шифрам (Nichols, 1999; Schneier, 1995).
В «Криптографии с секретным ключом» лучше отобран и лучше изложен
материал, чем в двух моих первых книгах по классической криптографии: «Classical Cryptography Course», т. I и II (LANAKI, 1998; 1999).

Вступительное слово

15

Литература
Gaines, H. F. (1956). Cryptanalysis: A Study of Ciphers and their Solution.
NYC: Dover.
LANAKI. (1998). Classical Cryptography Course Vol. I. Laguna Hills, CA:
Aegean Park Press.
LANAKI. (1999). Classical Cryptography Course Vol. II. Laguna Hills, CA:
Aegean Park Press.
Nichols, R. K. (1999). ICSA Guide to Cryptography. New York City: McGraw
Hill.
Rubin, F. (2022). Secret Key Cryptography. Shelter Island, New York: Manning Books.
Schneier, B. (1995). Applied Cryptography: Protocols, Algorithms and
Source Code in C. New York: John Wiley & Sons.

Предисловие
К идее написать эту книгу меня привели разные дорожки. Начну
с моего школьного друга Чарли Роуза. Чарли работал в школьном
книжном магазине. В один прекрасный день, заказывая книги для
магазина, он обратил внимание на книгу Хелен Ф. Гейнс «Крипто­
анализ». Чарли захотел приобрести ее, да еще и с отраслевой скидкой. Но вот незадача – магазин должен был заказать как минимум
три экземпляра.
Чарли нужно было найти еще двух желающих купить книгу. Он
пообещал, что мы все вместе прочтем ее, а затем будем придумывать криптограммы, которые другие должны будут решать. Я книгу
купил, прочел и начал составлять криптограммы, а Чарли утратил
интерес.
На обратной стороне обложки «Криптоанализа» был напечатан
давно устаревший адрес Американской ассоциации криптограмм
(www.cryptogram.org), но я все-таки нашел ее и вступил в ее члены.
И начал решать разные типы криптограмм, которые публиковались
в бюллетене для любителей «The Cryptogram». А спустя несколько
лет стал заместителем редактора. И вот уже более 40 лет остаюсь
членом Ассоциации.
В 1977 году был основан более профессиональный журнал по
криптографии, «Cryptologia». Его можно найти в интернете по адресу https://www.tandfonline.com/toc/ucry20/current. Сначала я читал
статьи, потом начал писать и в конце концов стал редактором. Както так получилось, что ко мне стекались все статьи разных фриков,
и приходилось продираться сквозь хитросплетения нелогичной
логики – вдруг где-то в глубине притаилась хорошая идея. И один
раз такое случилось. Я превратил эту идею в статью для «The Cryptogram». Автор был так благодарен, что посадил в мою честь дерево
в Израиле.

Предисловие

17

Этот опыт научил меня отделять статьи, которые просто плохо
написаны или переоценивают стойкость шифра, от трудов совсем
уж чокнутых авторов. И вот что я понял: любитель, придумавший
слабый шифр, может его описать и разложить по шагам. Мечтатель
не сможет излить смутные, но грандиозные плоды своего воображения на бумагу. Он будет изводить целые стопки бумаги, расписывая
чудесные свойства своего шифра, но не в силах выписать его шаги.
Он не способен превратить свои бессвязные мысли в конкретный
алгоритм.
Начиная с 2005 года я стал посещать курсы в колледже Марист по
программе непрерывного образования. Вскоре я читал лекции по
судоку, SumSum и другим головоломкам (я написал три книги о судоку), своим путешествиям по Танзании и Монголии, конструкции
Эмпайр Стейт Билдинг, жизни Алана Тьюринга и другим темам.
Я стал членом комиссии по учебным планам.
В 2018 году я вызвался прочесть двухсеместровый курс по криптографии. Подготовив почти 450 слайдов, я понял, что материала
достаточно для книги. И на мое счастье, обнаружилось, что годом
раньше я уже начал писать как раз такую книгу. Вот эту.

Благодарности
На днях я случайно услышал, как моя жена Мириам в разговоре по
телефону сказала: «У нас тут секс втроем, я, Фрэнк и книга». Спасибо,
Мириам, что ты 18 месяцев терпеливо сносила, как я писал эту книгу,
потом год искал издателя, шесть месяцев охотился за литературным
агентом, год наблюдал за отсутствием у агента каких-либо результатов и, наконец, месяц искал пристанище для этой книги в издательстве Manning. И еще 18 месяцев рецензирования, правки, редактирования, верстки, правки, составления указателя и всякой всячины.
Я благодарен всем сотрудникам издательства Manning Publications,
которые помогали мне с этой книгой, особенно Майклу Стивенсу, который ухватился за шанс и предложил мне контракт, а потом помогал
на всех стадиях процесса; Марине Майклз за обширную редакторскую
правку; Ребекке Райнхарт, которая сделала мой путь не таким тернис­
тым; Джэн Хоул и Сьюзан Хониуэлл за работу над иллюстрациями;
Тиффани Тэйлор за многочисленные ценные замечания по поводу
грамматики и пунктуации; Полу Уэллсу и Кэри Хейлз за работу над
производством книги; Сэму Вуду за рекламный текст; Дэннису Далиннику за верстку и, конечно, Марджану Бейсу, издателя.
Отдельное спасибо профессору Рэндаллу К. Николсу, написавшему предисловие к книге и рецензию в «The Cryptogram», несмотря на
крайне сжатые сроки. Спасибо также профессору Томасу Перера из
Музея Энигмы за предоставленные изображения Фиалки.
Я благодарю рецензентов, которые прочитали рукопись и сделали множество полезных критических замечаний и предложений:
Кристофера Карделла, Алекса Лукаса, Габора Хаджба, Михала Рутка,
Джейсон Тэйлор, Роя Принса, Мэттью Харвелла, Риккардо Маротти
и Пола Лава. Ваши предложения помогли сделать книгу лучше.
Наконец, не могу не отметить нечаянную роль Ли Харви Освальда: совершив чудовищное убийство президента Кеннеди, он помешал мне прийти на собеседование по безопасности в штаб-квартиру
ФБР, что не дало мне возможности поступить на работу в АНБ, где
написание подобной книги считалось бы преступным деянием.

Об этой книге
Для кого предназначена эта книга
Книга рассчитана на широкую аудиторию: массового читателя,
криптографов-любителей, почитателей истории, студентов компьютерных специальностей, инженеров-электротехников, математиков
и профессиональных криптографов. Это усложнило мне работу, потому что невозможно сделать все части книги одинаково интересными для всех. Для кого-то в некоторых частях окажется слишком
много математики. А кому-то какие-то части покажутся чересчур
элементарными. В этом разделе я попробую подсказать читателям,
что, на мой взгляд, им стоит прочитать.
Массовые читатели могут читать всё подряд до конца главы 8.
Если математика покажется слишком сложной или изложение – перенасыщенным техническими подробностями, просто
пропускайте соответствующие страницы. Начиная с главы 9
материал становится более трудным. Дальше можно читать
выборочно, только то, что кажется интересным. Быть может,
имеет смысл прочитать главу 12, чтобы получить общее представление, не вдаваясь в детали.
„„ Криптографы-любители, вероятно, захотят прочитать книгу
целиком, а затем более внимательно изучить разделы 4.2–5.11,
6.1–6.5, 6.7, большую часть главы 7, а также разделы 9.1–9.9
и главы «Развлечения» и «Задачи».
„„ Почитатели истории могут прочитать книгу целиком, пропус­
кая всю математику, но обращая внимание на то, когда и кем
были изобретены различные методы.
„„ Студентам компьютерных специальностей рекомендую
уделить особое внимание разделам 5.6–5.11, главе 8 и главам 11–16.
„„ Инженеров-электротехников могут заинтересовать практические методы. Им стоит прочитать главы 2 и 4, где излагаются
„„

Об этой книге

20

основы, а затем разделы 7.2–7.8, главу 9 и главы 11–16, обращая
особое внимание на главу 12.
„„ Математикам будут особенно интересны раздел 4.5, разделы 5.6–5.12, 10.4–10.7, 11.7–11.10, 12.3–12.6, главы 13–16, в особенности раздел 16.4.6, и глава 18.
„„ Для профессиональных криптографов интерес могут представлять разделы 7.8, 8.2, 10.5, 10.7, 11.4, 12.3–12.6, 13.8, 13.15,
14.2, 14.4, 15.4–15.14, 16.4, 16.5 и 18.12.

О шифрах
Я включил несколько развлекательных головоломок и более серьезных задач для читателей, которые хотят попробовать свои силы во
вскрытии шифров. Для решения головоломок достаточно стандартных методов, описанных в книге.
При решении задач применяются методы, которые я придумал
сам. Они достаточно просты, так что любитель сможет догадаться
о методе и решить задачу. Я старался не вредничать и дать возможность интересующимся читателям найти решение. Не бойтесь – там
нет ничего заумного или чрезмерно сложного. Никаких несуществующих слов или искаженных частот букв. И достаточно материала
для решения.
Некоторые разделы начинаются символом * и заканчиваются
символами **. Это факультативные разделы, которые могут содержать компьютерные алгоритмы или углубленную математику. Ктото захочет их пропустить.

Форум на сайте liveBook
Приобретение этой книги открывает бесплатный доступ к платформе liveBook онлайнового чтения, созданной издательством Manning.
Средства обсуждения на liveBook позволяют присоединять комментарии как к книге в целом, так и к отдельным разделам или абзацам.
Совсем несложно добавить примечания для себя, задать или ответить на технический вопрос и получить помощь от автора и других
пользователей. Для доступа к форуму перейдите по адресу https://
livebook.manning.com/book/secret-key-cryptography/discussion. Узнать
о форумах Manning и правилах поведения на них можно по адресу
https://livebook.manning.com/discussion.
Издательство Manning обязуется предоставлять площадку для содержательного диалога между читателями, а также между читателями
и автором. Но это обязательство не подразумевает какого-то конкретного объема присутствия со стороны автора, участие которого в работе форума остается добровольным (и не оплачивается). Мы рекомендуем задавать автору трудные вопросы, чтобы его интерес не угасал!
Форум и архивы прошлых обсуждений остаются доступны на сайте
издательства до тех пор, пока книга продолжает допечатываться.

Об этой книге

21

Другие онлайновые ресурсы
Криптографические продукты, созданные автором, можно найти на
его сайте по адресу www.mastersoftware.biz.

Отзывы и пожелания
Мы всегда рады отзывам наших читателей. Расскажите нам, что вы
ду­маете об этой книге, – что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые
будут для вас максимально полезны.
Вы можете написать отзыв на нашем сайте www.dmkpress.com,
зайдя­на страницу книги и оставив комментарий в разделе «Отзывы и рецензии». Также можно послать письмо главному редактору
по адресу dmkpress@gmail.com; при этом укажите название книги
в теме письма.
Если вы являетесь экспертом в какой-либо области и заинтересованы в написании новой книги, заполните форму на нашем сайте
по адресу http://dmkpress.com/authors/publish_book/ или напишите
в издательство по адресу dmkpress@gmail.com.

Список опечаток
Хотя мы приняли все возможные меры для того, чтобы обеспечить
высокое качество наших текстов, ошибки все равно случаются. Если
вы найдете ошибку в одной из наших книг, мы будем очень благодарны, если вы сообщите о ней главному редактору по адресу dmkpress@gmail.com. Сделав это, вы избавите других читателей от недопонимания и поможете нам улучшить последующие издания этой
книги.

Нарушение авторских прав
Пиратство в интернете по-прежнему остается насущной проблемой.
Издательства «ДМК Пресс» и Manning Publications очень серьезно относятся к вопросам защиты авторских прав и лицензирования. Если
вы столкнетесь в интернете с незаконной публикацией какой-либо
из наших книг, пожалуйста, пришлите нам ссылку на интернет-ресурс, чтобы мы могли применить санкции.
Ссылку на подозрительные материалы можно прислать по адресу
элект­ронной почты dmkpress@gmail.com.
Мы высоко ценим любую помощь по защите наших авторов, благодаря которой мы можем предоставлять вам качественные материалы.

Об авторе
Фрэнк Рубин – обладатель степени бакалавра
и магистра математики и доктора информатики. Он 28 лет проработал в подразделении автоматизации проектирования компании IBM, где
разрабатывал специализированное программное обеспечение, которым инженеры IBM пользовались при проектировании компью­теров
и электрических схем. Он владелец компании
Master Software Corp., разрабатывающей криптографические продукты. Фрэнк – автор четырех патентов США по криптографическим методам. Он автор
примерно 50 работ, опубликованных в реферируемых журналах
по криптографии, а также нескольких внутренних документов IBM
(руководств пользователя и проектных спецификаций). В области
криптографии он известен прежде всего тем, что вскрыл цилиндрический шифратор Джефферсона. В информатике хорошо известен
его метод арифметического кодирования, ставший одним из стандартных методов сжатия текстов, а также его алгоритм нахождения гамильтоновых путей. В чистой математике известна его идея
применить распознаватель с конечным числом состояний к теории
меры. Фрэнк опубликовал три книги по судоку, а также две «самиздатовские» книги по головоломкам SumSum. Он автор более 3500 задач, опубликованных в журналах «The Cryptogram», «Technology Review» и «Journal of Recreational Mathematics» (JRM), и единственный,
удостоившийся специального выпуска JRM, посвященного исключительно его задачам.

Об иллюстрации
на обложке
На обложке книги изображен «Le Garçon de Bureau», или «Конторский служащий». Рисунок взят из книги, изданной под редакцией
Луи Кюрмера в 1841 году. Все иллюстрации мастерски нарисованы
и раскрашены вручную. В те времена легко было по одежде определить, где человек живет, чем занимается и каков его статус. Издательство Manning откликается на новации и инициативы в компью­
терной отрасли обложками своих книг, на которых представлено
широкое разнообразие местных укладов быта в прошлых веках. Мы
возвращаем его в том виде, в каком оно запечатлено на рисунках из
таких собраний, как это.

1

Введение

Я занимаюсь криптографией больше 50 лет. За это время я очень
многому научился. И в этой книге я хочу передать свои знания следующему поколению криптографов. Многие изложенные здесь сведения – новые открытия, которых вы не найдете ни в какой другой
литературе.
Я знаю, что на тему криптографии уже написано много книг.
И если я хочу, чтобы мою книгу читали, то должен предложить
какие-то мысли, которых нет в других книгах, идеи, о которых другие авторы не знают или считают их невозможными. Книга должна
стать СЕНСАЦИЕЙ. Поехали! Вот что я сделаю:
„„ расскажу простым нетехническим языком, как построить невскрываемый шифр;
„„ предложу свыше 140 шифров, готовых к применению. 30 из них
невскрываемые;
„„ снабжу вас инструментарием и методами, позволяющими комбинировать и дополнительно укреплять шифры;
„„ опишу вычисление, которое позволит точно измерить стойкость шифра и гарантировать, что он невскрываемый;
„„ покажу, как построить и включить в проект коды, сжимающие
данные;
„„ раскрою практический метод получения невскрываемого шифра с по­мощью одноразового блокнота;
„„ расскажу, как генерировать сразу много истинно случайных
чисел;

Введение

25

покажу, как находить очень большие и безопасные простые
числа;
„„ научу добавлять необнаруживаемую закладку в шифр;
„„ раскрою потенциально фатальный дефект в квантовой криптографии;
„„ объясню, как бороться с гипотетическими ультракомпьютерами, которые, возможно, будут разработаны через несколько
десятилетий (а возможно, уже существуют, только это не афишируется).
Книга написана разговорным языком, как будто мы ведем дружескую беседу. Говоря «мы» или «нас», я имею в виду, что вы, читатель,
и я, автор, совместными усилиями стараемся решить какую-то задачу или защитить какой-то секрет.
Эта книга – не научный труд. Я упоминаю о происхождении методов и идей, когда примерно знаю источники и даты, но многие знания я приобрел неформально. Вы почти не найдете ссылок, сносок
и комментариев эрудита. Я хотел написать практически полезную
книгу. Следуйте изложенным рекомендациям – и получите безопасный шифр. Сто пудов.
Иногда я включаю любопытные исторические факты – отчасти
чтобы снять напряжение, а отчасти чтобы воссоздать историческую
правду. Я знаю, что изучать криптографию – тяжкий труд. И надеюсь, что речь от первого лица, анекдот-другой и толика юмора помогут немного облегчить его.
В книге много нового материала. Приведены методы построения
и взлома шифров, которые раньше нигде не публиковались. Есть
даже несколько моих собственных математических открытий. Их
вы найдете только в этой книге. Есть куча практических советов, как
сделать то или другое, несколько компьютерных методов, рассказано, как можно ускорить вычисления или обойтись меньшей памятью.
Упор в книге сделан на особо безопасную криптографию. У вас
имеется информация, которую необходимо сохранить в секрете от
противника, располагающего суперкомпьютерами или даже квантовыми компьютерами. Из этой книги вы узнаете, как это сделать.
Я представлю широкий набор инструментов, новых и давно известных, которые можно комбинировать бесчисленными способами,
получая в итоге шифры сколь угодно высокой стойкости. Студенты,
изучающие криптографию, и программисты, применяющие ее в работе, найдут здесь широчайший спектр практических методов, которые можно использовать для разработки новых криптографических
продуктов и сервисов.
При всем при том я хочу, чтобы изложенный материал был доступен как профессионалам, так и любителям. Есть немало методов,
которые можно реализовать, имея лишь листок бумаги и карандаш.
Один такой метод описан в конце раздела 9.6.1. Эти методы пригодны
для работы в полевых условиях, когда нет ни электричества, ни элект­
ронных устройств. Есть даже несколько шифров, доступных детям.
„„

26

Введение

Любой человек можетсоздать невскрываемый шифр.
И вы можете создать невскрываемый шифр. Нужно только знать,
как это сделать. Если вы сумеете прочесть и понять эту книгу целиком или хотя бы наполовину, то сможете создать невскрываемый
шифр. Эта книга научит любого желающего, как построить шифр,
который устоит против атаки, всерьез организованной профессиональным криптографом, располагающим суперкомпьютером.
Никакая другая книга не может этим похвастаться. На самом деле
для разработки собственного безопасного шифра не нужно ничего,
кроме карандаша и бумаги. Я собрал большую коллекцию методов
и идей начиная с XV века и покажу вам, какие комбинации увеличивают стойкость шифра, а какие являются пустой тратой времени.
Я вооружу вас проверенными временем приемами, дополнив их совсем новыми техниками, которые позволят возвести неприступную
крепость.
Честное предупреждение: по образованию я математик, а по профессии специалист по информатике, так что без стеснения пользуюсь математической нотацией и математическими понятиями. Эта
книга адресована не только инженерам и математикам, но и более
широкой аудитории. Я буду объяснять всю необходимую математику, так что обращаться к другим источникам не придется. Если вы
понимаете, что такое нижние индексы и показатели степени, если
можете читать выражения, содержащие скобки, то никаких других
математических знаний и не понадобится. Все сверх того – простые
числа, модульная арифметика, операции над матрицами и математические кольца – я объясню здесь же.
Если вы не понимаете какую-то математическую идею, то есть
три пути: (1) поверить мне на слово, (2) пропустить раздел целиком
или (3) не использовать соответствующий криптографический метод. Есть достаточно других. И некоторые точно вас устроят.
Или просто впрягайтесь и читайте разделы, посвященные математике. Вы удивитесь тому, как много нового узнаете. Не расстраивайтесь, если не понимаете какую-то тему. Возможно, следующая
окажется проще. Даже профессиональные математики понимают
не всё.

2

Что такое
криптография?

Краткое содержание главы:
основные криптографические термины;
что такое невскрываемый шифр;
„„ какие есть виды криптографии.
„„
„„

Криптографию часто называют «искусством тайнописи». Но этим
она не исчерпывается. Криптография включает всё: от невидимых
чернил до передачи сообщений с применением квантового запутывания фотонов. В частности, криптография включает придумывание
и вскрытие кодов и шифров.
Разные авторы придают криптографическим терминам разный
смысл, поэтому с самого начала договоримся о некоторых основных
терминах.
Открытым, или незашифрованным, текстом называется сообщение или документ, который мы хотим сохранить в секрете. В традиционной криптографии сообщение было бы записано текстом на
некотором языке, известном как отправителю, так и получателю.
В век компьютеров это может быть файл любого типа, например:
PDF (текст), JPG (изображение), MP3 (аудио) или AVI (мультимедиа).
Шифром называется метод или алгоритм, который искажает сообщение до неузнаваемости, например изменяя порядок символов
или заменяя одни символы другими. В общем случае шифры при-

28

Глава 2

Что такое криптография?

меняются к отдельным символам или группам символов текста безотносительно к их смысловому содержанию.
Ключом называется секретная информация, известная только отправителю и правомочному получателю (или получателям). Ключ
определяет, какое преобразование применяется к каждому сообщению. Например, если шифр (метод) заключается в изменении порядка
букв в сообщении, то ключ может указывать, какой порядок использовать в сообщениях текущего дня. Ключ может быть буквой, словом или
фразой, числом либо последовательностью букв, слов и чисел. Стойкость шифра сильно зависит от длины используемых в нем ключей.
Ключевым словом или ключевой фразой называется слово или фраза, используемые в роли ключа.
Шифрованием называется процесс преобразования открытого
текста в нечитаемую абракадабру полномочным отправителем, знающим ключ.
Шифртекстом называется нечитаемое сообщение или документ,
предназначенные для передачи или хранения.
Дешифрированием, или расшифровыванием, называется процесс,
который используется полномочным получателем, знающим метод
и ключ, для преобразования нечитаемого шифртекста в исходный
открытый текст.
Кодом также называется преобразование сообщения, делающее
его нечитаемым. В отличие от шифра, код обычно применяется
к словам или фразам сообщения. Типичный код заменяет слова или
фразы группами цифр или букв. (Тут имеет место путаница – слово
код также означает стандартизованное представление букв, например код Морзе. Надеюсь, что смысл будет понятен из контекста.)
Криптологией называется формальное изучение криптографии,
т. е. математические идеи и методы, применяемые для построения
и вскрытия шифров. Ученые занимаются криптологией, а взломщики шифров применяют криптоанализ.
Криптоанализом называется изучение кодов и шифров с конкретной целью – найти в них слабые места и способы вскрытия или, наоборот, способы повысить стойкость.
Вскрытием кода называется процесс прочтения зашифрованных
сообщений третьей стороной (врагом или противником), не знающей ключа, а возможно, даже и метода. Это можно проделать, применяя математические методы или просто терпеливо перехватывая
и сопоставляя большое число сообщений, но на практике чаще все
сводится к трем B: bribery (подкуп), blackmail (шантаж) и break-in
(взлом системы).

2.1

Невскрываемые шифры
Итак, о терминологии мы договорились, а теперь позвольте мне
перейти к главному вопросу. Что я понимаю под словом «не-

Невскрываемые шифры

29

вскрываемый»? Во-первых, что шифр невозможно вскрыть криптографическими средствами. В их число не входят взлом, подкуп,
принуждение, предательство, шантаж, медовые ловушки и другие
подобные способы. Все это нам неинтересно. Во-вторых, я имею
в виду, что шифр нельзя вскрыть на практике. Противник располагает конечными ресурсами и конечным временем для вскрытия
шифра. Выбирая шифр, вы должны хотя бы примерно представлять, сколько человеческих ресурсов и вычислительных мощностей потенциальный противник может потратить на его вскрытие.
Делайте предположения с запасом, учитывайте возможность усовершенствования компьютеров, добавьте еще немного для пущей
безопасности и определитесь с числовой величиной. Тогда при
выборе шифра вам будет на что ориентироваться. Добейтесь выполнения этого ориентира – и ваш шифр будет практически невскрываемым.
Помните, что время жизни многих сообщений ограничено. Если
сообщение гласит «АТАКУЕМ НА РАССВЕТЕ», а враг прочтет его
в полдень, то будет уже поздно. Атака уже произошла. Шифр, который нельзя вскрыть за 12 часов, можно считать практически невскрываемым, если у противника этих 12 часов нет.
Еще раз поясню, чтобы не было никаких сомнений: говоря, что
шифр вскрыт, я имею в виду, что противник может читать сообщения, отправленные с применением этого шифра. Даже если противник может прочесть всего 1 % или 0.01 % сообщений, шифр все равно
считается вскрытым. Но где-то проходит рубеж. Если противник может прочитать сообщение, только если предварительно перехватил
много сообщений такой же длины, зашифрованных тем же ключом,
или если 63 из 64 бит ключа нулевые, то шифр вскрытым не считается. У противника нет априорного способа узнать, какие сообщения каким ключом зашифрованы или какие ключи состоят почти из
одних нулей. Может случиться, что вы никогда и не отправите двух
сообщений одинаковой длины, зашифрованных одним ключом или
ключом, в котором 63 из 64 бит нулевые.
Если в шифре используется 256-разрядный ключ и вражеский
криптоаналитик нашел математический или вычислительный способ сократить его длину до 200 или даже до 150 бит, то шифр может
быть ослабленным, но все равно не считается вскрытым, коль скоро
вы выбрали уровень безопасности 128 бит. Использование 256-битового ключа для обеспечения 128-битового уровня безопасности дает
огромный запас прочности.
Когда правительство США решило, что старый стандарт шифрования данных DES уже не является безопасным, оно объявило международный конкурс на разработку нового шифра. Предложения поступили со всего мира. Их количество исчислялось десятками. Сотни
криптографов оценивали предложенные шифры с точки зрения скорости и безопасности. С 1997 по апрель 2000 года состоялось три раунда выявления победителя. Именно так и следует поступать, когда

30

Глава 2

Что такое криптография?

речь идет о шифре, который станет международным государственным стандартом для банков, промышленности и армии. Если вы
подумываете принять участие в следующем конкурсе, то эта книга
поможет подготовиться.
Но большинство читателей вряд ли будут пытаться. У их шифров
будет более ограниченная сфера применения. Они могут довериться
собственному суждению или придуманному ими процессу верификации при оценке своих шифров. Принципы, изложенные в главе 12,
помогут принять верное и обоснованное решение.

2.2

Виды криптографии
Существует много видов криптографии. Перечислим несколько видов, которые использовались в прошлом:
„„ скрытое сообщение, например гонец мог проглотить сообщение, спрятать его в каблуке или в седле либо просто запомнить.
В древности часто заставляли гонца заучивать сообщение на не
понятном ему языке;
„„ тайный метод, например шифр Цезаря, в котором каждая буква алфавита заменялась буквой, отстоявшей от нее на три позиции. То есть A заменялась на D, B – на E, C – на F и так далее;
„„ замаскированное сообщение, похожее на что-то другое, например на деталь одежды гонца;
„„ невидимое сообщение, например микроточки или невидимые
чернила, которые проявляются при нагревании или обработке
кислотой;
„„ ложный путь, например когда истинным сообщением является
подпись или форма и цвет бумаги, а все остальное служит только для отвлечения внимания или дезинформирования.
Все эти методы носят общее название стеганография, впервые этот
подход был описан в книге «Steganographia», изданной в 1499 го­
ду бенедиктинским аббатом Иоганном Тритемием, урожденным
Иоган­ном Гейденбергом. Сама книга Тритемия является примером
стеганографии, потому что замаскирована под книгу о магии.
У некоторых стеганографических методов есть современные
аналоги. Например, сообщение можно скрыть в JPEG-файле изображения, используя только младшие биты каждого пикселя. Другой пример – использование генератора случайных чисел для выбора некоторых битов в каждом байте файла. Выбранные биты
содержат сообщение, а остальные могут быть ничего не значащим
мусором.
Прежде чем приступать к описанию современных шифров, я хотел бы ввести полезное соглашение. Сообщение передается от отправителя к получателю, а цель шифрования – не дать противнику
прочитать сообщение. Для краткости я буду называть отправите-

31

Виды криптографии

ля Сандра, полномочного получателя Рива, а противника Эмили1.
Это более естественно, чем традиционные Алиса, Боб и Кэрол, не
правда ли?
Отправитель Открытый
текст
Сандра

ШИФР

Шифртекст Получатель
Рива

Обычно Сандра шифрует сообщение на своей стороне, прежде чем
отправить его Риве. Сообщение можно отправлять любым способом,
включая письмо, телефон, интернет, коротковолновую радиосвязь,
сигнальный прожектор, кратковременный импульс, телеграф, волоконно-оптический кабель, семафор, квантовое запутывание или
даже дымовые сигналы, правда, только в пределах прямой видимости. Чтобы картина была полной, отмечу, что шифр может требовать
не только открытого текста, но и ключа, а противник может подслушивать. Вот более полная схема.
Отправитель Открытый текст
Сандра
Ключ

ШИФР

Шифртекст

Получатель
Рива
Противник
Эмили

Современные шифры обычно попадают в одну из трех категорий:
с секретным ключом, с открытым ключом и с персональным ключом. Ниже приведены их основные характеристики.
Шифр с секретным ключом. Сандра владеет секретным ключом, которым пользуется для зашифровывания сообщений. Рива имеет соответствующий секретный ключ, которым пользуется для дешифрирования сообщений. Это может быть тот же самый или обратный ключ.
Обычно контроль над ключом находится в руках Сандры. При изменении ключа Сандра должна отправить новый ключ или обратный
к нему Риве. Это стандартная парадигма классической криптографии.
Шифр с открытым ключом. Рива владеет открытым ключом шифрования, который сообщает всем желающим. Когда Сандра хочет отправить Риве сообщение, она шифрует его открытым ключом Ривы.
Рива также владеет закрытым ключом, известным только ей. С его
помощью она может дешифрировать полученные сообщения. Эта
схема будет работать, только если никто не может вычислить секретный закрытый ключ по открытой информации. Из методов с открытым ключом наиболее распространен алгоритм RSA, придуманный
Рональдом Ривестом, Ади Шамиром и Леном Адлеманом в 1975 году.
1

Английские имена Sandra, Riva и Emily созвучны словам sender (отправитель), receiver (получатель) и enemy (противник). – Прим. перев.

32

Глава 2

Что такое криптография?

Шифр с персональным ключом. И у Сандры, и у Ривы есть персональный ключ, который они никому не сообщают. Поскольку ключи не передаются и не разделяются, криптографию с персональным
ключом иногда называют бесключевой. Работает это следующим
образом. (Проход 1) Сандра зашифровывает сообщение своим персональным ключом и отправляет его Риве. (Проход 2) Рива зашифровывает полученное сообщение своим персональным ключом
и отправляет дважды зашифрованное сообщение Сандре. (Проход 3)
Сандра дешифрирует сообщение своим персональным ключом и отправляет его назад Риве. Теперь сообщение зашифровано только
ключом Ривы, который она и использует, чтобы прочитать его.
Хитрость в том, что операции шифрования Сандры и Ривы должны коммутировать. То есть результат не зависит от того, кто шифрует сообщение первым: Сандра или Рива. Символически это записывается в виде SRM = RSM, где M – сообщение, а S и R – операции
шифрования, выполняемые Сандрой и Ривой. Достоинство криптографии с персональным ключом в том, что любой человек может
безопасно общаться с любым другим, не готовя ключи предварительно и не передавая их, поэтому можно не опасаться, что ключ
будет перехвачен.
Криптографию с персональным ключом называют еще трехпроходным протоколом. Протокол – это последовательность шагов, используемая для достижения определенной цели, например передачи
сообщений. Иными словами, протокол – это алгоритм. Идея трехпроходного протокола была предложена Ади Шамиром в 1975 го­ду,
а конкретный метод, представленный в этой книге, – мое изобретение.

2.3

Симметричная и асимметричная
криптография
Во многих книгах пишут, что есть два типа криптографии: с симмет­
ричным и асимметричным шифром. Идея в том, что в криптографии
с секретным ключом Сандра и Рива пользуются одним и тем же ключом для шифрования или дешифрирования сообщения, тогда как
в криптографии с открытым ключом Сандра использует один ключ,
а Рива – обратный к нему. В этой дихотомии не нашлось места криптографии с персональным ключом, которая не является ни симметричной, ни асимметричной, а равно различным классическим
методам, упомянутым в начале раздела 2.2. Более того, классификация симметричная–асимметричная не всегда точна. В разделе 15.1
я опишу шифр Хилла – метод с секретным ключом, в котором шифрование сводится к умножению сообщения на ключ, а дешифрирование – к умножению на обратный ключ – так же, как в криптографии с открытым ключом.

Механические и цифровые шифры

33

Классификация шифра как симметричного или асимметричного не особенно полезна. Она не отражает существенного различия
между криптографией с секретным и открытым ключом: в криптографии с секретным ключом все ключи хранятся в секрете, а в криптографии с открытым ключом каждая сторона хранит в секрете один
ключ, а второй делает общедоступным.
Криптография с открытым ключом и с персональным ключом
появились примерно в 1975 году. Криптография с открытым ключом так распалила воображение, что с тех пор методам с секретным
и персональным ключом уделялось мало внимания. Криптография
с открытым ключом подробно описана во многих книгах. Но эта
книга посвящена в основном криптографии с секретным ключом –
фундаменту, на котором покоится криптография.

2.4

Блочные и потоковые шифры
Другой способ классификации – разделение шифров на блочные
и потоковые. Блочные шифры применяются к блокам символов сообщения, скажем к блокам по 5 символов. Обычно размер всех блоков одинаков и для каждого используется один и тот же ключ.
Потоковые шифры применяются к одному символу сообщения
за раз. У каждого символа имеется собственный ключ, называемый
ключом символа, который обычно получается из более длинного
ключа сообщения. В старых потоковых шифрах ключ сообщения повторялся. Например, если длина ключа сообщения равна 10 символам, то первый его символ обычно использовался для шифрования
символов сообщения с номерами 1, 11, 21, 31, …, второй символ – для
шифрования символов сообщения с номерами 2, 12, 22, 32, … и так
далее. Шифр с регулярно повторяющимся ключом называется пе­
рио­дическим. В более современных потоковых шифрах длина ключа
сообщения обычно совпадает с длиной самого сообщения и называется гаммой. Такой непериодический подход к шифрованию называется одноразовым блокнотом. В главе 13 мы обсудим, как генерируются гаммы.
Разделение шифров на блочные и потоковые не является взаимно
исключающим. Существуют гибридные шифры, в которых сообщение разбивается на блоки, но разные блоки шифруются разными
ключами, т. е. шифр применяется к потоку блоков, а не к потоку
символов.

2.5

Механические и цифровые шифры
Шифры можно классифицировать также по средствам вычисления.
На заре истории шифрование производилось вручную. И не с по­

34

Глава 2

Что такое криптография?

мощью карандаша бумаги, а с помощью стилоса и пергамента или
стилоса и глиняной таблички.
Первым механическим средством шифрования была скитала, или
сцитала, которая использовалась в Древней Греции и Спарте предположительно еще в 700 году до н. э. Она представляла собой цилиндр, обвитый по спирали узкой полоской кожи или пергамента
таким образом, что края соседних витков точно совпадали – без пробелов и перекрытий. Когда полоска разворачивалась, были видны
только разрозненные части букв, в которых враг не мог распознать
сообщение. Иногда наносились дополнительные завитки или раскраска, чтобы предмет выглядел как украшение.
Отправитель сохранял инструмент для чтения и записи будущих
сообщений. Гонец мог носить полоску кожи как пояс, подвязывать
ей волосы или использовать как седельную подпругу. Получателю
для прочтения сообщения нужна была палка такого же диаметра.
Разумеется, гонцу не сообщали о назначении этой ленты или ремня.
Возможно, она даже вшивалась в одежду без ведома владельца.
Ниже показано изображение скиталы из книги Джованни Баттис­
та Порта «De Occultis Literarum Notis», изданной в 1593 году. Обратите внимание, что греческие буквы расположены на нескольких
витках кожаной ленты.

Греки хранили секрет скиталы в течение 700 лет или около того.
Римлянам, однако, не так повезло. В конце концов их враги из Северной Европы разгадали, для чего эти палки предназначены и как
ими пользоваться. Поэтому римляне изобрели специальный измерительный инструмент, представляющий собой полый медный
или бронзовый додекаэдр – правильный многогранник с 12 пятиугольными гранями – с круглым отверстием на каждой грани. Эти
отверстия позволяли изготавливать деревянные цилиндры нужного
диаметра. Когда губернатор (сатрап), посол или шпион отправлялся
куда-то через вражескую территорию, безопаснее было везти с собой этот инструмент, а не саму скиталу, которую могли захватить.
Двенадцать отверстий разного диаметра позволяли безопасно обмениваться сообщениями с другими губернаторами, послами или
шпионами, например: маленькое для Лондиниума (нынешний Лондон), среднее для Лугдунума (нынешний Лион), а большое для Таррако (нынешняя Таррагона в Каталонии).
Насколько нам известно, о назначении этих додекаэдров так и не
догадались ни жители Северной Европы, ни, кстати говоря, современные археологи. Археологи высказывали многочисленные экс-

Механические и цифровые шифры

35

травагантные гипотезы о цели этих предметов – детские игрушки, седельные украшения, кузнечные приспособения, канделябры,
артиллерийские дальномеры и, когда ничего другого не осталось,
предметы религиозного культа. Показанный ниже бронзовый додекаэдр был найден недалеко от Тонгерена, древнейшего города Бельгии, и экспонируется в музее галло-римской цивилизации.
Интересное замечание по ходу: в Википедии и на других сайтах
говорится, что скитала использовалась для порождения перестановочного шифра, поскольку каждая буква записывалась в пределах
одного витка полоски. Это неправда. Такую полоску легко было бы
опознать как зашифрованное сообщение. Уж не важно, смог бы враг
прочесть сообщение или нет, но гонцу точно помешали бы его доставить. Скрупулезный анализ вопроса о целых и разнесенных буквах
можно найти в статье по адресу cryptiana.web.fc2.com/code/scytale.
htm. В 1841 году Эдгар Алан По, который, кстати, был еще и талантливым криптографом, написал статью «Несколько слов о тайнописи», в которой привел хорошее описание скиталы и свой метод дешифрирования таких сообщений.
И усугубляя эту ошибку, в статье «Тransposition cipher» в англо­
язычной Википедии написано, что скитала использовалась для порождения «заборного шифра» (rail fence cipher), называемого также
зигзаговым. В этом шифре текст пишется на «штакетинах» воображаемого забора – сначала вниз по диагонали, по достижении нижнего края вверх, затем снова вниз и т. д. Но при записи сообщения
вдоль или вокруг цилиндра направление никогда не изменяется. Поэтому если бы скитала и использовалась для порождения перестановочного шифра, то это была бы столбцовая перестановка, а никак
не заборный шифр. (Я исправил эти ошибки в Википедии, но мои
исправления удалили. И я решил, что роль википедийной полиции
не по мне.)
В 1960-х годах появился такой вариант скиталы: взять отсортированную колоду перфокарт, написать карандашом сообщение на
внешнем крае колоды, а затем тщательно перетасовать ее. Если затем подать колоду сортировочной машине, то порядок карт восстановится и сообщение можно будет прочитать. Идея широко обсуждалась в среде программистов, но я не знаю, была ли она воплощена
на практике. Еще один современный эквивалент – написать сообщение на обратной стороне собранного пазла, а затем рассыпать пазл.
Получатель должен будет собрать пазл, перевернуть его и прочитать
сообщение.
Еще один механический шифр – цилиндр Джефферсона, изобретенный Томасом Джефферсоном между 1790 и 1793 годом. Он
состоит из 36 деревянных дисков одинакового размера, нанизанных на железную ось, так что получается деревянный цилиндр. По
внешнему краю каждого диска написано 26 букв латинского алфавита в произвольном порядке. Диски независимо вращаются, так что
можно составить любое сообщение. Варианты шифратора Джеффер-

36

Глава 2

Что такое криптография?

сона с дисками или бумажными полосками использовались вплоть
до 1960-х годов.
С XV по XIX век было разработано много типов дисковых шифраторов. В самом распространенном использовалось несколько тонких концентрических дисков, вращающихся вокруг центральной
оси. Вдоль ободка каждого диска написан алфавит или какой-то
набор чисел и символов в некотором порядке. Диски фиксируются
в определенном положении, а процесс шифрования выглядит так:
найти букву открытого текста на одном диске, а затем использовать
соответствующую букву или символ на одном из остальных дисков
в качестве буквы шифртекста. В более поздних дисковых шифраторах внутренний диск сдвигался после шифрования каждой буквы –
вручную или с по­мощью какого-то заводного механизма.
Следующее изображение дискового шифратора Леона Баттиста
Альберти приведено в книге Августо Буонафальче «De compendis
cifri», изданной в 1467 году. (Распространяется фондом WikiMedia
Commons.)

Начиная с 1915 года последовала длинная череда электромеханических роторных шифров. Самый знаменитый из них – шифровальная машина Энигма, созданная в 1920-х годах немецким инженером
Артуром Шербиусом. Количество типов устройств, выпущенных на
рынок с пришествием компьютеров, исчисляется десятками. Все
они порождали потоковые шифры. Идея заключалась в том, чтобы
определять заменяющую букву с по­мощью прохождения электрического тока через ряд вращающихся роторов. После зашифровывания буквы некоторые роторы проворачивались под управлением
различных кулачков, шестеренок, лапок и собачек, которые изменяли порядок подстановки мириадами возможных способов. Поэтому
если однажды из слова INFANTRY получилось PMRNQGFW, то такое событие могло не повториться на протяжении миллиардов оборотов.
Начиная с 1960-х годов криптография все активнее становится цифровой и переводится на компьютеры. В 1975 году компания
IBM разработала стандарт шифрования данных DES (Data Encryption Standard), который был сертифицирован Национальным бюро

Зачем выбирать шифр с секретным ключом?

2.6

37

стандартов в 1977 году. Это положило начало целой серии блочных
шифров, например Serpent и TwoFish, и в 2001 году увенчалось принятием улучшенного стандарта шифрования AES (Advanced Encryption Standard) Национальным институтом стандартов и технологий
(NIST). Этот класс шифров рассматривается в главе 11.
Итак, развитие происходило по пути ручной → механический →
электромеханический → цифровой.

Зачем выбирать шифр с секретным
ключом?

В нашу эру криптографии с открытым ключом возникает естественный вопрос: зачем вообще нужна криптография с секретным ключом? Причин несколько.
Криптография с секретным ключом намного быстрее. Даже самые
стойкие и сложные методы с секретным ключом работают в сотни,
а то и тысячи раз быстрее лучших методов с открытым ключом. На
самом деле основное применение криптографии с открытым ключом – шифровать ключи для криптографии с секретным ключом.
Ключи передаются с применением методов с открытым ключом, но
сами сообщения – с по­мощью методов с секретным ключом.
Для криптографии с открытым ключом (PKC) необходима инфраструктура открытых ключей. Должны существовать серверы открытых ключей, которые раздают открытые ключи потенциальным
корреспондентам. Криптография с открытым ключом является мишенью самых разных атак с противником в середине или с подлогом, когда противник представляется отправителем, получателем
или сервером распределения ключей. Поэтому для PKC необходима тщательная аутентификация и верификация. Лицо, запрашивающее открытый ключ, должно доказать свою принадлежность той
же сети, что и получатель. Для сообщения, содержащего открытый
ключ, необходимо проверить, что оно поступило от сервера. Получателя необходимо аутентифицировать как при первом размещении
открытого ключа на сервере, так и при каждом последующем изменении. Если в сеть добавляется новая сторона, то авторизующее ее
лицо должно быть аутентифицировано. Когда на сервер добавляется новая сторона, необходимо аутентифицировать все вовлеченные
в процесс субъекты. Получатель должен проверять каждое полученное сообщение на предмет изменения или подмены третьей стороной. Все это приводит к обилию циркулирующих сообщений.
Для работы криптографии c секретным ключом все эти админист­
ративные хлопоты не нужны. Два человека могут обмениваться сообщениями, зашифрованными секретным ключом, ни привлекая
никого постороннего и не пользуясь системой-посредником. Когда несколько человек обмениваются такими сообщениями, нужно

38

Глава 2

Что такое криптография?

проверить лишь, что каждая сторона располагает текущим ключом.
Неавторизованное лицо не получит ключей и не сможет читать сообщения.
Обмен сообщениями – не единственное применение криптографии. Не менее важная роль – обеспечение секретности данных, хранящихся в компьютере, или на внешнем устройстве типа флешки,
или в облачном хранилище – часто в течение длительного времени.
Криптография с открытым ключом для этой цели не годится. Только
методы с секретным ключом пригодны для хранения файлов данных в секрете.
Когда нужно разослать сообщение сразу нескольким получателям,
сделать это с по­мощью методов с секретным ключом просто. Нужно
лишь, чтобы у каждой стороны был ключ. Можно было бы использовать специальный широковещательный ключ, отличный от персональных ключей участников. Или каждой стороне можно было бы
отправить ключ сообщения, воспользовавшись отдельным ключом
для передачи ключей. Для применения методов с открытым ключом
в этом случае нужно было бы получить открытые ключи всех получателей, выполнив всю необходимую авторизацию и верификацию.
Заранее организовать это невозможно, потому что участники вправе изменять свои открытые ключи в любой момент.
Самый распространенный метод с открытым ключом – RSA. Его
стойкость опирается на то, что в настоящее время очень трудно
разложить на множители большие числа (см. раздел 3.4). Сейчас не
существует практически осуществимого способа разложить на множители 200-значное десятичное число, не имеющее малых простых
множителей. Но когда станут доступны квантовые компьютеры, все
это изменится. Профессор MIT Питер Шор разработал квантовый
алгоритм, который без труда разложит на множители число такого
размера. Когда это случится, все зашифрованные RSA сообщения,
хранящиеся в компьютерах, можно будет прочитать.
Но пока что неизвестен способ применить квантовый компьютер
для вскрытия шифров с открытым ключом. Если вы озабочены появлением квантовых компьютеров, то криптография с открытым
ключом – единственный выбор.

2.7

Зачем создавать собственный шифр?
Если вы любитель шифров, то зачем создавать собственные шифры, понятно. Хобби у вас такое. Любители моделей поездов строят
и пус­кают по рельсам модели поездов. Любители авиамоделей строят и запускают в небо модели самолетов. А любители шифров строят
и взламывают шифры.
Если вы студент, изучающий криптографию, то построение собственного шифра – хорошее упражнение. Это лучший способ на-

Зачем создавать собственный шифр?

39

учиться создавать и оценивать шифры. Стандартный на текущий
момент шифр AES (раздел 11.5) не будет таковым вечно, и кому-то
придется проектировать ему замену. Если вы хотите принять учас­
тие в этой работе, то эта книга станет отличной отправной точкой.
Если вы профессиональный криптограф, отвечающий за защиту
данных и коммуникаций, то построение собственных шифров может
быть продиктовано здоровым скептицизмом по поводу того, так ли
безопасны одобренные государством шифры. С вашего позволения,
я расскажу одну историю, которая может оправдать такие сомнения.
В 1975 году IBM предложила шифр, ныне известный под названием DES (Data Encryption Standard). Ему предстояло стать мировым
стандартом шифрования с секретным ключом. Поначалу, на этапе
проектирования, ключ в DES имел длину 64 бита. Агентство национальной безопасности (АНБ) потребовало уменьшить длину ключа
до 56 бит, а оставшиеся 8 использовать как контрольную сумму.
В этом не было никакого смысла. Если контрольная сумма так
уж необходима, то следовало увеличить длину ключа с 64 до 72 бит.
Многие считали, что истинная причина такого требования заключалась в том, что АНБ знало, как вскрывать шифр с 56-битовым ключом, а вот читать сообщения, зашифрованные 64-битовым ключом,
не умело. Оказалось, что так оно и было.
Логично предположить, что АНБ никогда не одобрит стандарт
шифрования, который не сможет взломать. А раз так, то можно заключить, что АНБ умеет взламывать все варианты AES, улучшенного
стандарта шифрования. А если АНБ умеет взламывать AES, то вполне вероятно, что русские и китайцы тоже могут это делать.
В мире есть всего горстка экспертов, способных строить шифрыкандидаты, из которых потом выбираются мировые стандарты. Хорошо известно, что эти эксперты регулярно присутствуют на брифингах в штаб-квартире АНБ в Форт-Миде, штат Мэриленд. На этих
встречах сотрудники АНБ рекомендуют методы, с по­мощью которых
можно укрепить или ослабить шифры. Вполне возможно, что рекомендованные методы содержат, в частности, закладки, которые позволят АНБ и только АНБ легко вскрывать шифры. Допускаю также,
что АНБ могло предлагать должности, контракты и гранты на исследования, чтобы побудить экспертов принять эти уязвимые методы.
Конечно, все это лишь предположения, но криптографы обычно
очень осторожны. Если можно представить себе теоретическую слабость или уязвимость, то не важно, сумеет противник эксплуатировать ее на практике или нет, лучше будет защититься от нее.
Наконец, побудительным мотивом может быть повышенная скорость, простота реализации или более дешевое оборудование. Быть
может, вы хотите построить собственный шифр, чтобы достичь этих
целей, не жертвуя безопасностью. Описанные мной методы помогут
в этом.
Вместе с тем не забывайте о многочисленных подводных камнях.
Мало просто создать шифр и посчитать, что он «достаточно стой-

40

Глава 2

Что такое криптография?

кий». Во многих и многих шифрах обнаруживались неожиданные
слабости. Даже самый стойкий шифр может пасть жертвой ошибок
оператора, допустим: начинать каждое сообщение стандартным
заголовком, часто использовать ключи повторно или шифровать
одно и то же сообщение разными ключами и отправлять. Например,
многие немецкие сообщения во время Второй мировой войны были
вскрыты, потому что начинались словами «Хайль Гитлер».
В этой книге имеется вся информация, необходимая для построе­
ния невскрываемого шифра, но помните, что прочтение всего одной книги по криптографии не сделает из вас эксперта. Обязательно
укрепляйте свой шифр, применяя принципы, описанные в главе 12.

3

Предварительные
сведения

Краткое содержание главы:
биты и байты;
функции и булевы операторы;
„„ простые числа и модульная арифметика.
„„
„„

Прежде чем переходить к существу предмета, познакомимся с некоторыми понятиями. Я буду двигаться довольно быстро, потому что
сегодня этот материал преподают в школах даже не самого высокого
уровня. Дополнительные сведения будут приведены позже, по мере
необходимости.

3.1

Биты и байты
Данные хранятся в компьютерах в форме битов, или двоичных цифр.
Бит – это просто число, которое может принимать значения 0 или 1.
Бит может храниться в компьютере по-разному. Это может быть
замкнутое или разомкнутое реле. Или магнит, у которого северный
полюс ориентирован вверх или вниз. Свет может быть поляризован

42

Глава 3

Предварительные сведения

по часовой стрелке или против нее. Амплитуда электрического импульса может быть большой или малой.
Из двоичных цифр можно составлять двоичные числа. Ниже приведены 3-битовые двоичные числа и их десятичные эквиваленты.
Такие 3-битовые числа называются восьмеричными, т. е. это числа
в системе счисления по основанию 8.
000
001
010
011

=
=
=
=

0
1
2
3

100
101
110
111

=
=
=
=

4
5
6
7

Биты используются также для представления логических значений,
или значений истинности в компьютерной логике. 0 представляет
значение ложь, а 1 – значение истина.
Символ (или знак), например буква или цифра, может быть представлен 8-битовым двоичным числом – байтом. Термин байт был
предложен в 1954 году Вернером Бухгольцем из компании IBM. Поскольку у каждого бита два возможных значения, восьмью битами
можно представить 28 = 256 различных символов. Этого достаточно
для 26 строчных букв, 26 заглавных букв, 0 десятичных цифр, 33 знаков препинания, например = и $, а также ряда управляющих символов, таких как табуляция и перевод строки.
Существуют схемы, позволяющие представить дополнительные
символы, например кириллическую букву Ж, арабскую
и даже
китайский иероглиф ; для этого используется до 4 байт на одну
логограмму. Нас они интересовать не будут. Шифры могут работать
с любыми строками символов, что бы они ни означали. Совершенно
несущественно, что шифруемый байт – третий из 4 байт, представляющих китайский иероглиф.
Для наших целей важны три ипостаси байта: (1) это строка из 8 логических значений истина–ложь; (2) это 8-битовое двоичное число,
т. е. целое число от 0 до 255 включительно; (3) это представление
какого-то символа, например буквы, цифры, знака препинания, или
часть логограммы.

3.2

Функции и операторы
Математические функции теперь изучают в начальной школе, поэтому я уверен, что разжевывать это понятие не нужно, но полезно
поговорить о нотации и терминологии. Функция принимает одно
или несколько значений и порождает новое значение. Принимае­
мые значения называются входами, или аргументами, функции,
а возвращаемое – выходом, или результатом. Мы говорим, что для
порождения результата функция применяется к аргументам.

43

Булевы операторы

Функцию можно обозначать символом, например + или буквой.
Если используется символ, то он называется оператором, так что +
и × – операторы. Если функция имеет один аргумент, то символ можно поставить как перед аргументом, например –5 или 9, так и после
аргумента, например 5! (число 5 факториал, равное 1×2×3×4×5 = 120).
Если аргументов два, то символ ставится между ними, например 3+4
или 6×7. Если используется буква, то аргументы заключаются в скобки, например f(x). Здесь функция обозначена буквой f, а аргумент –
буквой x. Если аргументов несколько, то они разделяются запятыми,
например f(a,b,c). В некоторых книгах по языкам программирования проводится различие между аргументами и параметрами, но
нам это не важно.

3.3

Булевы операторы
Функции, а также операторы сложения, вычитания, умножения и т. д.
применяются к числам. Аналогично существуют функции, применяемые к битам, представляющим значения истинности. Эти функции
называются логическими, или булевыми, операторами в честь английского математика Джорджа Буля.
Если A и B – значения истинности, то логические функции not, and,
or и xor определяются следующим образом:
not A истинно, если A ложно, и ложно, если A истинно;
A and B истинно, если и A, и B истинны, и ложно в противном случае;
A or B истинно, если или A, или B, или оба одновременно истинны,
и ложно в противном случае;
A xor B истинно, если ровно одно из A и B истинно, и ложно в противном случае.
Иными словами, A xor B истинно, если A истинно и B ложно или
если B истинно и A ложно. Оператор xor называется ИСКЛЮЧАЮЩИМ ИЛИ. Обычно он обозначается символом ⊕. Операторы and
и or часто обозначаются символами ∧ и ∨ соответственно. Запомнить, что есть что, просто: символ ∧ для and похож на заглавную букву A без черточки.
Ниже приведены значения всех четырех булевых функций в таб­
личной форме.
and
00 0
01 0
10 0
11 1

or
00
01
10
11

0
1
1
1

xor
00 0
01 1
10 1
11 0

not
0 1
1 0

Эти четыре оператора можно распространить на строки битов –
нужно только применять их к парам соответственных битов. Если A

Глава 3

44

Предварительные сведения

равно 0011, строке четырех битов, представляющих значения ложь,
ложь, истина, истина, а B равно 0101, т. е. представляет логические
значения ложь, истина, ложь, истина, то применение булевых операторов дает:

A
B

and
0011
0101
0001

or
0011
0101
0111

xor
0011
0101
0110

not
0011
1100

Оператор
Первый операнд
Второй операнд
Результат

Оператор ИСКЛЮЧАЮЩЕЕ ИЛИ используется в криптографии
сплошь и рядом. Например, в простой реализации одноразового
блокнота (см. главу 14) он применяется к байтам сообщения и байтам гаммы:

Сообщение
Ключ

3.4

H
01001000

E
01000101

L
01001100

P
01010000

10101100
11100100

10001011
11001110

11000010
10001110

00111001
01101001

Открытый текст
Открытый текст
в кодировке UTF-8
Шифртекст

Системы счисления
В обычной арифметике числа записываются в десятичной нотации.
Эту нотацию изобрели индусы и арабы между V и VII веком. Поэтому
десятичные цифры называются также арабскими. Распространению
данной системы в Европе способствовал Леонардо Пизанский, в то
время больше известный как Фибоначчи.

Историческое отступление
Во времена Леонардо, приблизительно 1175–1250 гг., бешеной популярностью пользовались сдвижные головоломки (некоторые полагают, что
это то же самое, что игра в пятнашки, предположительно изобретенная
Нойесом Чапманом в 1874 году). Проводились публичные состязания
с денежными призами. В этом деле Леонардо достиг небывалых высот. Он
неизменно побеждал. Соперники в шутку прозвали его «Фибоначчи», т. е.
«везунчик», и Леонардо принял это прозвище. Имя Фибоначчи гремело по
всей Италии. В 1202 году он написал свою «Книгу абака» и хотел, чтобы
люди знали, что ее автор – знаменитый Фибоначчи. Считая недостойным
хвастливо заявлять об этом прямо, он написал на титульной странице Filius Bonacci, что могло означать как «Счастливый сын», так и «Сын Боначчи».
Более поздние авторы не поняли его намерения и отвергли саму мысль
о том, что великого Леонардо Пизанского можно называть везунчиком.
Они предположили, что Леонардо происходит из семьи Боначчи. По той

Системы счисления

45

же причине – напомнить читателям, что он и есть знаменитый Фибоначчи, – Леонардо в частных письмах иногда лукаво называл себя Леонардо
Боначчи (Счастливчик Леонардо).
Со временем имя и репутация Фибоначчи как гения головоломок были
забыты, и лишь в 1836 году библиофил и знаменитый книжный вор Гиль­
ельмо Либри сложил два и два и додумался, что Filius + Bonacci = Fibonacci. Термины «число Фибоначчи» и «последовательность Фибоначчи»
ввел в оборот французский математик Эдуард Люка в 1870 году.

Но вернемся к работе. Для объяснения десятичных чисел мы воспользуемся экспоненциальной нотацией. Слово«экспоненциальный»
означает, что число умножается само на себя заданное число раз.
Например, 53 означает, что 5 умножается на себя 3 раза, т. е. равно
5×5×5 = 125. В выражении BE, которое читается «B в степени E», B называется основанием, а E – показателем степени. Для любого числа
N выражение N1 равно самому N. По соглашению, N0 равно 1 для любого N, кроме 0. Выражение 00 не определено, потому что различные
способы его вычисления приводят к разным результатам.
Запись десятичного числа, или, иначе говоря, числа в системе счисления по основанию 10, например 3456, означает 3×1000 +
4×100 + 5×10 + 6×1. В экспоненциальной нотации это то же самое, что
3×103 + 4×102 + 5×101 + 6×100. Читаем справа налево: младшая цифра,
в данном случае 6, умножается на 1, следующая цифра, 5, умножается на 10, следующая на 102, затем на 103 и т. д. Если бы цифр было 50,
то старшая, самая левая, цифра была бы умножена на 1049.
Точно так же обстоит дело и в системах счисления по другому основанию. Например, в двоичной системе основание равно 2. Двоичное
число 11001 вычисляется как 1×24 + 1×23 + 0×22 + 0×21 + 1×20, или 16 +
8 + 0 + 0 + 1 = 25. В информатике часто используется основание 16, такая система счисления называется шестнадцатеричной. В такой системе цифрами являются 0123456789ABCDEF или 0123456789abcdef.
Я предпочитаю заглавные буквы ABCDEF, потому что при этом все
шестнадцатеричные цифры имеют одинаковую высоту, а так читать проще. Шестнадцатеричное число 9AB вычисляется как 9×162 +
10×161 + 11×160 = 9×256 + 10×16 + 11, т. е. 2475 в десятичной нотации.
Системы счисления по разным основаниям используются в криптографии, например, для преобразования текста в число. 26 букв латинского алфавита естественно ассоциируются с числами в системе
по основанию 26:
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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Слово WORK можно было бы записать в виде 22×263 + 14×262 +
17×26 + 10 = 396 588. С этим значением можно обращаться как с любым числом, в частности складывать, вычитать и умножать.

46

Глава 3

Предварительные сведения

Большие числа можно записывать в экспоненциальной нотации,
называемой также научной, например 1.23×107 = 12 300 000. Это то же
самое, что взять число 1.23 и перенести десятичную точку на 7 позиций вправо.

3.5

Простые числа
Целые числа, большие 1, бывают простыми и составными. Если число является произведением двух меньших чисел, то оно называется
составным, иначе простым. Перечислим первые составные числа:
4 = 2×2, 6 = 2×3, 8 = 2×4 и 9 = 3×3. И первые простые числа: 2, 3, 5, 7, 11.
Число 1 не является ни простым, ни составным.
Важное свойство простых чисел заключается в том, что любое
целое число можно записать в виде произведения простых, причем
единственным образом с точностью до порядка сомножителей. Например, поскольку 30 = 2×3×5, никакое простое число, кроме 2, 3 и 5,
не может быть делителем 30. Здесь 2, 3 и 5 называются простыми
множителями 30. Множество простых множителей любого целого
числа определено единственным образом. Его нахождение называется разложением на простые множители, или факторизацией.
Два целых числа A и B, не имеющих общих простых множителей,
называются взаимно простыми. Например, 20 и 27 – взаимно прос­
тые числа. Если N – целое число, то N и 1 всегда взаимно просты,
тогда как N и 0 взаимно просты, только когда N = 1. Числа N и N + 1
всегда взаимно просты.
Когда целое положительное число A, называемое делимым, делится на целое положительное число B, называемое делителем, то
в результате получается частное и остаток. Обозначим частное Q,
а остаток R. Тогда Q определяется как наибольшее целое число такое,
что QB не превосходит A, а остаток показывает, что осталось после
деления, т. е. R = A – QB. Отметим, что 0 ≤ R < N. Например, пусть
A = 40 и B = 11. Наибольшее целое кратное 11, не превосходящее 40,
равно 33, поэтому частное равно 3, т. к. 3×11 = 33. Остаток равен 7,
потому что 40 – 33 = 7.

3.6

Модульная арифметика
Изучение остатков от деления называется модульной арифметикой.
Модульную арифметику разработал Карл Фридрих Гаусс в Гёттингенском университете в 1801 году. В модульной арифметике частное
игнорируется, делитель называется модулем, а остаток – вычетом.
В примере выше модуль равен 11, а вычет 7. Два числа X и Y с одинаковым вычетом называются сравнимыми по модулю N. По-другому
говорят, что X и Y принадлежат одному классу вычетов по модулю N.

Модульная арифметика

47

Это записывается в виде X ≡ Y (mod N). Например, 40 ≡ 7 (mod 11),
так что 40 и 7 принадлежат одному классу вычетов по модулю 11. X
и Y сравнимы по модулю N тогда и только тогда, когда X – Y кратно
N, т. е. X = Y + aN для некоторого целого a.
Для классов вычетов действуют те же арифметические правила,
что для обычных целых чисел, например:
a+b ≡ b+a (mod N) и ab ≡ ba (mod N),
a+0 ≡ a (mod N), a–a ≡ 0 (mod N) и a×1 ≡ a (mod N),
(a+b)+c ≡ a+(b+c) (mod N) и a(bc) ≡ (ab)c (mod N),
a(b+c) ≡ ab+ac (mod N) и (a+b)c ≡ ac+bc (mod N).

Число –a называется аддитивным обращением a. Нотацию a – b
можно рассматривать как сокращенную запись a + (–b).
Ситуация с мультипликативным обращением сложнее. Для сравнения ax ≡ b (mod N) следует рассмотреть 3 случая: (1) a и N взаимно
простые, (2) a и N имеют общий множитель d, который не делит b,
(3) a, b и N имеют общий множитель d.
1 Пусть a и N взаимно просты. Тогда существует единственный
вычет a', являющийся мультипликативным обращением a по
модулю N, т. е. aa' ≡ 1 (mod N) и a'a ≡ 1 (mod N). Если a' существует, то сравнение ax≡b (mod N) легко решается, и решение имеет
вид x ≡ a'b (mod N). В разделе 15.3.2 я опишу эффективные способы вычисления a' при больших N.
2 Если a и N имеют общий множитель d > 1, то мультипликативного обращения a по модулю N не существует. Не может сущест­
вовать такого a', что aa' ≡ 1 (mod N). Если b не делится на d, то
сравнение ax ≡ b (mod N) не имеет решений. Например, у сравнения 4x ≡ 5 (mod 12) нет решений.
3 Пусть d – наибольший общий делитель (НОД, англ. gcd) a и N, который мы будем обозначать gcd(a, N). Это значит, что d – наибольшее целое число, на которое делятся a и N. Если a, b и N делятся на d, то сравнение можно сократить, разделив a, b и N на
d: (a/d)x ≡ (b/d) (mod N/d).
Рассмотрим пример. Возьмем сравнение 8x ≡ 4 (mod 12). Поделив все его элементы на 4, получаем сокращенное сравнение 2x ≡ 1
(mod 3). Его решением является x ≡ 2 (mod 3), т. е. x может быть любым целым числом вида 3n + 2. Вернемся к исходному сравнению;
x – вычет по модулю 12, поэтому должен находиться в диапазоне от
0 до 11 включительно. Числа вида 3n + 2, попадающие в этот диапазон, – 2, 5, 8 и 11. Это означает, то x может принимать любое из значений 2, 5, 8, 11. Поэтому сравнение 8x ≡ 4 (mod 12) имеет 4 решения.
Далее в этой книге mod используется как арифметический оператор. Выражение x mod y, где x – целое, а y – положительное целое
число, означает остаток от деления x на y. Таким образом, 27 mod 3 =
0, 27 mod 4 = 3, а 27 mod 5 = 2.

4

Инструментарий
криптографа

Краткое содержание главы:
система оценивания шифров;
подстановочные шифры;
„„ перестановочные шифры;
„„ фракционирование – разбиение букв на меньшие единицы;
„„ генераторы псевдослучайных чисел.
„„
„„

Шифры с секретным ключом строятся из нескольких базовых элементов. Их можно рассматривать как профессиональные инструменты. Чтобы построить стойкий шифр, нужно владеть всеми этими
инструментами. Это не значит, что в каждом шифре будет использоваться каждый элемент. Такой подход только привел бы к усложнению без какого-либо повышения безопасности. Шифр стал бы работать медленнее, но никакого выигрыша мы не получили бы. В этой
главе рассматриваются подстановки, перестановки, фракционирование и случайные числа. С другими инструментами мы познакомимся позже, например со сжатием текста – в главе 10, а со сцеплением блоков – в главе 11.
Прежде чем переходить к обсуждению элементов, поговорим
о стойкости. Стойкость шифра измеряется в битах. Каждый бит представляет двоичный выбор. Если бы существовал такой шифр, что
любой шифртекст представляет один из двух возможных открытых
текстов, то стойкость этого шифра была бы равна 1 биту. Например:

Система оценивания

49

0 = Мы проиграли.
1 = Мы выиграли.
Лимитирующим фактором при определении стойкости шифра
является длина ключа. Если используются ключи длиной 64 бита, то
стойкость шифра не может быть больше 64 бит, но для слабого шифра может оказаться меньше.
Инструментарий

Подстановка Перестановка
Фракционирование Случайные числа

4.1

Система оценивания
Чтобы помочь вам составить общее представление о стойкости описанных в книге шифров, я буду оценивать их по десятибалльной шкале. Это мое личное мнение, основанное на собственном опыте и анализе того, сколько усилий нужно приложить, чтобы вскрыть шифр
с применением лучших известных мне методов. Кроме того, я учитывал результаты сравнения шифров друг с другом и со старыми
шифрами, которые удалось или, наоборот, не удалось вскрыть. Я буду
знакомить вас с анализом, перед тем как приводить каждую оценку.
„„ Оценка 1 означает, что шифр может вскрыть даже новичок, не
имеющий никакой подготовки, вооружившись карандашом
и бумагой и приложив скромные усилия.
„„ Оценка 2 означает, что шифр может быть вскрыт опытным любителем, который не пользуется ничем, кроме карандаша и бумаги.
„„ Оценка 3 означает, что подготовленный криптограф-любитель
может вскрыть шифр, применяя только ручные методы.
„„ Оценки 4 и 5 означают, что необходим компьютер, подготовленный криптограф или то и другое.
„„ Оценки от 6 до 9 показывают, какая вычислительная мощность
была бы необходима противнику-специалисту.
„„ Оценка 10 означает, что шифр устоит против национального
криптографического агентства, располагающего множеством
профессиональных криптографов и самыми большими из современных суперкомпьютеров.
Иногда я выхожу за пределы этой шкалы. Оценка 0 означает, что
в шифре можно разобраться даже без карандаша и бумаги. Примерами может служить молодежный жаргон1 или текст УШИП АВОЛС
1

«Поросячья латынь», аналог нашего олбанского. – Прим. перев.

50

Глава 4

Инструментарий криптографа

ДЕРЕПАН МОДАЗ. Оценка 11 означает, что шифр нельзя будет вскрыть
даже с применением гипотетического будущего ультракомпьютера,
гораздо более мощного, чем квантовые компьютеры и суперкомпьютеры, которые мы можем вообразить сегодня.
Глядя на проставленные мной баллы, вы сможете уяснить, как оценивать другие шифры, которые в книге не упоминаются, или ваши
собственные. Имейте в виду, что баллы – это всего лишь оценка, а не
гарантия стойкости. Гарантии дает анализ, описанный в главе 12.

4.2

Подстановка
Первым инструментом в арсенале криптографа является подстановка.
Одна единица текста заменяется другой. Единицами открытого текста
могут быть буквы, пары букв или более длинные блоки. Единицами
шифртекста могут быть буквы, блоки букв, блоки цифр или комбинации букв и цифр. Если все единицы – одиночные буквы, то шифр называется простым подстановочным, или одноалфавитным. В компьютерной криптографии единицами могут быть биты, байты или блоки
битов либо байтов произвольной длины. В этом разделе приводится
лишь краткий обзор. Более полное обсуждение см. в главах 5 и 6.
Один из самых старых подстановочных шифров – шифр Цезаря,
который использовал и предположительно изобрел Юлий Цезарь.
Каждая буква алфавита заменяется буквой, отстоящей от нее на 3 позиции. В современных условиях число позиций может быть любым,
но фиксированным, и позиции могут отсчитываться как вперед, так
и назад. Шифру Цезаря присвоена оценка 1.
Единицы открытого текста необязательно должны быть одинаковой длины. Допустим, что шифр принимает буквы алфавита и подставляет вместо них пары цифр. В алфавите 26 букв, а возможных
пар цифр 100. Следовательно, 74 лишние пары криптограф может использовать для других целей. Так, на протяжении сотен лет, помимо
замены отдельных букв, практиковалась замена часто встречающихся пар букв, таких как TH, ER, ON, AS и NT, и, возможно, коротких слов
типа THE и AND. При таком подходе единицы открытого текста могут
состоять из 1, 2 и 3 букв, в результате чего распределение частот пар
цифр становится более равномерным. Различия в частотах встречаемости букв можно использовать для вскрытия шифра, поэтому чем
равномернее их распределение, тем выше стойкость шифра.
Другой подход – использовать лишние пары для дополнительных
подстановок часто встречающихся букв. Это называется омофонической подстановкой. Например, можно определить 10 подстановок
для буквы E, 8 – для буквы T и т. д. Различные подстановки для одной
буквы называются омофонами. Тут есть прямая аналогия с омофонами F и PH, которые в английском языке представляют один звук.
Наличие нескольких вариантов подстановки делает распределение

51

Подстановка

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

4.2.1

Коды Хаффмана
При использовании компьютеров блоками шифртекста могут быть
строки битов. Хороший пример дает кодирование Хаффмана, разработанное Дэвидом А. Хаффманом в 1952 году в бытность студентом
MIT. Я не будут останавливаться на методе оптимизации множества
кодов, а опишу лишь общую идею как пример двоичного кода переменной длины. В схеме Хаффмана часто встречающимся буквам сопоставляются короткие коды, а редко встречающимся – длинные.
Для принятия решения используется таблица частот букв. В результате для кодирования сообщения требуется меньше битов. Это называется сжатием текста. В разделе 10.7 описываются более эффективные методы сжатия.
В английском языке самыми частыми буквами являются E и T, на
каждую приходится примерно по 1/8 текста. Поскольку 8 = 23, для
представления E и T отведем по 3 бита. Эти 3-битовые значения
можно выбрать произвольно, скажем E = 100 и T = 111. Буду называть
этот метод «перемешанным методом Хаффмана». Следующими по
частоте являются буквы A, O, I, N, S, R, H. На каждую из них приходится примерно по 1/16 текста, так что для их представления будем
использовать по 4 бита. Можно взять любые 4-битовые коды, кроме
начинающихся с уже используемых комбинаций 100 и 111. Следующая группа букв – D, L, U, C, M, F, Y, на каждую из них приходится
примерно 1/32 текста, поэтому нужны 5-битовые коды. И так далее.
Ниже приведены перемешанные коды Хаффмана, созданные
мной на основе частот букв в англоязычном тексте, содержащем
150 000 букв. Для других языков результаты будут иными. Коды
Хаффмана обладают префиксным свойством, т. е. никакой код не является префиксом более длинного кода. Например, если abcd – код,
то abcde не может быть кодом ни при каком выборе двоичных цифр
a, b, c, d, e. Префиксное свойство впервые описал математик Эмиль
Леон Пост в 1920 году.
E
T
A
O
I
N
S
R
H

100
111
0001
0010
0011
0101
0110
0111
1010

D
L
U
C
M
F
Y
W
G

00000
01000
10110
10111
11000
11001
11011
000010
000011

P
B
V
K
X
Q
J
Z

010010
010011
110101
1101000
11010011
110100101
1101001000
1101001001

Глава 4

52

Инструментарий криптографа

При таких кодовых группах слово STYLE кодируется как 0110 111
11011 01000 100. Перегруппировав биты по четыре, получим 0110 1111
1011 0100 0100, или в шестнадцатеричном виде 6FB44.
Для Эмили почти невозможно идентифицировать кодовые группы отдельных букв в шифртексте, но она может поискать длинные
повторяющиеся строки битов. Они представляют часто встречающиеся пары букв, называемые биграммами, тройки букв – триграммы – или слова. Например, любая 10-битовая строка должна в среднем встретиться один раз в любой последовательности 210 = 1024 бит.
Если 10-битовая строка встречается 20 или более раз в строках длиной 1024 бита, то почти наверняка она представляет слово THE, самое частое в английском языке. Идентифицировав слово THE в текс­
те, можно затем поискать его продолжения, например THERE или
THESE; их легко найти благодаря повторению буквы E. Перемешанный код Хаффмана получает оценку 3.

4.3

Перестановка
Второй из важнейших криптографических инструментов – перестановка, т. е. изменение порядка символов в сообщении. Простейший
метод называется маршрутной перестановкой. Буквы сообщения
записываются в прямоугольник в одном порядке, а считываются
в другом порядке. В этом разделе мы лишь кратко познакомимся
с этим методом, а более полное описание отложим до главы 7.
Например, сообщение THERE IS NO LOVE AMONG THIEVES, состоящее из 25 букв, записывается в квадрат 5×5 по строкам слева направо, а считывается по столбцам сверху вниз. Самый левый столбец
содержит строку TIOOI.
T
I
O
O
I

H
S
V
N
E

E
N
E
G
V

R
O
A
T
E

E
L
M
H
S

Открытый текст:

THERE IS NO LOVE AMONG THIEVES

Шифртекст:

TIOOI HSVNE ENEGV ROATE ELMHS



Среди маршрутов записи букв в сетку и чтения их из сетки чаще
всего встречаются: по строкам (слева направо или справа налево), по
столбцам (сверху вниз или снизу вверх), по строкам с чередованием
направления, по столбцам с чередованием направления, по диагонали, начиная с любого угла, по диагонали с чередованием направления, по спирали (по часовой стрелке или против часовой стрелки).
Маршрутные перестановочные шифры получают оценку 1.

Фракционирование

4.4

53

Фракционирование
Фракционированием называется разбиение символов на меньшие
единицы. Мы уже видели один способ представления символа двоичным числом. С каждым битом этого числа можно производить
операции как с отдельной единицей, применяя к ним подстановки
и перестановки. В этом разделе дается краткое введение во фракцио­
нирование. Более подробное обсуждение см. в главах 9 и 10.
Классический способ представить букву двумя цифрами – квадрат
Полибия, придуманный во втором веке до нашей эры греческим
историком Полибием. Ниже показан квадрат 5×5, в котором используется смешанный алфавит с ключевым словом SAMPLE. Обратите
внимание, что буквы I и J занимают одну клетку, чтобы 26-буквенный алфавит уместился в квадрат с 25 клетками.

1
2
3
4
5

1
U
Z
L
F
N

2
V
S
E
G
O

3
W
A
B
H
Q

4
X
M
C
IJ
R

5
Y
P
D
K
T

Квадрат Полибия, перемешанный
ключевым словом SAMPLE

Поскольку буква A находится на пересечении строки 2 со столбцом 3, она представлена парой цифр 23. Аналогично B соответствует
33, C – 34 и т. д. вплоть до Z, представленной парой 21. Обе буквы I
и J представлены парой 44. К этим цифрам можно затем применять
подстановки, перестановки и перегруппировки. Пары цифр можно преобразовать обратно в буквы, используя эту сетку или другой
квад­рат Полибия, построенный в ином порядке.
В современных реалиях каждый символ нужно было бы заменить
его шестнадцатеричным представлением в кодировке ASCII или
UTF-8. Так, A = 41, B = 42, C = 43, …, Z = 5A. К этим шестнадцатеричным
цифрам можно точно так же применять подстановки, перестановки,
перегруппировки и в конечном итоге преобразовать снова в байты.
Любопытный пример фракционированного кода Морзе придумал
М. Э. Охавер (M. E. Ohaver) в 1910 году. Охавер всегда именовал себя
M.E., потому что не любил свое первое имя, Мерль.

Историческая справка
В сноске на странице 241 книги Craig Bauer «Secret History: The Story of
Cryptology» утверждается, что имя M. E. Ohaver было одним из псевдонимов плодовитого автора бульварных романов Кенделла Фостера Кроссена. Это неправда. Кроссен иногда подписывался псевдонимом M. E. Chaber – от слова mechaber, ‫רבחמ‬, которое на иврите означает «автор».

54

Глава 4

Инструментарий криптографа

Во фракционированном коде Морзе буквы собираются в группы
фиксированного размера, скажем 7, и заменяются их эквивалентами
в коде Морзе, а в качестве разделителя используется знак /. Затем
порядок длин кодовых групп меняется на противоположный и группы нового размера преобразуются назад в буквы.
E X
A M P
L
E
·/-··-/·-/--/·--·/·-··/·
1 4
2 2 4
4
1
1 4
4
4 2 4
1
·/-··-/·---/·-/-·/·-··/·
E X
J
A N L
E

Открытый текст
Эквивалентные коды Морзе
Длины кодовых групп
Длины в обратном порядке
Перегруппированные коды Морзе
Эквивалентные буквы

Код Морзе изобрел Альфред Вайль в 1840 году и назвал его по имени своего работодателя Самуэля Ф. Б. Морзе.
Слабости этого шифра очевидны. Поскольку в нем используется
стандартная азбука Морзе, единственным ключом является длина
группы букв, которую можно подобрать за несколько попыток. Буквы открытого текста часто заменяются ими же. Всего существует
30 разных кодовых групп Морзе, но букв только 26, так что нужны
еще четыре символа. Охавер взял немецкие буквы ä, ë, ö и ü. Фракционированный код Морзе получает оценку 1.
Частично упомянутые проблемы можно решить, внеся два изменения: (1) использовать только группы Морзе с длинами 1, 3 и 4.
Таких групп 26, ровно столько, сколько букв в латинском алфавите;
(2) перемешать алфавит или, что эквивалентно, перемешать кодовые
группы. Я называю эту улучшенную версию ФР-акционированным
кодом Морзе. Например, если воспользоваться для перемешивания
алфавита ключевым словом MIXEDALPHBT и сохранить стандартный порядок групп Морзе, то получится следующее:
M
I
X
E
D
A
L

·
···
···-·
·--··

P
H
B
T
U
V
W

-·--·
--····
·····-·
··--

Y
Z
C
F
G
J
K

·-··
·-··--·
·---···
-··-·-·

N
O
Q
R
S

-·---··
--·---·
----

Но даже с этими улучшениями ФР-акционированный код Морзе
получает только оценку 2.

4.5

Генераторы случайных чисел
Генератором случайных чисел может быть что угодно, порождающее последовательность чисел в заданном диапазоне. Числами мо-

Генераторы случайных чисел

55

гут быть одиночные биты, 8-битовые байты, десятичные цифры или
числа из любого другого диапазона. Например, для криптографических целей полезны числа в диапазоне от 0 до 25, соответствующие
26 буквам алфавита. В этом разделе приводится только введение
в тему. Полное обсуждение см. в главе 13.
Важно понимать, что нет такой вещи, как «случайное число».
Нельзя сказать, что 51 – случайное число, а 52 – не случайное, или
наоборот. Но можно сказать, что последовательность 51, 52, 53, 54, …
не случайна, т. к. она вполне предсказуема. Случайность – свойство
последовательности или генератора, но не отдельных членов последовательности. Правильнее говорить «случайная последовательность чисел», а не «последовательность случайных чисел».
Генератором может быть физический процесс, например космические лучи, отсчеты счетчика Гейгера, точное время нажатий клавиш на клавиатуре, флаг, развевающийся на ветру, брызги волн или
люди, спешащие на электричку. Физические источники в большинстве своем недостаточно быстры для криптографических целей, однако последовательность чисел можно сохранить в компьютерном
файле для последующего использования.
Генератором может быть также математическая функция или
компьютерная программа, которая при каждом вызове порождает
число. Случайные числа, порождаемые математическими алгоритмами, называются псевдослучайными, чтобы отличить их от истинно
случайных чисел. Они считаются слабее истинно случайных чисел,
потому что противник, знающий часть случайной последовательности, теоретически может вычислить предыдущие и последующие
числа и таким образом прочитать сообщение. Истинно случайные
числа никогда не порождаются математической функцией. В разделе 13.8 я представлю методы генерирования криптографически
безопасных последовательностей псевдослучайных чисел, спроектированные так, чтобы не дать противнику продолжить участок последовательности.
Одним из главных различий между последовательностями псевдослучайных и истинно случайных чисел является то, что псевдослучайные последовательности рано или поздно повторяются,
тогда как истинно случайные не повторяются никогда. Количество
членов последовательности, после которого начинается повторение, называется периодом. Например, период последовательности
3,1,9,2,4, 3,1,9,2,4, 3,1,9,2,4, 3, ... равен 5, повторяющаяся часть подчеркнута. В общем случае чем период длиннее, то более стойким
является шифр.
Из того, что последовательность чисел случайна, еще не следует,
что все числа равновероятны. Например, предположим, что мы записываем цвета автомобилей, едущих по мосту с оживленным движением. Цвета случайны, но некоторые встречаются чаще других.
Белые, черные, серебристые и красные машины встречаются гораздо чаще оранжевых, цвета фуксии или зеленовато-желтых. Анало-

56

Глава 4

Инструментарий криптографа

гично, при игре в кости (при условии что кости геометрически правильные) результат каждого броска случаен, но выпадение суммы 7
в шесть раз вероятнее, чем суммы 12.
В разделах 13.14.1 и 13.14.2 мы обсудим, как, воспользовавшись
случайностью таких последовательностей, получить последовательности, в которых все числа встречаются практически с одинаковой
вероятностью. Поэтому в дальнейшем я буду предполагать, что любой генератор случайных чисел порождает равновероятные числа.
Если генератор хороший, то пары, тройки и т. д. сгенерированных
чисел тоже будут распределены равномерно.

4.5.1

Цепной генератор цифр
В заключение этого раздела я хотел бы показать простой генератор
псевдослучайных чисел, который легко реализовать с по­мощью карандаша и бумаги. Компьютер вообще не нужен. Назовем его цепным генератором цифр. Сначала выпишем какое-нибудь 7-значное
десятичное число. Эти 7 цифр будем называть начальным значением, или вектором инициализации. Можно считать, что это ключ или
часть ключа шифра, в котором используется данный генератор. Для
получения первой псевдослучайной цифры сложим первую и последнюю цифры. Допишем новую цифру в конец последовательности, а первую цифру закрасим. Так, если вначале была последовательность 3920516, то мы дописываем цифру 3+6 = 9.
3920516
39205169

Если сумма цифр превышает 9, то оставляем только разряд единиц. То есть сложение производится по модулю 10. Для получения
второй псевдослучайной цифры процесс повторяется. В данном случае 9+9 = 18. Отбрасываем разряд десятков и получаем цифру 8.
39205169
392051698

Этот процесс можно повторять для получения любого желаемого
количества псевдослучайных десятичных цифр.
3920516980056219
3
920516980056219 9940232...

В результате имеем
9800562199940232....

псевдослучайную

последовательность

57

Генераторы случайных чисел

Заметим, что если все цифры начального числа четные, то и все
сгенерированные цифры будут четными. Аналогично, если все начальные цифры делятся на 5, т. е. равны 0 или 5, то все сгенерированные цифры будут делиться на 5. В этом случае период не может быть
больше 128, потому что начальное значение было 7-значным, а различных комбинаций из семи цифр 0 и 5 существует всего 27 = 128.
Поскольку такие начальные значения не могут порождать последовательности с длинным периодом, они называются неподходящими. Для цепного генератора цифр подходящее начальное значение
должно содержать по меньшей мере одну нечетную цифру и одну
цифру, не делящуюся на 5. Например, начальное значение 2222225
подходящее, а 2222222 и 5555555 неподходящие. При подходящем
начальном 7-значном значении период всегда равен 2 480 437.
Это пример типичного кустарного генератора псевдослучайных
чисел. Существует 107 возможных 7-значных начальных значений.
Если начать с произвольного начального значения, то генератор будет
порождать какую-то последовательность, пока снова не встретится
данное значение, после чего последовательность будет циклически
повторяться. Поэтому множество всех 7-значных чисел распадается
на несколько дискретных циклов, каждый со своим периодом. Если
выбрать подходящее начальное значение, то цикл всегда будет иметь
максимально возможный период 2 480 437. Существует 4 разных цикла такой длины плюс несколько гораздо более коротких циклов, порождаемых неподходящими начальными значениями.
Для начальных значений другой длины поведение аналогично.
Даже когда максимальный цикл очень короткий, все равно вероятность получить максимальный цикл часто бывает высокой, потому
что максимальных циклов может быть много. В следующей таблице
приведены вероятности получить цикл заданной длины при выборе
подходящего начального значения.
Число цифр Период
4
5
6
7
8
9
10

1560
168
196 812
2 480 437
15 624
28 515 260
не менее 2 851 526
1 736 327 236
не менее 248 046 748
не менее 13 671 868

Вероятность
100 %
86,7 %
99,974 %
100 %
98,817 %
79,999 %
99,9988 %
86,9 %
99,31 %
100 %

Из таблицы видно, что начальные значения длиной 5 и 8 не­
безопасны, поскольку доля очень коротких циклов высока. Наилучший результат дают начальные значения длиной 7 и 10, потому что
для них длинный период гарантирован.

58

Глава 4

Инструментарий криптографа

Этот пример генератора случайных чисел приведен только для
демонстрации с целью показать, чего можно достичь с по­мощью
простых ручных методов. Для задач, требующих высокого уровня
безопас­ности, такой генератор не годится.

4.6

Полезные комбинации, бесполезные
комбинации
Описанные в этой главе четыре метода можно комбинировать многочисленными способами, которые я и буду исследовать далее в этой
книге. Но важно с самого начала понять, что не каждая комбинация
приносит пользу. Некоторые лишь увеличивают объем работы, не
повышая стойкость шифра.
Рассмотрим идею, которая привлекает некоторых начинающих:
выполнить простую подстановку для сообщения, затем вторую
прос­тую подстановку для результата, затем еще одну и так далее
на протяжении, скажем, 5, 10 или даже 100 раундов. Это бесполезная трата времени. Две простые подстановки эквивалентны одной,
только с другим перемешанным алфавитом, поэтому выполнение
большого числа простых подстановок не повышает стойкость. Приведу иллюстрацию. Возьмем две постановки с ключами FIRST и SE­
COND. Их выполнение друг за другом эквивалентно выполнению
третьей подстановки.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
XYZFIRSTABCDEGHJKLMONPQUVW

Первая подстановка

ABCDEFGHIJKLMNOPQRSTUVWXYZ
UVWXYZSECONDABFGHIJKLMPQRT

Вторая подстановка

ABCDEFGHIJKLMNOPQRSTUVWXYZ
QRTZCIJKUVWXYSEONDAFBGHLMP

Эквивалентная

Проверим на примере. Зашифровав слово EXAMPLE с по­мощью первой подстановки, получим IUXEJDI. Зашифровав IUXEJDI с по­мощью
второй подстановки, получим CLQYOXC. Можете сами проверить, что
в результате шифрования EXAMPLE с по­мощью эквивалентной подстановки тоже получается CLQYOXC.
Выполнение двух операций шифрования друг за другом называется композицией. Рассмотренный выше пример показывает, что
композиция двух простых подстановок сама является простой подстановкой. Если результатом первого шифрования является какой-то
код, то последующее применение к нему шифра называется перешифрованием, или многократным шифрованием. Самой распространенной формой перешифрования является сложение без переноса, или
сложение по модулю 10, которое работает следующим образом:

59

Полезные комбинации, бесполезные комбинации
Ключ перешифрования
Кодовые группы открытого текста
Перешифрованные кодовые группы

12155 12155 12155 12155
61587 02954 70069 53028
73632 14009 82114 65173

4.6.1

Шифр Базери типа 4
Рассмотрим противоположный случай – шифр, в котором выполнение шага перестановки после шага подстановки порождает гораздо
более стойкий шифр.
Этот шифр был предложен блестящим, запальчивым и бранч­
ливым французским криптографом Этьеном Базери в 1898 году.
Я не знаю, какое название сам Базери дал своему шифру. Я назвал
его шифром Базери типа 4, потому что это последний из четырех
шифров, предложенных вниманию шифровального отделения на
протяжении 1890-х годов. Шифрование легко выполняется вручную.
Шифр Базери типа 4 состоит из простой подстановки, за которой
следует простая перестановка. Такую операцию я называю кусочным
обращением. Перестановка меняет порядок букв в коротких участках
текста на противоположный согласно ключу, представляющему собой последовательность малых целых чисел. В примере ниже ключевое слово BAZERIS используется для перемешивания подстановочного алфавита, а ключ 4, 2, 3 – для перестановки.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
HGFDCBAZERISYXWVUTQPONMLKJ

Алфавит открытого текста
Алфавит шифртекста

THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG
PZCUOEFIGTWMXBWLROYVQWNCTPZCSHJKDWA

Открытое сообщение
После подстановки

4
2 3
4
2 3
4
2 3
4
2 3
PZCU OE FIG TWMX BW LRO YVQW NC TPZ CSHJ KD WA
UCZP EO GIF XMWT WB ORL WQVY CN ZPT JHSC DK AW

Ключ перестановки

UCZPE OGIFX MWTWB ORLWQ VYCNZ PTJHS CDKAW

 ифртекст,
Ш
сгруппированный по 5

Конечный шифртекст

Перестановку такого типа можно использовать для укрепления
шифров разных типов, поэтому она заслуживает отдельного названия. Ее можно укрепить, оставив несколько участков текста в исходном порядке. Для определения таких участков можно, например,
задавать отрицательный ключ. В следующем примере используeтся
числовой ключ 3, 4, –3, 2. Отметим, что он эквивалентен ключу 3, 4,
1, 1, 2.
3
4
-3 2
THE QUIC KBR OW
EHT CIUQ KBR WO

3
4
-3 2
NFO XJUM PSO VE
OFN MUJX PSO EV

3
4
-3 2
RTH ELAZ YDO GS
HTR ZALE YDO SG

Ключ перестановки
Конечный шифртекст

60

Глава 4

Инструментарий криптографа

Криптографы из шифровального отделения не смогли вскрыть ни
одно из сообщений, предложенных Базери. Несмотря на все усилия,
сообщения оставались нерасшифрованными 40 лет, пока знаменитый архитектор и криптограф-любитель Розарио Кандела не вскрыл
шифр и не написал книгу о том, как он это сделал («The Military Cipher of Commandant Bazeries», Cardanus Press: New York, 1938).
Однако Кандела не сумел дешифрировать сообщения непосредственно. Вместо этого он нашел и воспользовался слабостью в использованном Базери способе генерирования подстановочного алфавита по ключу. Если бы Базери применил более стойкий метод
перемешивания алфавита, то Кандела не смог бы дешифрировать
сообщения. Таким образом, шифр Базери типа 4 с хорошо перемешанным алфавитом получает оценку 5. Неплохо для комбинации
двух методов, получивших оценку 1.

Историческая справка
Кандела окончил Колумбийскую школу архитектуры, поэтому планировал
напечатать книгу в издательстве Колумбийского университета. Но Виль­
ям Ф. Фридман, тогдашний глава американских криптологов, прознал об
этом и тайно воспрепятствовал публикации. Это еще одно свидетельство
в пользу стойкости шифра Базери типа 4.

5

Подстановочные шифры

Краткое содержание главы:
простые и многоалфавитные подстановочные шифры;
„„ вскрытие многоалфавитных шифров с по­мощью метода
Касиски и индекса совпадения;
„„ шифры с автоключом и с бегущим ключом и методы их
вскрытия;
„„ моделирование роторных шифровальных машин.
„„

Теперь мы готовы к углубленному исследованию основных инструментов, описанных в предыдущей главе. Прежде чем переходить
к описанию разнообразных шифров, я хочу явно сформулировать
цели, которых эти шифры пытаются достичь. Голландский лингвист
и человек энциклопедических познаний, Огюст Керкгоффс, впервые
назвал эти цели в двух статьях, опубликованных в журнале «Journal
des Sciences Militaires» в 1883 году.
1 Шифр должен быть невскрываемым если не в теории, то на
практике.
2 Это должно оставаться верным, даже если система попала в ру­
ки врага.
3 Ключ должен быть легко запоминаемым (без бумажных записей) и легко изменяемым.

62

Глава 5

Подстановочные шифры

4 Зашифрованные

сообщения должны быть пригодны для передачи по телеграфу.
5 Оборудование и документы должны быть легко переносимы,
для работы с системой должно быть достаточно одного чело­
века.
6 Шифр должен быть прост в использовании, не требуя сложных
правил или вычислений.
Правило 4 можно изменить: «Зашифрованные сообщения должны быть пригодны для передачи в цифровом виде», а в остальном
эти принципы сохраняют свою актуальность.
Из второго принципа следует, что стойкость шифра должна определяться только ключом. Керкгоффс также считал, что лишь криптографы обладают необходимой квалификацией, чтобы судить
о стойкости шифра. Слишком часто решение о том, какой шифр
использовать, принимается чиновниками, не имеющими опыта
в криптографии, что иногда приводит к катастрофическим последствиям.

5.1

Простая подстановка
Простая подстановка, называемая еще одноалфавитной, – хорошо
знакомый тип шифра, который часто встречается в отделах головоломок в газетах и журналах. Каждая буква алфавита заменяется
другой буквой, причем заменяющая буква всегда одна и та же. Так,
если буква M была заменена буквой T в одном месте, то любая буква M в сообщении будет заменена буквой T, и каждая T в шифртексте
будет представлять M.
Поскольку большинство знакомо с методами вскрытия простых
подстановочных шифров, я лишь кратко упомяну их: частота букв,
частота начальных букв, частота конечных букв, частота двойных
букв, частота пар букв, короткие слова, общие префиксы и суффиксы, распределение гласных и согласных, слова с характерной структурой, использование знаков препинания.
Для простых криптограмм, публикуемых в газетах, достаточно
лишь взглянуть на короткие слова. Если встретились AB и CBA, то,
скорее всего, они соответствуют словам TO и NOT, тогда как AB и BAC
чаще всего соответствуют OF и FOR. Строка ABCA – это, вероятно,
THAT, ABCDC – THERE, а ABCDB – WHICH. В интернете можно купить
списки слов с характерной структурой, и есть сайты, которые ищут
слова по заданному вами образцу.
Для более сложных криптограмм, например текстов вроде FOXY
PIXY MANX AXED TOXIC LUXURY ONYX SPHINX, необходим более методичный подход.
Я продемонстрирую процедуру на примере показанной ниже
криптограммы. Известно, что язык английский. В тексте 73 буквы
и 11 слов со средней длиной слова 6.64 буквы, а не 5.0, как в обыч-

63

Простая подстановка

ном англоязычном тексте. Отсутствие коротких слов длиной меньше
5 букв и слов с характерной структурой наводит на мысль, что криптограмма намеренно сделана трудной.
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
KSYIWZ, ZLORUS LOBZQC SQXMV

Первый шаг – идентифицировать гласные и согласные. Начнем
с подсчета числа вхождений каждой буквы алфавита, чтобы получить их частоты. В нашей криптограмме нет букв A, три буквы B,
три буквы C и т. д. Полный перечень частот представлен ниже:
A-0
J-0
S-7

B-3
K-4
T-0

C-3
L-8
U-3

D-2
M-2
V-5

E-4
N-0
W-3

F-0
O-5
X-3

G-3
P-0
Y-4

H-0
Q-4
Z-3

I-3
R-4

Заметим, что есть всего две высокочастотные буквы, L и S, их час­
тоты равны соответственно 8 и 7. В обычном англоязычном тексте
примерно 40 % букв – гласные. Эта доля стабильна и, как правило, выдерживается даже тогда, когда частоты букв подвергались сознательным манипуляциям. В криптограмме, содержащей 73 буквы, должно
быть 29 гласных. Отсюда следует, что L и S – скорее всего, гласные,
если только частотность букв не была значительно искажена.
Далее составим схему контактов, для чего выпишем буквы алфавита сверху вниз по центру страницы. Каждой букве, встречающейся
в криптограмме, отведем строку. В каждой строке буквы, непосредственно предшествующие центральной, записываются слева от нее,
а непосредственно следующие за ней – справа. Например, первая
строка схемы, EO B DWZ, означает, что букве B в криптограмме по одному разу предшествуют E и O, а после нее встречаются D, W и Z, тоже
по разу. Ниже показана схема контактов целиком (в 3 столбца, чтобы
сэкономить место).
EO
LMQ
XB
LLLL
IX
KY
E

B
C
D
E
G
I
K

DWZ
R
OV
YYBK
VXQ
VGW
LVIS

UYKVWQZ
VX
DQLLL
VGZS
COO
YRVUKU
RWR

L
M
O
Q
R
S
U

ECEEEOOO
CV
RWRB
OLCX
USU
YQ
LSS

GDKIM
BOI
YGQ
EES
WB

V
W
X
Y
Z

LSMQ
LUZ
DGM
SLXI
LQ

Схема контактов нужна для идентификации гласных и согласных.
В общем случае гласные контактируют с более широким множест­
вом букв слева и справа, тогда как у согласных обычно ограниченное
количество различных контактов. Построенная схема контактов позволяет идентифицировать 4 вероятные гласные, L, Q, S и V, и 4 вероятные согласные, E, O, R и U. Обозначим ° гласные буквы, а × согласные и посмотрим, правдоподобно ли получившееся распределение.

Глава 5

64

Подстановочные шифры

RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
××°×-° -°-×° -°×---× -°°×--°° --°×-°-- -°°×× -----°°×-×°
KSYIWZ, ZLORUS LOBZQC SQXMV
-°---- -°×××° °×--°- °°--°

Мы видим 3 длинных участка без единой гласной: в третьем слове,
EYXDO, в седьмом слове, KIGXG, и в восьмом слове, YIWZ. Это позволяет предположить, что I и (или) X может быть гласной. У обеих много разных контактов, но крайне маловероятно, что X представляет
гласную, потому что тогда слово 11 начиналось бы тремя гласными
и заканчивалось гласной. В английском языке такое бывает редко.
Единственный известный мне пример – OUIJA. (SQXMV не может совпадать с AIOLI из-за повторяющейся I.) Поэтому I – скорее всего,
гласная, а X – согласная.
Перейдем ко второму этапу разделения гласных и согласных.
В шифртексте имеется пять пар предположительных гласных, VL, VS,
VQ, QL и SQ. Пары гласных – нечастое явление в английском языке, поэтому вполне вероятно, что либо V, либо Q действительно согласная.
Скорее всего, это не Q, потому что тогда слово 10 заканчивалось бы
пятью согласными. Я знаю только одно такое 6-буквенное слово –
ANGSTS.
Допустим, что I – гласная, V и X – согласные, и посмотрим, что при
этом получается.
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
××°×-° -°-×° -°×-×-× -×°×--×° --°×-×-- °×°×× -°-×-°°×-×°
KSYIWZ, ZLORUS LOBZQC SQXMV
-°-°-- -°×××° °×--°- °°×-×

Похоже на правду. Теперь в слове 3 можно идентифицировать D
как гласную, а из слова 11 следует, что M – вероятно, согласная. Итак,
мы нашли все шесть гласных, поэтому все остальные буквы должны
быть согласными. Ниже приведен окончательный результат разбиения на гласные и согласные.
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
××°××° ×°××° ×°×××°× ××°××°×° ××°×××°× °×°×× ×°×××°°×××°
KSYIWZ, ZLORUS LOBZQC SQXMV
×°×°××, ×°×××° °×××°× °°×°×
××
°°°
××
°°°°
°×
××
×

B
C
D
E
G
I
K

°××
×
××
××××
××°
×××
°×°°

×××××°×
××
°°°°°
×××°
×××
××××××
×××

L
M
O
Q
R
S
U

×××××××××
××
××××
×°××
×°×
×°
°°°

×°×°°
××°
××°
××°
××

V
W
X
Y
Z

°°°°
°××
°×°
°°×°
°°

Простая подстановка

65

Второй шаг – идентификация отдельных букв. В таблице контактов букв ниже показаны контактные характеристики букв в английском языке. У других языков характеристики иные. Например, для
букв M, V и Z чаще всего с обеих сторон находятся гласные, а букве N
обычно предшествует гласная, а за ней следует согласная. Я построил эту таблицу, воспользовавшись корпусом англоязычных текстов
из проекта Гутенберга.
Таблицаконтактов букв
После
До
Гласные
Те и другие
Согласные

Гласные

Те и другие

Согласные

MVZ
BJQW
H

RX
CDFGLPST
Y

N
AEIOU

В этой криптограмме есть хороший кандидат на роль буквы H
в открытом тесте – буква U в шифртексте. Однако U дважды встречается в биграмме US в конце слов, так что это маловероятно. Есть два
хороших кандидата на роль N – буквы E и O в шифртексте. Та и другая представляют согласные, которым всегда предшествуют гласные
и за которыми следуют согласные. Однако O более вероятна, потому
что у нее выше частота и потому что ей предшествуют две известные
согласные в слове ZLORUS. В английском языке сочетания трех согласных часто начинаются с буквы N, например NST или NTH. Скорее всего,
O представляет N. Тогда получаем:
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
××°××° ×°××° ×°×××°N ××°××°×° ××°×××°× °×°N× ×°×××°°N××°
KSYIWZ, ZLORUS
×°×°××, ×°N××°

LOBZQC
°N××°×

SQXMV
°°×°×

Теперь можно попытаться найти слова, соответствующие этим
образцам. Я нашел 67, отвечающих образцу ×°N××° (ZLORUS). Из них
32 оканчиваются на E, а 27 – на Y. Я нашел 37 слов, отвечающих образцу °°×°× (SQXMV) и не содержащих N. Из них 15 начинаются с Y,
но только 1 начинается с E. Поэтому весьма вероятно, что букве S
в шифртексте соответствует Y в открытом тексте. Это дает:
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
××°××Y ×°××Y ×°×××°N ××°××°×Y ××°×××°× °×°N× ×°×××°°N××Y
KSYIWZ, ZLORUS LOBZQC SQXMV
×Y×°××, ×°N××Y °N××°× Y°×°×

Слова шифртекста IVQOR и ZLORUS содержат биграмму OR. Попробуем идентифицировать ее. Мы знаем, что слово IVQOR, имеющее вид
°×°N×, не содержит буквы Y; это оставляет всего 24 вероятных слова.

66

Глава 5

Подстановочные шифры

Из них 12 оканчиваются на G, а 8 на S, поэтому шифртекст OR – скорее
всего, либо NG, либо NS. Количество вероятных слов открытого текс­
та для слова ZLORUS, имеющего вид ×°N××Y, теперь сократилось до 26.
Среди них четвертая буква в 8 случаях равна G, в 6 случаях T и всего
в одном случае S. Поэтому самая вероятная расшифровка шифртекста OR – открытый текст NG. Теперь мы имеем:
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
G×°××Y ×°×GY ×°×××°N ××°××°×Y ××°×××°× °×°NG ×°×××°°N××Y
KSYIWZ, ZLORUS LOBZQC SQXMV
×Y×°××, ×°NG×Y °N××°× Y°×°×

Для первого слова, RULEYS, есть 8 возможностей. Среди них только 6 вариантов расшифровки биграммы UL. Для каждого из них рас­
смот­рим, что получается для слова ZLORUS.
UL
HO
LU
NA
RI
RO
RU

RULEYS
GHOSTY
GLUMPY
GNARLY
GRIMLY
GRISLY
GROSZY
GROWLY
GRUMPY

ZLORUS
нет
JUNGLY
нет
нет
нет
нет
нет
HUNGRY

Вариант ZLORUS=JUNGLY можно исключить, потому что тогда слово
KSYIWZ имело бы вид ×Y×°×J. Такого слова в английском языке нет.
Следовательно, RULEYS расшифровывается как GRUMPY, а ZLORUS –
как HUNGRY. Вставив новые буквы, получаем:
RULEYS YLCRS KLEYXDO GVLEBDVS BWLEKVMC IVQOR KIGXGQLOWUS
GRUMPY PU×GY ×UMP×°N ××UM×°×Y ××UM××°× °×°NG ×°×××°UN×RY
KSYIWZ, ZLORUS LOBZQC SQXMV
×YP°×H, HUNGRY UN×H°× Y°×°×

Остальные буквы можно заполнить, просто подбирая слова зрительно. Очевидно, что второе слово – PUDGY, а третье – BUMPKIN.
Тогда восьмое слово – BYPATH и т. д. Целиком криптограмма расшифровывается как GRUMPY PUDGY BUMPKIN CLUMSILY STUMBLED
ALONG BACKCOUNTRY BYPATH, HUNGRY UNSHOD YOKEL.
Простой подстановочный шифр получает оценку 1. Но если час­
тоты букв и контактов намеренно искажены, как в рассмотренном
примере, то оценка может быть повышена до 2 и даже до 3. Хорошо
для головоломок, но бесполезно для передачи данных в общем случае.

67

Перемешивание алфавита

5.2

Перемешивание алфавита
Для простых подстановок нужен перемешанный алфавит. Есть несколько традиционных методов перемешивания, для которых хватает карандаша и бумаги. Один из них – воспользоваться ключевым
словом. В простейшем случае мы просто записываем ключевое слово, начиная с какой-то позиции, а затем дописываем остаток алфавита после него, возвращаясь к началу по достижении конца. Оставшиеся буквы можно записывать в прямом или в обратном порядке.
Вот три примера:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
UVWXYZSAMPLEBCDFGHIJKNOQRT

Открытый текст
Шифртекст

ABCDEFGHIJKLMNOPQRSTUVWXYZ
HGFDCBSAMPLEZYXWVUTRQONKJI

Открытый текст
Шифртекст

ABCDEFGHIJKLMNOPQRSTUVWXYZ
XYZBCDSAMPLEFGHIJKNOQRTUVW

Открытый текст
Шифртекст

Впервые этот метод был использован семьей Ардженти, члены
которой служили секретарями-шифровальщиками у нескольких пап
и епископов где-то в 1600 году. Полученные таким образом алфавиты были недостаточно хорошо перемешаны. В улучшенном методе
используются два ключевых слова, например:
KLMNOPQUVWXYZFIRSTABCDEGHJ
HJFBASECONDZYXWVUTRQPMLKJI

Открытый текст
Шифртекст

Столбцовое перемешивание
Разместить алфавит в прямоугольном блоке. Записать ключевое
слово в верхней строке, а остаток алфавита пусть занимает столько строк, сколько необходимо. Чем длиннее слово, тем лучше перемешивание. Затем прочитать буквы в блоке по столбцам. В примере
ниже ключевое слово SAMPLE записано в верхней строке. Первый
столбец, прочитанный сверху вниз, дает SBIRY, второй столбец –
ACJTZ и т. д. Если хотите, можете чередовать чтение сверху вниз
и снизу вверх или использовать другие маршруты.
SAMPLE
BCDFGH
IJKNOQ
RTUVWX
YZ

Чтение сверху вниз:

SBIRY ACJTZ MDKU PFNV LGOW EHQX

С чередованием:

SBIRY ZTJCA MDKU VNFP LGOW XQHE

По диагонали:

Y RZ IT BJU SCKV ADNW MFOX PGQ LH E

Глава 5

68

Подстановочные шифры

SkipMix
В школе я придумал еще один метод, пригодный для криптографии
с карандашом и бумагой, который назвал SkipMix. В нем в качестве
ключа для перемешивания алфавита используется строка небольших чисел, называемых пропусками (skips), например 3, 1, 4. Начать
со стандартного алфавита. Пропустить 3 буквы и взять следующую,
в данном случае D.
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Удалить эту букву, затем пропустить одну букву и взять следующую, F.
ABCDEFGHIJKLMNOPQRSTUVWXYZ

D

Удалить эту букву, потом пропустить 4 буквы и взять следующую, K.
ABCEFGHIJKLMNOPQRSTUVWXYZ

DF

Затем повторить цикл 3, 1, 4. Пропустить 3 буквы и взять следующую, O.
ABCEGHIJKLMNOPQRSTUVWXYZ

DFK

Продолжать, пока не будут выбраны все 26 букв. В результате получается такой перемешанный алфавит:
DFKOQVZBINRXEHSYCPAJWTGML

Метод SkipMix можно применять с ключевым словом. Возьмем
ключевое слово SAMPLE. Заменим каждую букву ее позицией в алфавите, в данном случае 19, 1, 13, 16, 12, 5. При желании можно заменить двузначные числа отдельными цифрами, в данном случае 1, 9,
1, 1, 3, 1, 6, 1, 2, 5. Используем эту строку пропусков в качестве ключа
перемешивания. Отметим, что пропуск 0 допустим.
SkipMix хорошо подходит для компьютера. В этом случае алфавит состоит из 256 различных 8-битовых кодов символов. Пропус­
ками могут быть любые целые числа от 0 до 255. Числовой ключ
по-прежнему можно вывести из ключевого слова. Ключевое слово хорошо тем, что его проще запомнить и правильно ввести, чем
последовательность целых чисел. Снова возьмем ключевое слово
SAMPLE. Его буквам соответствуют следующие коды ASCII: 83, 65, 77,
80, 76, 69. Эти значения принадлежат узкому диапазону от 65 до 90,
из-за чего перемешивание получается не таким тщательным. Чтобы
расширить диапазон кодов, можно умножить их на какую-нибудь
константу по модулю 256. Множитель может быть любым нечетным

Перемешивание алфавита

69

числом от 7 до 39 включительно. Например, в результате умножения ASCII-кодов букв ключевого слова SAMPLE на 17 по модулю 256
получается последовательность 131, 81, 29, 80, 12, 149. Она принадлежит диапазону шириной 149 – 12 = 137, гораздо более широкому,
чем исходный диапазон шириной 83 – 65 = 18.
Для пропусков по-прежнему допустимо только 26 значений. Получить большее множество значений можно, например, перемножив
соседние числа по модулю 256. Тогда последовательность пропусков
будет состоять из чисел 83×65, 65×77, 77×80, 80×76, 76×69, 69×83, все
по модулю 256. Так, 83×65 = 5395 ≡ 19 (mod 256). Числовой ключ становится равен 19, 141, 16, 192, 124, 95, т. е. покрывает диапазон шириной 192 – 16 = 176.
Другой способ расширить множество значений пропусков – умно­
жить первую букву ключевого слова на 7, вторую на 9, третью на 11
и т. д., причем все умножения производить по модулю 256.
Поскольку преобразование ключевого слова в числовой ключ будет выполнять компьютер, а не человек, вычисление может быть
сколь угодно сложным. Я рекомендую брать квадратичную, а не линейную функцию, чтобы затруднить определение ключевого слова
противнику, сумевшему получить открытый текст некоторых сообщений. Например, если Ki – числовые значения символов ключевого
слова, то для вычисления элементов числового ключа Ni можно взять
такую функцию:
Ni = (KiKi+1 + Ki+2Ki+4) mod 256,
где нижние индексы возвращаются к единице по достижении длины
ключевого слова. Например, если ключевое слово содержит 10 символов, то K11 будет равно K1, K12 – K2 и т. д.
* Функция KiKi+1 + Ki+2Ki+3 недостаточно стойкая. Если длина ключевого слова равна L, то в ней всего L различных квадратичных членов.
Эмили могла бы рассматривать их как L переменных и, решив систему L линейных уравнений, найти значения L произведений K1K2,
K2K3, K3K4, … KLK1. После этого нетрудно найти значения всех Ki. **
В этой книге алфавиты перемешаны с по­мощью простых ключевых
слов, чтобы сразу было понятно, как они построены, например:
SAMPLEBCDFGHIJKNOQRTUVWXYZ
Это совершенно небезопасно. Не делайте так на практике. Я поступаю
так, только чтобы помочь читателям. Поскольку вы вряд ли захотите помогать противнику, используйте хорошо перемешанные алфавиты, применяя столбцовое перемешивание, SkipMix или иную стойкую функцию
перемешивания. Другие методы см. в разделе 12.3.8.

70

5.3

Глава 5

Подстановочные шифры

Номенклаторы
С XV по XVIII век королем подстановочных шифров был Номенклатор, использовавшийся равно царствующими особами, папами,
дип­ломатами и шпионами. Каждый Номенклатор включал сотни,
а то и тысячи элементов: одиночных букв, чисел, биграмм, слогов,
слов и имен, предлагая для каждого до 25 подстановок. Номенклаторы сродни скорее кодам, чем шифрам, из-за чего в этой книге не
рассматриваются.

5.4

Многоалфавитная подстановка
Методы вскрытия простых подстановочных шифров сводятся к анализу частот и контактов букв. Если вы хотите спроектировать шифр,
устойчивый к таким атакам, то для начала стоит сделать бесполезной информацию о частотах и контактах.
Предположим, что для шифрования каждой буквы используется
не один, а два алфавита. Скажем, первый алфавит служит для шифрования букв в нечетных позициях, а второй – в четных.
Теперь частоты букв шифртекста происходят наполовину из первого алфавита, наполовину из второго, т. е. являются средними двух
наборов частот. Буква шифртекста будет иметь высокую частоту,
только если ее частота высока в обоих алфавитах. Например, буква шифртекста K могла бы представлять букву E в первом алфавите
и букву A во втором, поэтому ее частота равна полусумме частот E
и A в открытом тексте.
Наоборот, буква шифртекста будет иметь низкую частоту, только
если представляет низкочастотные буквы в обоих алфавитах, скажем K в первом в V во втором. Таким образом, в шифртексте будет
меньше букв с высокой и низкой частотами, чем в открытом тексте.
Если построить столбчатую гистограмму распределения частот букв,
то пики в ней будут ниже, а впадины – не такими глубокими. Следовательно, использование двух алфавитов сглаживает распределение
частот.
То же самое относится к частоте контактов. Любая часто встречающаяся биграмма, например TH, будет в половине случаев начинаться в четной позиции сообщения, а в половине – в нечетной.
В первом случае T шифруется первым алфавитом, а H – вторым, во
втором – наоборот. Поэтому распределение частот контактов тоже
сглаживается.
Чем больше используется алфавитов, тем более пологим становится распределение частот. На практике со времен гражданской
войны в США и до Первой мировой войны применялось порядка
20 алфавитов. Существует статистический критерий, который измеряет пологость распределения частот и на ее основе дает оценку

Шифр Беласо

71

числа алфавитов, но он очень неточен. Более точные методы описаны в разделах 5.6 и 5.7.
Пара слов об историческом развитии многоалфавитных шифров.
Их ранние формы были разработаны Леоном Баттиста Альберти
в 1467 году и Иоганном Тритемием в 1499 году (но опубликованы
только в 1606 году). Современный вид они начали принимать после
выхода книги Джована Баттиста Беласо «La cifra del Sig» в 1553 году.

5.5

Шифр Беласо
В шифре Беласо, придуманном Джованом Баттиста Беласо в 1553 го­
ду, используется 26 различных алфавитов, каждый из которых получается сдвигом стандартного алфавита на некоторое число позиций.
Все 26 алфавитов можно расположить в виде таблицы, по одному
сдвинутому алфавиту в каждой строке:
ABCDEFGHIJKLMNOPQRSTUVXYZ
BCDEFGHIJKLMNOPQRSTUVXYZA
CDEFGHIJKLMNOPQRSTUVXYZAB

ZABCDEFGHIJKLMNOPQRSTUVXY

Первая буква в каждой строке определяет алфавит, так что в верхней строке находится алфавит A, в следующей алфавит B и т. д. Беласо первым использовал ключ для выбора алфавита, с по­мощью
которого шифруется буква сообщения. (Отметим, что семья Ардженти использовала ключ для перемешивания алфавита.) Беласо
располагал сообщение по горизонтали. Над буквами открытого текста записывался ключ – столько раз, сколько необходимо. Для шифрования буквы он находил ее в верхней строке таблицы алфавитов,
с по­мощью соответствующей ей буквы ключа определял строку таб­
лицы и заменял букву открытого текста буквой шифртекста, расположенной прямо под ней в выбранной строке. В примере ниже
показано, как буква открытого текста S шифровалась бы с по­мощью
буквы ключа C:
ABCDEFGHIJKLMNOPQRSTUVXYZ
BCDEFGHIJKLMNOPQRSTUVXYZA
CDEFGHIJKLMNOPQRSTUVXYZAB

Открытая буква S (верхняя строка) шифруется
буквой C (третья строка),
что дает букву шифртекста U

Мы находим букву S в верхней строке таблицы. Ее ключ равен C, поэтому она шифруется с по­мощью третьей строки таблицы. В треть­ей
строке, прямо под S, находится буква U. Поэтому S заменяется на U.
При шифровании слова SAMPLE ключом CAB с использованием
приведенной выше таблицы алфавитов буква S заменяется буквой U.

72

Глава 5

Подстановочные шифры

CAB CAB
sam ple
UAN RLF

Ключ
Открытый текст
Шифртекст

Следующая буква сообщения – A, ее ключ тоже A, поэтому A шифруется верхней строкой и, значит, буквой A. Букве M в слове SAMPLE
соответствует ключ B. Она шифруется второй строкой и становится
N. И так далее. В итоге получается шифртекст UANRLF.
Вместо использования таблицы шифрование можно было бы
производить с по­мощью линейки Сен-Сира, названной так в честь
французской военной академии Сен-Сир. На рисунке ниже линейка
установлена в позиции M.
ABCDEFGHIJKLMNOPQRSTUVWXYZAABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Вы можете смастерить собственную линейку из дерева, картона
или пластика. Верхняя шкала двойной ширины неподвижна, а нижний движок одинарной ширины может перемещаться вдоль нее.
Удерживать его в нужном положении можно с по­мощью резинок.
Любой алфавит или оба сразу могут быть перемешаны.
Шифр Беласо симметричен, потому что шифрование буквы X буквой K дает в точности такой же результат, как шифрование буквы K
буквой X. Шифры, основанные на сложении ключа с открытым текс­
том или применении к ним операции ИСКЛЮЧАЮЩЕЕ ИЛИ, обычно являются симметричными в этом смысле.
По причинам, выходящим за пределы моего понимания, шифр
Беласо теперь известен как шифр Виженера, а шифр, изобретенный
Блезом де Виженером и описанный в разделе 5.8.2, теперь называется шифром с автоключом. Чтобы воздать должное автору, я продолжу
называть изобретенный Беласо шифр с использованием стандартного алфавита шифром Беласо. А шифр с перемешанным алфавитом
буду называть шифром Виженера. Наконец, шифр с автоключом,
изобретенный Виженером, я буду называть автоключом Виженера.
Приписывание шифра Беласо Виженеру – пример закона Стиглера
об эпонимии, утверждающего, что никакое важное научное открытие не было названо в честь первооткрывателя. Из примеров в области криптографии упомяну еще шифр Плейфера, придуманный
Чарльзом Уитстоном, и код Морзе, придуманный Альфредом Вайлем. Да и сам закон Стиглера был подмечен Робертом К. Мертоном,
который назвал его эффектом Матфея в честь апостола Матфея.

5.6

Метод Касиски
Больше 300 лет шифр Беласо считался невскрываемым. Французы называли его «Le Chiffre Indéсhiffrable», т. е. недешифрируемый

73

Метод Касиски

шифр. Переломным моментом стал 1863 год, когда майор Фридрих
В. Касиски, прусский офицер от инфантерии, издал книгу, в которой
подробно описал, как определить период многоалфавитного шифра.
Теперь он называется методом Касиски, или тестом Касиски. Есть
свидетельства в пользу того, что Чарльз Бэббидж, возможно, использовал этот метод еще в 1846 году, но не опубликовал его. Оле Имануил Франксен из Датского технического университета, который
много писал о Бэббидже и его разностной машине, написал книгу
«Mr. Babbage’s Secret», где и высказал это предположение.
Идея в том, чтобы поискать повторяющиеся последовательности
букв в шифртексте. Какие-то могли появиться случайно, особенно
биграммы, но большинство будет связано с тем, что одни и те же
буквы открытого текста зашифрованы одной и той же частью ключа.
Чем длиннее повторяющаяся последовательность, тем меньше вероятность, что это произошло случайно. Если одной и той же частью
ключа зашифрованы две повторяющиеся последовательности букв,
то расстояние между ними должно быть кратно длине ключа. Расстояние измеряется от первого символа одного вхождения до первого символа другого вхождения. Рассмотрим следующий фрагмент
шифра с ключевым словом EXAMPLE.
EXAMPLE
therain
XEEDPTR
----+--

EXAMPLE
inspain
MKSBPTR
--1----

EXAMPLE
staysma
WQAKHXE
+----2-

EXAMPLE
inlyint
MKLKXYX
---+---

EXAMPLE
heplain
LBPXPTR
-3----+

Ключ
Открытый текст
Шифртекст
Позиция

В шифртексте триграмма PTR встречается 3 раза, в позициях 5, 12
и 33. Все три вхождения – результат шифрования открытого текста
AIN символами ключа PLE. То есть это результат шифрования одной
и той же триграммы открытого текста одной и той же частью ключа.
Триграмма открытого текста AIN, начинающаяся в позиции 21,
порождает другую триграмму шифртекста, EMK, потому что зашифрована другой частью ключа, а именно EEX. С другой стороны, триграмма открытого текста THE, встречающаяся в позициях 1 и 29,
и триграмма INS, встречающаяся в позициях 8 и 13, не порождают
повторяющихся триграмм шифртекста, потому что зашифрованы
разными частями ключа.
В этом фрагменте расстояния между повторяющимися триграммами равны 12 – 5 = 7, 33 – 5 = 28 и 33 – 12 = 21. Все эти расстояния,
7, 21 и 28, кратны 7, т. е. длине ключевого слова EXAMPLE. Касиски
показал, как такие повторения можно использовать для нахождения
периода шифрования.
Рассмотрим в качестве примера криптограмму
ZVZPV TOGGE KHXSN LRYRP ZHZIO RZHZA ZCOAF PNOHF
VEYHC ILCVS MGRYR SYXYR YSIEK RGBYX YRRCR IIVYH
CIYBA GZSWE KDMIJ RTHVX ZIKG

74

Глава 5

Подстановочные шифры

Это зашифрованный шифром Беласо текст на английском языке.
Поиск повторяющихся последовательностей букв дает: EK в позициях 10, 64 и 90, RYR в позициях 17 и 53 и т. д. Полный перечень приведен ниже.
1
2
3
4
5
6
7
8
9
10
11
12

EK
RYR
RY
YR
ZHZ
HZ
ZI
YHCI
HCI
CI
YXYR
XYR

10 64
17 53
17 60
18 54
21 27
22 28
23 101
43 79
44 80
45 81
57 69
58 70

90

59

71

Сразу бросаются в глаза две повторяющиеся тетраграммы, YHCI
и YXYR. Такое почти никогда не бывает случайно. Расстояние между
вхождениями YHCI равно 79 – 43 = 36, а расстояние между вхожде­
ниями YXYR равно 69 – 57 = 12. Расстояния 12 и 36 означают, что
длина ключа может быть равна 4, 6 или 12. Число вариантов можно
уменьшить, проанализировав другие повторяющиеся последовательности.
Расстояние между вхождениями RYR равно 36, а между вхождения­
ми ZHZ – 6. Другие повторяющиеся триграммы, HCI и XYR, – просто
части повторяющихся тетраграмм YHCI и YXYR, поэтому они не дают
дополнительной информации. Самый вероятный период этой криптограммы равен 6.
Это было просто. Посмотрим, что бывает в более сложных случаях.
В других книгах рекомендуется такой метод: взять все расстояния
между повторяющимися последовательностями и выписать всех их
множители. Самый часто встречающийся множитель, мол, и будет
периодом. Например, если расстояние равно 36, то множителями будут 1, 2, 3, 4. 6, 9, 12, 18 и 36. Такое рассуждение может направить на
ложный путь.
Во-первых, вы можете ошибочно заключить, что период в два раза
больше истинного значения. Почему? Да потому, что примерно половина расстояний будет четной, просто в силу случайности. Половина
интересных нам расстояний, тех, что объясняются повторяющимися
последовательностями в открытом тексте, будут четными кратными
периода. Для некоторых сообщений количество таких четных кратных будет больше, чем количество нечетных кратных. Точно так же
для половины случайно возникших повторяющихся последовательностей в шифртексте расстояния будут четными. Следовательно,
просто по случайности будет много четных расстояний. Аналогично,
1/3 расстояний будет кратна 3 – тоже по чистой случайности.

Метод Касиски

75

При подсчете количества множителей в найденных расстояниях
нужно уменьшить количество множителей 2 на 1/2, количество множителей 3 – на 1/3 и так далее. Тогда сравнение будет более точным.
Например, если множитель 3 встречается 6 раз, то уменьшение на
1/3 даст 4, а 2 из 6 вхождений возникли чисто случайно.
Во-вторых, когда повторяющаяся последовательность встречается несколько раз, расстояния между парами повторений могут приводить к неверным выводам. Если имеется N повторений, то число
пар равно N(N – 1)/2. В нашем примере шифртекста есть 4 вхождения
YR, т. е. 4×3/2 = 6 пар. Эти шесть расстояний между парами равны
54–18 = 36, 59–18 = 41, 71–18 = 53, 59–54 = 5, 71–54 = 17 и 71–59 = 12.
И какие из них являются кратными периода, да и есть ли такие вообще? Предположим, что шифртекст XYZ встречается 5 раз и что 3 из
этих повторений возникли из одного и того же открытого текста.
В результате получаем 10 расстояний, из которых только 3 связаны
с повторениями в открытом тексте, а остальные 7 случайные.
Мы не хотим отбрасывать важные повторения только потому, что
не можем отличить их от случайных. И вот что мы можем сделать.
Предположим, что имеется потенциальный период, например 6.
Возьмите номера позиций, в которых встречается повторяющаяся
последовательность, по модулю 6. (Вы еще не забыли модульную
арифметику? Если забыли, еще раз прочитайте раздел 3.5.)
Попробуем этот модульный метод. Снова возьмем все 5 вхождений
биграммы YR, вычислим их позиции по модулям 5, 6 и 7 и посмот­
рим, что получается.
18 54 59 71
3 4 4 1
0 0 5 5
4 5 3 1

Позиции YR в шифртексте
Позиции по модулю 5
Позиции по модулю 6
Позиции по модулю 7

Все 4 вычета по модулю 7 различны. Ели период равен 7, то все
повторения YR случайны. По модулю 5 есть всего два одинаковых вычета. Если период равен 5, то только 2 из 4 вхождений объясняются
повторяющимся открытым текстом. Но вот с модулем 6 мы наткнулись на золотую россыпь. Если период равен 6, то все 4 вхождения YR
происходят из 2 разных повторяющихся биграмм в открытом текс­
те: одна в позициях 18 и 54 с расстоянием 36, другая в позициях 59
и 71 с расстоянием 12.
Как это случилось? Взгляните еще раз на список повторяющихся последовательностей. Видно, что биграмма YR встречается в повторяющейся триграмме RYR и в повторяющейся тетраграмме YXYR.
Каждая привносит одно повторение.
Теперь рассмотрим второй метод определения периода многоалфавитного шифра. На случай, когда повторяющиеся последовательности не дают убедительных свидетельств, хорошо бы иметь запасной план.

76

5.7

Глава 5

Подстановочные шифры

Индекс совпадения
Индекс совпадения предложил американский криптоаналитик Уиль­
ям Ф. Фридман в 1922 году. Идея очень проста, но имеет весьма
важные последствия. Допустим, что два сообщения зашифрованы
многоалфавитным шифром, но с разными ключами и, возможно,
с разными периодами. Если сравнивать оба шифртекста побуквенно, то шанс, что две соответственные буквы совпадут, равен 1 к 26,
т. е. приблизительно 0.0385. Если длина обоих сообщений равна 52,
то мы ожидаем, что в 52/26 = 2 соответственных парах буквы совпадут. Я зашифровал 52-буквенный открытый текст ON THE FIRST DAY
OF SPRING A YOUNG MANS FANCY TURNED TO BASEBALL шифром
Беласо с ключами MARS и VENUS. (Совпавшие буквы выделены; то,
что в обоих случаях они равны F, – чистая случайность.)
ANKZQ FZJET USKOM KBRZF SAPGG NXEMN JXMNT QFUIF QDKGN AJWNA CD
JRGBW AMEML YELIX NTECF BELIM IKZUF NJNHU TXNLF ZHGIT VWRVS GP

Теперь представьте два сообщения, зашифрованных одним и тем
же ключом. Каждая пара соответственных букв шифруется одним
и тем же символом ключа, поэтому если буквы открытого текста совпадают, то совпадут и буквы шифртекста. Частота буквы A равна
приблизительно 0.08, поэтому вероятность, что обе буквы открытого текста равны A, составляет 0.082 = 0.0064, вероятность, что обе буквы равны B, составляет приблизительно 0.0152 = 0.000225, и т. д. для
всего алфавита. Сумма по всем 26 буквам заключена между 0.0645
и 0.0675 в зависимости от того, какой таблицей частот мы пользуемся. В любом случае это приблизительно 1/15. Вероятность, что две
соответственные буквы шифртекста совпадают при условии использования одного ключа, приближенно равна 1/15, что на 73 % выше
вероятности 1/26, получающейся, когда ключи различны.
Этот факт можно использовать для определения длины ключа
многоалфавитного шифра. Пронумеруем символы шифртекста C1,
C2, C3, ... и обозначим длину ключа L. Мы можем сравнить символы
шифртекста с теми же символами, сдвинутыми на S позиций. То есть
мы сравниваем C1 с C1+S, C2 с C2+S, C3 с C3+S и т. д.
Если сдвиг S кратен L, то Ci зашифрована тем же алфавитом, что Ci+S
для любой позиции i, поэтому вероятность, что два соответственных
символа шифртекста совпадают, равна 1/15. Если сдвиг не кратен L,
то соответственные символы не будут зашифрованы одним и тем же
алфавитом и вероятность их совпадения равна всего 1/26. Количест­
во совпавших символов должно быть наибольшим при S = L, S = 2L
и т. д. Чтобы все стало ясно, нужно попробовать несколько сдвигов.
Сдвиги, при которых число совпадений максимально, обычно являются кратными периоду.
На первый взгляд, проверка большого числа сдвигов – работа для
компьютера, но в действительности это нетрудно сделать и вруч-

И снова об индексе совпадения

77

ную. Напишем криптограмму на двух длинных полосках бумаги.
Затем будем двигать одну полоску вдоль другой и подсчитывать количество совпавших символов для каждой величины сдвига. Буквы
нужно располагать с равными промежутками, чтобы они правильно
совмещались. Для этого можно воспользоваться миллиметровкой
или писать буквы по линейке.
ZVZPVTOGGEKHXSNLRYRPZHZIORZHZAZCOAFPNOHFVEYHCILCVS...
ZVZPVTOGGEKHXSNLRYRPZHZIORZHZAZCOAFPNOHFVEYHCILCVS...

У индекса совпадения есть и другое применение, оказавшееся
просто неоценимым для криптоаналитиков. Он может обнаружить,
что два сообщения зашифрованы одним и тем же ключом. Допус­
тим, Эмили пользуется машинным шифром, который порождает многоалфавитный шифр с очень длинным периодом, скажем
100 000. Для сравнения машина Энигма, которая использовалась
в немецкой армии во время Второй мировой войны, имела период
26×25×26 = 16 900. Пусть имеется несколько тысяч перехваченных
сообщений. Каждое сообщение зашифровано каким-то сегментом этого длинного ключа. Сдвигая одно сообщение относительно
остальных и используя как индекс совпадения, так и анализ повторяющихся последовательностей шифртекста, мы можем найти
участки различных сообщений, зашифрованные одной и той же
частью ключа.
Отыскав достаточно таких перекрывающихся сегментов ключа,
мы сможем приступить к сращиванию сегментов с целью получить
более длинные сегменты. Имея достаточно сообщений, зашифрованных одним и тем же сегментом ключа, можно начинать вскрывать их, применяя обычные методы: частоту букв, частоту контактов, определение общих слов и т. д.

5.8

И снова об индексе совпадения
Существует еще один метод оценки периода многоалфавитного
шифра, также называемый индексом совпадения и также открытый
Уильямом Ф. Фридманом. Он заключается в вычислении вероятности совпадения двух букв при использовании двух, трех и т. д. алфавитов. Вероятности вычисляются заранее и хранятся в виде таблицы.
Идея в том, чтобы вычислить ту же самую статистику для сообщения
и сравнить ее с таблицей. Предполагается, что наилучшее соответствие и будет периодом шифра. На практике метод действительно
дает близкий результат, но иногда ошибается на 1, 2 или даже 3. Если
период больше 10, то этот метод бесполезен. Он не намного лучше
случайного угадывания, поэтому не будем тратить времени на объяснение деталей.

78

Глава 5

Подстановочные шифры

Шифры Беласо и Виженера широко использовались на протяжении
1880-х годов. Но по мере распространения информации о методе Касиски их применение постепенно сходило на нет, а когда был опуб­
ликован индекс совпадения, их вообще перестали употреблять. Тем
не менее и сегодня они остаются одними из самых популярных среди
шифровальшиков-любителей. Не раз, сообщая какому-то человеку,
что я пишу книгу по криптографии, в ответ я слышал, что собеседник знает невскрываемый шифр. И неизменно это оказывался шифр
Беласо, который они называли шифром Виженера. Тогда мне приходилось доказывать, что собеседник неправ, вскрывая предложенный
им шифр. Но их описание шифра было настолько перепутано, что
я вынужден был создать веб-страницу mastersoftware.biz/vigenere.htm,
на которой объяснил, как правильно использовать эти шифры.

5.9

Вскрытие многоалфавитного шифра
Определив период с по­мощью метода Касиски или индекса совпадения, можно переходить к следующему шагу – определению отдельных алфавитов. Рассмотрим сначала более простой случай – шифр
Беласо.

5.9.1

Вскрытие шифра Беласо
В шифре Беласо все подстановочные алфавиты представляют собой
простые сдвиги стандартного алфавита на сколько-то позиций. Чтобы вскрыть шифр, достаточно определить величину сдвига. Первый
шаг – разделить символы, зашифрованные каждой буквой ключа.
Снова обратимся к примеру из раздела 5.5. Поскольку мы определили, что период равен 6, запишем шифртекст группами по 6.
ZVZPVT OGGEKH XSNLRY RPZHZI ORZHZA ZCOAFP NOHFVE YHCILC VSMGRY
RSYXYR YSIEKR GBYXYR RCRIIV YHCIYB AGZSWE KDMIJR THVXZI KG

Первая буква в каждой группе зашифрована первой буквой ключа,
вторая – второй и т. д. Если бы мы записали шифртекст по вертикали
в 6 столбцов:
123456
ZVZPVT
OGGEKH
XSNLRY
...

то первый столбец содержал бы буквы, зашифрованные первой буквой ключа, второй – буквы, зашифрованные второй буквой ключа,
и т. д.

79

Вскрытие многоалфавитного шифра

Рассмотрим каждый столбец по отдельности. В каждом столбце
будет обычное для английского языка распределение букв по частоте, но сдвинутое в соответствии с буквой ключа. Если мы сможем
определить сдвиги, то вскроем шифр. Я опишу два метода, один для
решения вручную, другой для компьютера. Сначала – метод с карандашом и бумагой.
Для каждого столбца можно посчитать частоты. Это даст нам
26 чи­сел. На бумаге удобно показать частоты в виде гистограммы.
Для первого столбца шифртекста гистограмма имеет вид:
R
Y
K
O
R
Y Z
A - - - - - G - - - K - - N O - - R - T - V - X Y Z

Гистограмма
частот
для столбца 1

При наличии всего 18 букв она получилась разреженной, но и этого достаточно. Сравним ее с гистограммой стандартного распределения частот для английского языка, показанной ниже, и попробуем
определить сдвиг.
Standardчастоты
English
letter
frequencies
Стандартные
букв
в английском
языке

A B C D E F G H I J K L M N O P Q R S T U V WX Y Z

Отметим некоторые визуальные характеристики этого распределения частот: (1) E дает самый высокий пик; (2) есть три пика, разделенных четырьмя столбцами, для A, E, I, причем рядом с I расположен пик, соответствующий H; (3) имеется двойной пик для N, O;
(4) имеется тройной пик для R, S, T.
Сопоставим эту гистограмму с гистограммой шифртекста. Начнем с высокого пика, который мог бы представлять E. Имеется два
высоких пика, R и Y, соответствующих буквам ключа N и U. Следовательно, если E зашифровано буквой N, то результатом будет R, а если
буквой U, то Y.
Далее поищем три пика, отстоящих друг от друга на 4 позиции.
Есть два кандидата: G, K, O и N, R, V, – которые соответствуют буквам
ключа G и N. А как насчет двойного пика? Вероятные кандидаты –
N, O и Y, Z, они соответствуют буквам ключа A и L. А что с тройным
пиком? Есть только один вариант, тройной пик X, Y, Z. Он соответствует букве ключа G.
Наиболее вероятный ключ для первого столбца – буква G, которая
порождает пики A, E, I и тройной пик R, S, T. Второй после него

Глава 5

80

Подстановочные шифры

ключ – буква N, она дает E как самую вероятную букву и двойной
пик N,O.
Обратимся ко второму столбцу шифртекста. Гистограмма частот
букв имеет вид:
S
G H
S
C
G H
S
- B C D - - G H - - - - - - O P - R S - - V - - - -

Гистограмма
частот
для столбца 2

На этот раз наше внимание привлекает буква шифртекста S. Если
S соответствует букве открытого текста E, то ключом должна быть
буква O. Проверим это, сравнив гистограмму шифртекста со сдвинутым алфавитом.

G
C
G
- B C D - - G
M N O P Q R S

H
H
H - - - - - - O P - R
T U V W X Y Z A B C D

S
S
S
S - - V - - - E F G H I J K L

Гистограмма
шифртекста
Пробуем ключ = O
Алфавит O

Легко видеть, что все высокочастотные буквы шифртекста, а именно C, G, H и S, соответствуют высокочастотным буквам открытого текс­
та, соответственно O, S, T и E. Это великолепное совпадение, и вторая буква ключа с высокой вероятностью равна O. Ключевое слово
начинается с GO.
Остальные 4 буквы ключа определяются аналогично. Ключевым
словом является GOVERN, а открытый текст: THE LEGISLATURE
SHALL BE DIVIDED INTO TWO CHAMBERS THE UPPER CALLED THE
SENATE AND THE LOWER IS THE HOUSE OF REPRESENTATIVES.
Это был ручной метод: визуализировать распределение частот
с по­мощью гистограмм, а затем зрительно сравнить распределения. В компьютерном решении нам нужен численный эквивалент
сравнения «на глазок», позволяющий найти совпадение. Стандартный метод, который можно найти в любой книге, где обсуждаются
многоалфавитные шифры, – использовать коэффициент корреляции, а точнее коэффициент корреляции по смешанным моментам
Пирсона, названный так в честь Карла Пирсона, основателя современной статистики.
Если вы знаете статистику, то здесь для вас не будет ничего нового. Без сомнения, у вас уже имеется пакет статистических программ,
в который включена эта функция. Можете без стеснения воспользоваться ей. А для всех остальных я опишу метод, который и проще,
и быстрее – и при этом дает точно такую же точность.
Сравнивая два распределения частот зрительно, мы пытаемся сопоставить самые высокие пики в одной гистограмме с самыми высокими пиками в другой. Если перемножить их высоты, то получится

81

Вскрытие многоалфавитного шифра

самое большое произведение. Если пробежаться по алфавиту и сложить все 26 произведений, то сумма будет наибольшей, когда все высокие пики совмещаются, и наименьшей, когда самые высокие пики
находятся против самых глубоких впадин.
В этом и состоит идея. Пробуем все 26 возможных сдвигов. Совмещаем частоты букв шифртекста со сдвинутыми стандартными час­
тотами для английского языка и складываем все 26 произведений.
Наибольшая сумма укажет наиболее вероятный сдвиг. А это даст нам
самую вероятную букву ключа. Вторая по величине сумма даст следующий по величине вероятности сдвиг и т. д. Я называю эту технику методом высоких пиков.
Шифр Беласо получает оценку 2.

5.9.2

Вскрытие шифра Виженера
Примерно через 30 лет после Беласо Блез де Виженер улучшил шифр
Беласо в двух отношениях. Во-первых, он добавил линейки за пределами таблицы алфавитов. Это дало возможность порождать перемешанный алфавит, не прибегая к перемешиванию таблицы. В примере ниже используется ключевая фраза в горизонтальных линейках
и ключевое слово YOUTH в вертикальных. Второе усовершенствование, автоключ, описывается в разделе 5.10.
FIRSTLOVEABCDGHJKMNPQUWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
. . .
Z ZABCDEFGHIJKLMNOPQRSTUVWXY
FIRSTLOVEABCDGHJKMNPQUWXYZ
Y
O
U
T
H
A
B

Верхняя линейка
Y
O
U
T
H
A
B
Z
Нижняя линейка

Чтобы зашифровать букву B с по­мощью буквы ключа U, находим
букву ключа U в ключевой линейке слева или справа от строки и букву
открытого текста B в буквенной линейке сверху или снизу от столбца.
Буква шифртекста находится на пересечении строки U и столбца B,
это M. При дешифрировании используем букву ключа для нахождения строки, находим букву шифртекста в этой строке и берем букву
открытого текста из буквенной линейки сверху или снизу.
Для шифрования вручную я рекомендую рисовать горизонтальные и вертикальные разделители через каждые 4 или 5 строк или
столбцов. Или использовать пластмассовый угольник, чтобы точно
находить точки пересечения.
Ниже приведен пример сообщения, зашифрованного с применением этой формы шифра Виженера. В данном случае период равен 5.

82

Глава 5

Подстановочные шифры

SLMDQ BXSLM XIHSQ NHJEQ SVJGW LBJSJ BFEII CBHVN RUTGW RPHEN
VXPIL RPPIW SAJHQ SVTKU ACFQQ ACFDT MCTOM XZEKE XZPLP RLHG

У этого шифра есть серьезная слабость. Поскольку каждая строка
в таблице – стандартный алфавит, сдвинутый на какое-то число позиций, то каждый алфавит шифра будет таким же, как все остальные алфавиты, только сдвинутым на сколько-то позиций. Бесполезно сравнивать алфавиты шифров со стандартным алфавитом, потому что они
перемешаны, однако можно определить сдвиги, сравнивая алфавиты
шифров друг с другом – на глаз или используя метод высоких пиков.
На рисунке ниже показаны гистограммы для пяти алфавитов
шифров, сдвинутые так, чтобы пики и ущелья совместились. Все буквы шифртекста в первом столбце (выделенном) представляют одну
и ту же букву открытого текста. Это означает, что буква S в первом
алфавите, буква C во втором алфавите и буква L в четвертом алфавите представляют одну и ту же букву. Заменим их все буквой A. Во
втором столбце нет букв. В третьем столбце M из третьего алфавита
и T из пятого алфавита представляют одну и ту же букву шифртекста. Заменим их все буквой C. Все буквы шифртекста в 26-м столбце
будут заменены буквой Z.
Гистограммы для сдвинутых алфавитов шифров
S
S
X
S
X
A B
S - - V - X - - A B C - - - - - - - - L M N - - -

R
R
R
R

С
С
L
P
V
X
Z
B
С - - F - H I - - L - - - P - - - - U V - X - Z A B
H
P
T
H
P
T
E F
H
- - M - - P - - S T - - - - - - - - - - E F - H -

J
J
J
J

G
I
L
S
D E
G
I
K
L - - O - Q - S - - V - - - - - - - D E - G H I - K

W
W
- - T U - W
A B C D E F

Q
Q
Q
M N
Q
- - - - - - - E - - - I J - L M N - P Q
G H I J K L M N O P Q R S T U V W X Y Z

(1)

(2)

(3)

(4)

(5)

Это превращает шифртекст в простую подстановку, которую
можно вскрыть методами из раздела 5.1. Шифр Виженера получает
оценку 2.

Вскрытие многоалфавитного шифра

5.9.3

83

Вскрытие общего многоалфавитного шифра
Общий многоалфавитный шифр также можно реализовать с по­
мощью таблицы алфавитов. Строки таблицы могут быть перемешаны по любой схеме и независимо друг от друга. Отметим, что число
строк не обязано совпадать с числом столбцов. Для компьютерных
шифров удобна таблица с 512 строками и 256 столбцами, так чтобы любой символ шифртекста встречался в каждом столбце дважды. Это усложнит задачу определения ключа противнику, который
получил шифртекст и соответствующий ему открытый текст. Ниже
приведен частичный пример таблицы алфавитов со 100 строками:
00
01
02
03

IBVMRUCNJYSAWEPZODXGQKTHLF
LOEIBQXJTMFRWAPUCZNVGKYHSD
GTAOKYSFUJPERHXLBVQDIZMWCN
DPNETHVBJZSGMWAXIQOFYRCUKL
· · ·
99 BRXIZPYLVJCNQHTKESUAMGWDOF

Для этой таблицы нужен числовой ключ, в котором строка, используемая для шифрования, определяется двумя десятичными
цифрами. 20-значный ключ породил бы многоалфавитный шифр
с периодом 10.
Вскрытие общего многоалфавитного шифра очень похоже на
вскрытие одноалфавитного шифра. Мы начинаем с подсчета час­
тот и составления таблицы контактов для каждого столбца. В этом
случае контактами для столбца C будут столбцы C–1 и C+1, причем
одним из контактов последнего столбца является первый. В одном
столбце будет меньше вхождений каждой буквы, поэтому выводы
придется делать на основе меньшего объема данных. А значит, большую ценность приобретают вдохновенные озарения, но это приходит с опытом.
Начнем с такого многоалфавитного шифртекста:
OHOYO RKKDF JKYSU ZONSO OKGSC LHKDK FKHWU ZGGSN ZYYZK JPHZO
RKKDP KCHUK LHYYF BGBSC FKKFK CZIUX VOZRU TZWSN UZYSU ZONSO
OPHCO RPNDZ ZPIHK OGDHN UWOSN ZYYZK XOQDX BNMUO R

Немного приглядевшись к нему, мы обнаруживаем две длинные
повторяющиеся последовательности: YSUZONSOO в позициях 13 и 93
и SNZYYZK в позициях 39 и 124. В обоих случаях расстояние между
вхождениями кратно 5, откуда следует, что период равен 5. Вероятно, эти длинные повторения соответствуют расхожим словам или
фразам либо словам, тесно связанным с темой сообщения.
Ниже показаны схемы контактов для каждой из 5 букв ключа.
Чтобы упростить объяснения, я буду помечать каждую букву шифртекста цифрой, равной номеру ее алфавита. Так, C1 означает букву

84

Глава 5

Подстановочные шифры

шифртекста C в алфавите 1 (т. е. зашифрованную первой буквой ключа), H3 – букву шифртекста H в алфавите 3 (зашифрованную третьей
буквой ключа) и т. д.
Напомню, что буквы с большим числом разных контактов с обеих
сторон обычно оказываются гласными, а буквы с меньшим числом
разных контактов – согласными.
(1)
B GN
C Z
F KK
J KP
K C
L HH
O HKPG
R KKP
T Z
U ZW
V O
X O
Z OGYOPY

FX
K
KC
FK
P
CK
OOK
OOOO
U
NN
X
K
UUNUZN

(4)
C O
D FKPZX
F K
H KN
R U
S UOCNCNUON
U KXO
W U
Y OF
Z KOK

H
KKKNQ
K
ID
Z
YNGGBWYNO
HIM
H
OY
YHY

(2)
C H
G GBD
H OKY
K KYGHKK
N M
O NZNQ
P HHNI
W O
Y YY
Z IWY

(3)
B S
D H
G SS
H WZUC
I UH
K DDDF
M U
N SSD
O YS
Q D
W S
Y SZYSZ
Z R

K
ZBO
OLL
RJOFRF
B
ZVZX
JORZ
U
ZZ
CTU

G
G
KG
KPCP
ZP
KHKK
N
OOP
HW
O
Z
KYHZY
O
(5)
C LF
F JB
K FJLCOX
N ZUUZ
O RORORR
P K
U ZZTZ
X VB
Z Z

SS
DY
DZUFHZ
SSHS
YSZSCU
D
SWRS
UD
D

Зная эти контакты, мы можем предварительно идентифицировать G2, K2, O2, P2, H3, K5 как гласные, а R1, Z1, K3, N3, D4, S4, O5, U5 как
согласные. Исходя из высокой частоты, можно предположить, что S4
представляет букву T.
Дальше все происходит так, как для простой подстановки. Мы
обновляем схемы контактов с учетом того, какие буквы идентифицированы как гласные и согласные, а также помечаем в шифртексте
гласные и согласные. Эта информация используется для уточнения
и исправления произведенной ранее классификации букв по типам
и для определения отдельных букв.
Я не стану повторять все шаги из раздела 5.1. Логика такая же,
только шаги помельче и их побольше, да и возвращаться назад приходится чаще. Общий многоалфавитный шифр получает оценку 3.

85

Автоключ

5.10 Автоключ
В разделе 5.9.2 я упоминал, что Виженер внес дваусовершенствования в шифр Беласо. Первое – размещение линеек по краям таблицы
алфавитов для порождения перемешанного алфавита. Второе – автоключ.
Идея автоключа заключается в том, чтобы использовать открытый текст сообщения в качестве ключа для шифрования остальной
части сообщения. Раннее воплощение этой идеи придумал итальянский физик, математик и астролог Джироламо Кардано. В системе
Кардано каждая буква зашифровывалась с использованием ее самой
в качестве ключа. Это работает только для алфавитов с нечетным
числом букв. В английском алфавите, где букв 26, и A, и N преобразовывались бы в A, поэтому получателю пришлось бы гадать, что
имелось в виду. Но даже для алфавита нечетной длины автоключ
Кардано порождает простую подстановку, не более того.
Виженер усовершенствовал метод Кардано, добавив запаздывание. Он использовал однобуквенный ключ для шифрования первой
буквы, первую букву открытого текста для шифрования второй буквы, вторую букву открытого текста для шифрования третьей буквы
и т. д. В наши дни ключевое слово используется для шифрования
первой группы букв, затем эта группа букв открытого текста используется для шифрования второй группы и т. д. В примере ниже ключ
SAMPLE используется совместно с таблицей алфавитов Беласо, т. е.
с неперемешанными алфавитами.
SAMPLE THEDEL EGATIO NMUSTP RESENT AUNITE
THEDEL EGATIO NMUSTP RESENT AUNITE DFRONT
LHQSPP XNEWMZ RSULBD EQMWGI RYFMGX DZEWGX

Ключ
Открытый текст
Шифртекст

В случае неперемешанных алфавитов вскрытие не вызывает трудностей. Для определения длины ключа можно использовать индекс
совпадения, описанный в разделе 5.7. Зачастую индекс оказывается
намного выше, если шифртекст сдвинут на величину, кратную длине
ключа, например:
LHQSPP XNEWMZ RSULBD EQMWGI RYFMGX DZEWGX
LHQSPP XNEWMZ RSULBD EQMWGI RYFMGX DZEWGX

Предположим, мы определили, что ключевое слово состоит из
6 букв. Пробуем каждую букву алфавита в роли первой буквы ключа.
Начинаем с A. Поскольку первая буква шифртекста L, первая буква
открытого текста также должна быть L. Она также будет ключом для
7-й буквы сообщения. Поскольку седьмая буква шифртекста X, седьмой буквой открытого текста должна быть M.

86

Глава 5

Подстановочные шифры

Продолжаем в том же духе. Каждая гипотеза насчет первой буквы
ключа даст соответствующие ей буквы открытого текста в позициях
1, 7, 13, 19, 25 и 31, т. е. каждую шестую букву открытого текста. Всего
имеется 26 наборов букв, по одной для каждой буквы ключа. У некоторых из этих шести букв будут характерные для английского языка
частоты букв, у других – маловероятные. Повторим процедуру для
второй буквы ключа. Каждая гипотеза даст буквы открытого текста
в позициях 2, 8, 14, 20, 26 и 32.
Теперь возьмем 5 самых вероятных вариантов для букв 1, 7, 13,
... и объединим их в пары с 5 самыми вероятными вариантами для
букв 2, 8, 14, ... . Это даст 25 наборов биграмм. Одни из них будут
очень вероятными, другие – неправдоподобными. Возьмем 10 самых правдоподобных биграмм и объединим их с 5 самыми вероятными вариантами для третьей буквы ключа. Этот даст 50 наборов
триграмм. Выберем из них 10 самых правдоподобных и объединим
в пары с 5 наилучшими вариантами для четвертой буквы ключа.
К этому моменту начнут проявляться некоторые слова открытого
текста, и как правильно выбрать буквы ключа, станет очевидным.
Если вы проделываете все это на компьютере, опустите этап построения биграмм. Просто переберите все 263 комбинаций первых
трех букв ключа и сразу переходите к триграммам. Затем повторите это для трех букв ключа, начиная со второй. Наиболее вероятные
варианты для первых трех букв и следующих трех букв должны перекрываться. То же самое верно для третьего и четвертого наборов
букв ключа. В итоге выбор быстро сузится, и вы найдете ключевое
слово. Автоключ Виженера со стандартными алфавитами получает
оценку 3.

5.11 Бегущий ключ
Бегущий ключ похож на автоключ, но вместо короткого ключевого
слова или фразы используется ключевой текст, возможно, такой же
длины, как само сообщение. Метод бегущего ключа так и не получил
широкого распространения на практике, потому что требуется, чтобы у обеих сторон были в точности одинаковые ключевые тексты.
Если одна сторона запомнила или записала ключ в виде MINE EYES
HAVE SEEN THE GLORY OF THE COMING OF THE LORD, а другая в виде
MY EYES HAVE SEEN THE GLORY OF THE COMING OF THE LORD, то
общение станет невозможным. Решить эту проблему можно, например, с по­мощью двух экземпляров печатной книги, по одному у каждой стороны, но тогда они всегда должны иметь эту книгу при себе.
Для взаимодействия с по­мощью компьютеров это не проблема, потому что там можно хранить тысячи книг.
И снова, если используется таблица Беласо со стандартным анг­
лийским алфавитом, то шифр с бегущим ключом вскрыть нетрудно,

Бегущий ключ

87

хотя и утомительно. Один из способов, работающий как для автоключа, так и для бегущего ключа, – угадать слово, которое может
встречаться в тексте. Слово может быть частью как открытого, так
и ключевого текста – с этим криптограф должен будет разобраться позже. Вероятным словом, или зацепкой (crib), может быть часто
встречающееся английское слово, например THE или AND, или слово, относящееся к предположительной теме сообщения.
Например, если сообщение касается коммерческих переговоров,
то вероятными словами могут быть TARIFF, SHIPPING, REPRESENTATIVE, BARGAINING или еще что-то в этом роде.
Идея в том, чтобы попробовать вероятное слово во всех возможных позициях сообщения. Этот процесс называется волочением слова
(word dragging). Зная слово открытого текста и соответствующее ему
слово шифртекста, мы можем получить фрагмент ключа. Если позиция слова найдена правильно, то этот фрагмент будет выглядеть
как обычное английское слово. Чем длиннее вероятное слово, тем
больше уверенности в его правильности. Определив слово, можно
попытаться угадать буквы, затем предшествующие или последующие слова, чтобы расширить брешь.
Есть и другая методика, рассчитанная на компьютер. В ней используется математическое понятие условной вероятности. Это вероятность наступления события A, при условии что событие B имело
место. Простая вероятность события A обозначается P(A), а условная
вероятность события A при условии события B – P(A|B). Если AB обозначает событие «A и B», то условная вероятность A при условии B
равна P(A|B) = P(AB)/P(B). Следовательно, P(AB) = P(A|B)P(B).
Пример поможет разобраться. При бросании двух стандартных
костей вероятность выбросить 12 равна 1/36. Но если после броска
первой кости выпало 6, то вероятность выпадения 12 увеличивается
до 1/6. Пусть A означает «выпало 12», в B «на первой кости выпало
6». Тогда P(A) = 1/36, P(B) = 1/6. AB означает, что выпало 12 и после
первого броска выпало 6. P(AB) также равно 1/36, потому что если
выпало 12, значит, при первом броске наверняка выпало 6. Применяя нотацию записи условной вероятности, имеем P(A|B) = P(AB)/
P(B) = (1/36)/(1/6) = 1/6. Таким образом, условная вероятность выбросить 12, при условии что на первой кости выпало 6, равна 1/6.
Воспользуемся условной вероятностью для вскрытия шифра с бегущим ключом. Для этого нам понадобятся таблицы вероятностей
одиночных букв, биграмм и триграмм. Их можно вычислить, подсчитав буквы, биграммы и триграммы в большом корпусе текстов.
Много таких корпусов имеется на сайте проекта Гутенберг по адресу www.gutenberg.org. При скачивании выберите вариант plaintext
(простой текст). Кое-какие готовые результаты можно найти в интернете.
Нужно будет назначить вероятности всем возможным биграммам
и триграммам, а не только встречающимся в корпусе. Для биграмм
все понятно. Если биграмма AB ни разу не встретилась, то можно

88

Глава 5

Подстановочные шифры

положить P(AB) = P(A)P(B), однако я предлагаю задавать меньшее
значение, просто потому, что AB не встречается. Я беру P(AB) = P(A)
P(B)/3. Имея полный набор вероятностей биграмм, можно распространить его на триграммы, положив P(ABC) равной максимуму из
P(A)P(BC) и P(AB)P(C). И снова я предлагаю брать меньшее значение,
потому что триграмма ABC ни разу не встретилась. Например, можно положить P(ABC) равной максимуму из P(A)P(BC)/3 и P(AB)P(C)/3.
Наличие искусственных вероятностей означает, что сумма вероятностей всех биграмм и всех триграмм будет больше 1. С точки зрения
математики, это нонсенс, но на практике несущественно.
Теперь, располагая необходимыми инструментами, мы можем заняться шифром с бегущим ключом. Выберем начальную позицию
в сообщении, скажем s, и попробуем все возможные триграммы
в позициях s, s+1, s+2. Посмотрим, какие им соответствуют триграммы в открытом тексте. Перемножим вероятности триграммы ключа
и триграммы текста, чтобы получить вероятность такой конфигурации. Сохраним 10 000 наиболее вероятных конфигураций и отбросим остальные. Для каждой выбранной триграммы попробуем все
возможные буквы ключа в позиции s+3 и посмотрим на соответствующую букву открытого текста. Предположим, что триграмма равна
JKL, следующая буква ключа M, а соответствующая тетраграмма открытого текста ABCD. Мы можем оценить вероятность тетраграммы
ключа JKLM, воспользовавшись условной вероятностью P(KLM|KL),
т. е. вероятностью того, что за биграммой KL следует M. Она вычисляется по вероятностям триграмм как P(KLM)/P(KL), т. е. как результат деления вероятности триграммы KLM на вероятность биграммы KL. Таким образом, вероятность тетраграммы оценивается как
P(JKL)P(KLM|KL). Это делается как для тетраграммы ключа, так и для
тетраграммы открытого текста, ABCD.
Оценим вероятность этой конфигурации, перемножив вероятности тетраграммы ключа и тетраграммы открытого текста. Снова
сохраним 10 000 наиболее вероятных конфигураций и отбросим
остальные. Продолжаем до тех пор, пока решение не станет очевидным. Все это можно проделать на компьютере без участия человека.
Шифр Виженера с бегущим ключом со стандартными алфавитами
получает оценку 4.

*5.12 Моделирование роторных машин
Многоалфавитные шифры были непременным атрибутом электромеханических роторных машин, которые использовались начиная
с 1920-х годов. Период этих машин может быть порядка миллиарда
или триллиона. Периода может и вообще не быть, если движение
роторов зависит от символов открытого текста или шифртекста.

Моделирование роторных машин

89

Начиная с 1915 годов и до окончания Второй мировой войны было
произведено по меньшей мере 70 разных типов таких машин. Есть
несколько сайтов, на которых приведены их фотографии и опи­
сания.
У любой машины есть один или несколько роторов, обычно от 3
до 6, но их число может доходить и до 10. Каждый ротор выполняет прос­тую подстановку. После зашифровывания каждой буквы некоторые роторы проворачиваются, так что для следующей буквы
используется другая подстановка. Благодаря различным системам
кулачков, шестеренок, лапок и собачек движение роторов непредсказуемо. Я хочу сказать – непредсказуемо для противника.

Описывать роторную машину будет проще, если заменить буквы
алфавита числами. Для механических роторных машин, в которых
каждый ротор может находиться в одной из 26 позиций, соответствующих 26 буквам алфавита, заменим A на 0, B на 1, C на 2 и так
далее вплоть до Z, заменяемой на 25. Иными словами, будем использовать порядковую нумерацию, начиная с 0. При компьютерном моделировании будем использовать 8-битовые байты и заменять символы их числовыми кодами в какой-нибудь стандартной кодировке,
например UTF-8. При такой системе A соответствует 65, B – 66, C – 67,
… , Z – 90. Другие символы – строчные буквы, цифры и знаки препинания – также заменяются их кодами в UTF-8.
Коль скоро мы перешли к работе с числами, мы можем производить над ними арифметические операции, например складывать
и вычислять вычеты по модулю 26 или 256. О модульной арифметике см. раздел 3.6.
Производились шифровальные машины, имевшие до 16 роторов.
На рисунке ниже показана 10-роторная советская машина Фиалка,
которая использовалась странами Варшавского договора с 1956 по
1990-е годы. Фотография публикуется с разрешения Пола Хадсона
на условиях лицензии CC BY 2.0.

90

Глава 5

Подстановочные шифры

5.12.1 Однороторная машина
Начнем с простого механического ротора. Ротор выполняет прос­
тую подстановку, поэтому его можно смоделировать таблицей подстановки S, представляющей из себя перемешанный алфавит, как
в строке таблицы алфавитов. Элементы списка пронумерованы от 0
до 25, по числу букв в алфавите. N-й элемент таблицы подстановки,
обозначаемый S(N), подставляется вместо N-й буквы алфавита. То
есть S(0) подставляется вместо A, S(1) – вместо B и т. д.
При повороте меняется позиция ротора. Позицию можно представить числом P, изменяющимся от 0 до 25. Провернувшись на 26 позиций, ротор вернется в исходную позицию 0. Когда ротор находится
в позиции P, вместо N-й буквы алфавита подставляется S(N+P). То
есть если ротор находится в позиции 5, то вместо A подставляется
S(5), вместо B – S(6) и т. д. Естественно, N+P изменяется циклически,
т. е. S(26) совпадает с S(0), S(27) – с S(1) и т. д. Иными словами, N+P –
сокращенная запись для (N+P) mod 26.
В механической роторной машине роторы поворачиваются на
разное число позиций после шифрования каждой буквы. Это нерегулярное движение можно смоделировать последовательностью
величин шагов, скажем (a, b, c, d, e). В первом цикле ротор продвигается (шагает) на a позиций. Во втором цикле он продвигается на b
позиций и т. д. В шестом цикле последовательность повторяется. То
есть если в начальный момент ротор занимал позицию P, то после
одного цикла он займет позицию P+a, после двух циклов – позицию
P+a+b, после 5 циклов – позицию P+a+b+c+d+e. После шести циклов
ротор будет находиться в позиции P+2a+b+c+d+e. В механических
устройствах каждый ротор обычно проворачивается на небольшое

Моделирование роторных машин

91

число позиций, часто на 0 или 1 позицию в цикле в зависимости от
того, поднят определенный кулачок или опущен. При компьютерном моделировании таких ограничений нет. Величины шагов могут
принимать значения от 0 до 25 при моделировании механического ротора или от 0 до 255 при использовании 8-битовых байтов для
представления символов.
Поскольку мы выбрали ключ с пятью шагами, эта однороторная
машина будет повторяться после 5×26 = 130 циклов. Если сумма
a+b+c+d+e четная, то машина будет повторяться после 65 циклов,
а если a+b+c+d+e кратно 13, то после всего лишь 10 циклов. Очевидно, что один ротор не обеспечивает достаточной безопасности. Однороторный машинный шифр получает оценку 3.

5.12.2 Трехроторная машина
Рассмотрим моделирование более практичной роторной машины.
В ней используется три ротора и 8-битовая кодировка UTF-8. Для
трех роторов нужны три таблицы подстановки, S1, S2 и S3. Когда роторы занимают позиции P1, P2 и P3, N-я буква алфавита зашифровывается как S3(S2(S1(N+P1)+P2)+P3).
Для каждой из трех таблиц подстановки определен свой список
шагов: для S1 – шаги (a1, a2, a3, ..., ai), для S2 – шаги (b1, b2, b3, ..., bj) и для
S3 – шаги (c1, c2, c3, ..., ck). Если сумма шагов каждого ротора нечетна, а i, j, k – взаимно простые числа, то период такой машины равен
256ijk. Например, если i = 10, j = 11 и k = 13, то ijk = 1430, т. е. период
равен 1430×256 = 366 080. Результат такой же, как для многоалфавитного шифра с таблицей алфавитов, содержащей 366 080 строк, притом что каждая строка используется в цикле только один раз.
Допустим, что все три таблицы подстановки и последовательность
шагов известны, например стандартизованы и приняты большим
сообществом. Может возникнуть мысль, что Эмили нужно проверить всего 2563 = 1.67×107 начальных конфигураций роторов, чтобы
вскрыть любое сообщение. На современном персональном компьютере это заняло бы несколько секунд. Однако такой ход рассуждений
ошибочен.
Рассмотрим два разных состояния машины. В обоих состояниях
роторы занимают одни и те же позиции, но эти позиции находятся в разных точках последовательности шагов. Начав шифрование
из этих двух состояний, мы получим разные последовательности
алфавитов шифра, т. е. одно и то же сообщение будет зашифровано
по-разному. Для вскрытия шифра методом полного перебора нужно
было бы проверить все возможные конфигурации роторов и все возможные места в последовательности шагов, т. е. всего рассмотреть
2563×1430, или 2.40×1010 случаев. Это все еще практически осущест­
вимо, но займет не несколько секунд, а несколько часов.
При условии что роторы и последовательности шагов известны,
этот 3-роторный шифр получает оценку 4.

92

Глава 5

Подстановочные шифры

Если роторы и последовательности шагов неизвестны, то Эмили
придется прибегнуть к общим методам вскрытия многоалфавитных шифров, т. е. перехватить достаточное количество сообщений
и сопоставить их с целью найти участки, зашифрованные с одними и теми же параметрами. Чтобы отделить истинные совпадения
от случайных, нужно посчитать индекс совпадения (раздел 5.7) на
длинных перекрытиях. Я рекомендую не менее 200 символов. Пытаться сопоставить имеет смысл только сообщения, содержащие более 200 символов. Для сообщения длины L ≥ 200 число позиций, где
возможно совпадение, равно L–199. Когда общее число M допускающих сопоставление позиций во всех перехваченных сообщениях
превысит 2.40×1010 = 1.55×105, можно приступать к поиску соответственных участков текста.
На первый взгляд, это немного, но объем работы по нахождению
перекрытий имеет порядок M2. Кроме того, одного перекрытия совершенно недостаточно. Нужно много перекрытий, чтобы можно
было начать выделение высокочастотных букв и отделение гласных
от согласных. Для такой работы нужен большой компьютер и группа
талантливых криптоаналитиков. Трехроторная машина с неизвестными роторами и последовательностями шагов получает оценку 6.

5.12.3 Восьмироторная машина
Три ротора – неплохое начало. Но чтобы добиться по-настоящему
высокой стойкости смоделированной роторной машины, увеличим
число роторов с 3 до 8. Пусть роторы могут поворачиваться на 11,
13, 17, 19, 23, 25, 27 и 31 шаг, а сумма шагов каждого ротора нечетна.
Период такой машины равен приблизительно 5.69×1012.
Если это аппаратное устройство, то внутренняя электрическая
схема роторов и последовательности шагов могут быть встроены. Даже если это так, все равно практически невозможно провес­
ти сопоставление сообщений, как мы делали это для 3-роторной
машины. Действительно, теперь имеется 2568 = 1.84×1019 возможных начальных позиций восьми роторов. Поскольку период равен
5.69×1012, полное число состояний машины оказывается равным
(1.84×1019)×(5.69×1012) = 1.05×1032. Восьмироторная машина с неизменяемыми роторами и последовательностями шагов получает
оценку 9.
Пойдем дальше. Допустим, что имеется не 8, а 16 роторов. Для
каждого сообщения выбирается 8 роторов из 16 возможных в некотором порядке. Всего таких перестановок 5.19×108. Для каждой перестановки имеется 1.84×1019 возможных начальных позиций роторов
и 5.69×1012 позиций в последовательностях шагов. Всего получается
5.43×1040 состояний.
Даже если Эмили каким-то образом узнает таблицы подстановки и последовательности шагов для всех 16 роторов, она не сможет
вскрыть сообщение, зашифрованное такой машиной, даже восполь-

Моделирование роторных машин

93

зовавшись самым большим и быстрым суперкомпьютером. (На момент написания книги самым быстрым в мире суперкомпьютером
был Summit с быстродействием 200 петафлоп.) Такой 8-роторный
шифр получает оценку 10.
Если таблицы подстановки и последовательности шагов хранятся
в секрете или часто изменяются, то такой роторный шифр с 8 взаимозаменяемыми роторами будет неприступен для самых больших
суперкомпьютеров еще 10, 20 или, быть может, даже 30 лет.
Поскольку мы моделируем роторную машину программно, роторы можно изменять, как нам будет угодно. Вместо фиксированного
набора 16 роторов роторы можно было бы изменять для каждого сообщения, используя ключ для перемешивания всех восьми роторных алфавитов. Это значительно повысило бы безопасность ценой
отдельного этапа инициализации для каждого сообщения. Промежуточный уровень безопасности дает использование семи стандартных роторов из шестнадцати и одного ротора, алфавит которого
генерируется независимо для каждого сообщения. Это уменьшает
время инициализации на 87 %.
Хотя этот шифр уже заслужил оценку 10, у вас все равно может
возникнуть желание укрепить его. Возможно, вы не доверяете моим
оценкам или думаете, что противник располагает невообразимой
вычислительной мощностью. Один из возможных путей – использовать выход некоторых роторов для модификации работы. Я предлагаю взять выход четвертого ротора в середине процесса шифрования
и использовать этот символ для продвижения первого ротора. Можно использовать символ непосредственно, а можно произвести для
него простую подстановку, чтобы получить количество позиций, на
которое должен провернуться ротор. Для всех символов сообщения,
кроме первого, первый ротор провернется дважды: один раз – на количество позиций, заданное в его собственной последовательности
шагов, а другой – в результате обратной связи с четвертым ротором.
Такой двойной шаг не оказывает влияния на шифрование текущего символа. Модифицированная конфигурация применяется к шифрованию следующего символа. Возможно, реализовать эту идею
в аппаратной роторной машине трудно, но в компьютерной модели
это делается легко, т. к. роторы моделируются по одному.
Кстати говоря, может показаться, что шифр получился бы более
стойким, если использовать выход восьмого ротора, но это не так.
На выходе восьмого ротора мы имеем символ шифртекста, который
станет известен подслушивающему. Выходы двух средних роторов,
т. е. четвертого и пятого, наименее уязвимы для подслушивания,
а потому являются самыми безопасными.
Обратная связь с четвертым ротором делает смоделированную
8-роторную машину апериодической. Сколько бы сообщений ни
было перехвачено, Эмили не сможет найти два сообщения с одной
и той же последовательностью конфигураций роторов. **

6

Контрмеры

Краткое содержание главы:
двойное шифрование;
null-символы и null-биты;
„„ омофоны;
„„ сокрытие сообщений внутри изображений или файлов.
„„
„„

В разделе 5.9 отмечалось, что многоалфавитный шифр можно
вскрыть в результате двухшагового процесса. На первом шаге с по­
мощью метода Касиски или индекса совпадения определяется длина ключа. При этом шифртекст разбивается на несколько участков,
каждый из которых зашифрован всего одной буквой ключа. На
втором шаге эти участки дешифрируются стандартными методами, применяемыми для простых подстановочных шифров. Я имею
в виду анализ частот и контактов.
А теперь взглянем на это с другой стороны. Что может сделать
криптолог, чтобы помешать такому вскрытию многоалфавитного
шифра? Мы рассмотрим несколько контрмер.

Двойное шифрование

6.1

95

Двойное шифрование
Если сообщение зашифровано одним многоалфавитным шифром
с периодом P, а получившийся на выходе промежуточный текст зашифрован вторым многоалфавитным шифром с периодом Q, то результат эквивалентен многоалфавитному шифру, период которого
равен наименьшему общему кратному P и Q, которое обозначается
lcm(P,Q). Иначе говоря, период равен наименьшему целому числу,
делящемуся на P и на Q. Например, если P = 10 и Q = 11, то двойной
шифр будет иметь период 110, но если P = 10 и Q = 12, то двойной
шифр будет иметь период 60, потому что 60 делится на 10 и на 12.
Каждый алфавит, участвующий в двойном шифровании, является
композицией двух алфавитов, взятых из первого и второго шифров,
как описано в разделе 11.7.4. Если это сдвинутые стандартные алфавиты, то результат также будет сдвинутым стандартным алфавитом.
Если это перемешанные алфавиты, то результирующий алфавит, вероятно, будет перемешан более тщательно.
Хотя двойное шифрование по-прежнему многоалфавитное, оно
может оказаться более стойким, чем одинарное, потому что период
больше, а число букв, шифруемых каждым символом ключа, меньше. Такой тип двойного шифрования получает оценку 3.
Если каждый из двух многоалфавитных шифров имеет автоключ
или бегущий ключ, то двойной шифр является шифром с бегущим
ключом. Однако ключ не будет англоязычным текстом, поэтому
техника волочения из раздела 5.11 неприменима. Зато для работы
с двумя бегущими ключами можно приспособить вероятностную
технику, описанную там же.
Если при шифровании используются неперемешанные алфавиты,
т. е. таблица Беласо, то порядок применения шифров не играет роли.
Если сначала зашифровать сообщение M бегущим ключом R, а затем
перешифровать его бегущим ключом S, то результат будет таким же,
как если бы мы зашифровали ключ R ключом S, а затем применили
получившийся составной ключ C к шифрованию сообщения M.
Ключи, полученные путем шифрования одного бегущего ключа
другим бегущим ключом, не являются случайными. У них имеется
собственное характерное распределение частот букв и контактов.
Существуют типичные последовательности, например слово THE,
зашифрованное ключом THE, или слово AND, зашифрованное ключом THE. Все это можно заранее вычислить и сохранить в таблице.
Если проволочь длинную фразу, например UNITED STATES OF AME­
RICA или NEGOTIATING STRATEGY, по тексту, то можно будет поискать участки бегущего ключа, отвечающие этому распределению.
Поэтому шифрование двойным бегущим ключом можно вскрыть
с по­мощью компьютера.
Шифрование композицией двух автоключей и (или) бегущих ключей с неперемешанными алфавитами получает оценку 4. Если же алфавиты хорошо перемешаны, то оценка повышается до 6.

Глава 6

96

6.2

Контрмеры

Null-символы
Null-символы – старый и заслуженный способ расстроить планы
взломщика кодов. Их еще в XV веке использовала семья Ардженти.
Так называются бессмысленные символы, которые вставляются в сообщение, специально чтобы запутать вражеских криптоаналитиков.
Чаще всего они используются в кодах. В случае многоалфавитных
шифров они могут искажать счетчики частот и препятствовать анализу методами Касиски и индекса совпадения.
Null-символы можно использовать несколькими способами. Самый простой – добавить null-символ в алфавит. Обычно его представляют звездочкой *. Затем этот символ можно вставлять в разные
места открытого текста. Но не слишком часто, иначе противник его
заметит и раскроет уловку. Достаточно от 3 до 6 процентов null-сим­
волов. Полезно вставлять их в высокочастотные слова, чтобы помешать атаке Касиски. Но делать это нужно случайным образом. Если
заменить каждое вхождение THE на T*HE, то вы только поможете
Эмили, предоставив ей 4-значные повторения. Лучше в половине
случаев использовать THE, в четверти T*HE и еще в четверти TH*E.
Бессмысленно использовать *THE или THE*, потому что триграмма
THE при этом остается.
Таким образом, в таблице алфавитов будет 27 столбцов, а в шифртексте будут встречаться звездочки. Вы, наверное, подумали, что
так мы выдадим факт использования null-символов, но существует
трехчастный шифр Trifid, описанный в разделе 9.9, в котором используется 27-символьный алфавит. Эмили могла бы подумать, что
ваш многоалфавитный шифр трехчастный (не путать с трехногими
растениями-монстрами из фантастического романа Джона Уиндэма
«День триффидов», вышедшего в 1951 году).
Но такое использование null-символов почти не укрепляет шифр.
Частоты букв меняются не сильно, а эффективность методов Касис­
ки и индекса совпадения практически не снижается. Метод получает
оценку 3.
Другой способ использования null – вставлять в открытый текст
специальные null-последовательности букв. Они должны быть легко распознаваемы. Я рекомендую строить null-последовательности
из небольшого числа среднечастотных букв, например C, D и P. Для
представления букв C, D и P можно было бы взять биграммы CC, DD
и PP, а остальные шесть биграмм, составленные из этих букв, считать
null-последовательностями. Этот метод также получает оценку 3.

6.3

Прерванный ключ
Более эффективный способ – вставлять null-символы в шифрекст,
так чтобы они прерывали повторяющийся период. Простая реали-

Прерванный ключ

97

зация этой идеи заключается в том, чтобы сначала зашифровать сообщение многоалфавитным шифром, как обычно, затем при каждом возникновении в шифртексте триггерного события, например
вхождении заранее выбранной буквы или биграммы, вставлять пос­
ле него null-символ. Null-символом может быть любая буква или
даже биграмма. О том, что это именно null-символ, свидетельствует
предшествующий ему триггер.
Эту идею можно развить. Можно было бы вставлять null-символ:
через 4 символа после каждой буквы W шифртекста, тогда
шифр­текст NPGWSOVKLEWPIDF превратился бы в NPGWSOVTKLEW­
PIDCF;
„„ после каждой второй буквы H шифртекста;
„„ после первой буквы A, следующей за каждой буквой Q шифртекста;
„„ в первой позиции после первой буквы V, во второй позиции
пос­ле следующей буквы B, в третьей позиции после следующей
буквы L, далее цикл V, B, L, V, B, L, ... повторяется;
„„ после каждой удвоенной буквы шифртекста, или после трех последовательных гласных, или после четырех букв, следующих
друг за другом в алфавитном порядке по возрастанию или по
убыванию.
„„

Возможны также комбинации всего вышеперечисленного. Число
вариантов ограничено лишь вашим воображением. Только не надо
усложнять до такой степени, что Сандра и Рива не смогут быст­
ро и точно зашифровывать и расшифровывать текст. Если Сандра
должна вставлять null-символ после каждой второй K и после каждой третьей M, но по ошибке вставит его после четвертой M, то Рива
не сможет расшифровать сообщение.
Этот метод вставки null-символов получает оценку 4 при использовании стандартных алфавитов и 5, когда алфавиты хорошо перемешаны. Как всегда, предполагается, что перемешанные алфавиты
хранятся в секрете.
Есть еще несколько способов прервать периодическое повторение ключа. Один из них – применять ключ с начала, если в открытом
тексте возникло какое-то триггерное событие. Это безопаснее, чем
предыдущий метод, когда триггер ищется в шифртексте, потому что
Эмили видит шифртекст, а открытый текст не видит. С другой стороны, это затрудняет работу полномочного получателя. Если триггеры присутствуют в шифртексте, то Риве достаточно просто просмотреть его и удалить null-символы. Если же триггеры находятся
в открытом тексте, то Рива должна дешифрировать его по одному
символу и искать триггеры.
Сами триггеры в открытом тексте могут походить на рассмотренные выше триггеры в шифртексте. После обнаружения триггера
можно было бы предпринять следующие действия:

Глава 6

98

Контрмеры

пропустить заданное число символов ключа;
повторить заданное число символов ключа;
„„ начать применение ключа с первого символа;
„„ поменять направление движения по ключу.
„„
„„

Ниже приведены примеры всех четырех типов прерывания ключа
SAMPLE, когда триггером служит буква A:
Пропустить 2 Повторить 1 Начать сначала Сменить
направление
SAMPLE
SAMPLE
SAMPLE
SAMPLE
MA..RY
MA....
MA....
MA....
HA..DA
.RYHA.
RYHA..
YR....
..LITT
....DA
DA....
....AH
LELA..
.....L
LITTLE
....DA
MBITSF
ITTLEL
LA....
ELTTIL

Ключ
Открытый текст

Эта форма прерывания ключа получает оценку 5 при использовании стандартных алфавитов и 8, когда алфавиты хорошо перемешаны. Ключ не следует перезапускать с начала слишком часто, иначе
первый символ ключа будет задействован чрезмерно, а последний
окажется в небрежении.
Более стойкая форма прерывания ключа – использовать два отдельных ключа разной длины. Наибольшая стойкость достигается, когда длины ключей – взаимно простые числа. После триггера
мы переключаемся с одного ключа на другой. Этот метод получает оценку 6 при использовании хорошо перемешанных алфавитов.
Ниже приведен пример для ключей FIRST и SECOND и триггера A:
FIRST
MA...

SECOND
RYHA..

..DA.
.....
....M
BITSF
LEECE
WA....

....LI
TTLELA
......
......
......
SWHITE

Два ключевых слова
Открытый текст, показывающий,
какая буква ключа используется
Шифртекст не показан

В этом шифре запоминается, какая буква ключа использовалась
последней. При переключении на другой алфавит шифрование продолжается со следующей буквы ключа. Например, открытый текст
MA зашифрован буквами ключа FI, поэтому следующей буквой
является R. После зашифровывания RYHA буквами SECO второго
ключа возобновляется шифрование первым ключом, а именно буквами RS.
Таким образом, все буквы каждого ключа используются примерно
одинаковое число раз.

99

Омофоническая подстановка

6.4

Омофоническая подстановка
Идея омофонической подстановки, с которой мы познакомились
в разделе 4.2, – использовать несколько подстановок вместо каждой
буквы открытого текста, чтобы сгладить частоты букв. Чаще всего
алфавит шифртекста расширяется путем включения дополнительных подстановок. Поскольку в классических многоалфавитных
шифрах используется 26-буквенный алфавит, по крайней мере для
английского языка, омофонические подстановки в них обычно не
применяются.
При реализации на компьютере с 8-битовыми байтами омофоническая подстановка не представляет никаких сложностей. Каждый
байт может принимать 256 различных значений. 26 заглавных букв,
26 строчных букв, 10 цифр и, возможно, 32 знака препинания занимают всего 94 символа. Ну, пусть будет 98, если мы хотим включить
еще и управляющие символы: табуляцию, забой, перевод строки
и возврат каретки. Остается 158 символов, которые можно использовать для null-символов, биграмм, триграмм и прерывания ключа.
Рассмотрим реализацию омофонической подстановки с по­мощью
карандаша и бумаги на примере обычной таблицы перемешанных
алфавитов 26×26. Если в качестве триггера зарезервировать одну букву, то эта буква будет встречаться так часто, что ее легко заметить.
С двумя триггерными буквами дело обстоит так же. Я рекомендую
брать 3 триггерные буквы, каждую с частотой меньше 4 %. Назовем
этот шифр Trig3. Подходят буквы BCDFGJKLMPQUVWXYZ. Выберем
для определенности B, C и D. Существует 3×26 = 78 биграмм, начинающихся с этих букв. Использовать биграммы, содержащие высокочас­
тотные буквы AEINORST, не следует, потому что это противоречит
нашему стремлению сгладить частоты букв. Остается 54 биграммы,
которые могут использоваться в роли null-символов, офомонов
и для прерывания ключа. Вот один из возможных наборов:
BB
BC
BD
BF
BG
BH
BJ
BK
BL

O
RE
N
R
E
+1
O
-

BM
BP
BQ
BU
BV
BW
BX
BY
BZ

T
A
+3
E
ON
E
R
+1
T

CB
CC
CD
CF
CG
CH
CJ
CK
CL

+2
C
I
D
A
+3
E

CM
CP
CQ
CU
CV
CW
CX
CY
CZ

O
S
E
+2
I
ER
+3
A

DB
DC
DD
DF
DG
DH
DJ
DK
DL

N
T
+1
+2
AN
S
TH

DM
DP
DQ
DU
DV
DW
DX
DY
DZ

B
IN
R
S
I
T
N

Здесь - представляет null-символ, т. е. открытый текст BD, BL, CC
и т. д. – null-символы. Коды +1, +2 и +3 – прерыватели-ключи, означающие, что нужно пропустить 1, 2 или 3 буквы ключа соответственно.
Множество омофонов состоит из шести биграмм: AN, ER, IN, ON, RE
и TH, а также одиночных букв.

Глава 6

100

Контрмеры

Важно следить за балансом. Если увлечься использованием этих
подстановок, то у букв B, C и D окажется слишком большая частота,
и их легко будет опознать как триггеры. Если, наоборот, прибегать
к ним редко, то не будет полезного эффекта. 10 % – это нормально,
причем биграммы с буквами B, C и D должны использоваться примерно с равной частотой, около 3 % каждая. Помните, что использовать буквы B, C и D в роли самих себя теперь нельзя, нужно подставлять вместо них DM, CD и CG.
При правильном применении и с хорошо перемешанными алфавитами шифр Trig3 получает оценку 5.

6.4.1

Шифр 5858
Прежде чем переходить к подстановке биграмм, я хотел бы представить еще один шифр, который назову шифр 5858. В этом компьютерном шифре используются 5-битовые символы. Пять бит дают
алфавит из 32 символов, достаточный для 26 букв, 3 null-символов
и 3 омофонов. (1) Открытый текст записывается в виде последовательности 5-битовых символов с использованием перемешанного
алфавита. (2) Вставляются null-символы и омофоны, каждый в пропорции примерно 3 %, т. е. всего они будут занимать 18 % открытого
текста. Лучше расставлять их случайно, без всякой системы. (3) При
необходимости открытый текст дополняется до длины, кратной 8,
null-символом и случайными битами числом не более 4. (4) Дополненное сообщение рассматривается как строка 8-битовых байтов,
и для нее производится хорошо перемешанная подстановка. Например, если сообщение содержало восемьдесят 5-битовых символов, то
эти 400 бит можно рассматривать как пятьдесят 8-битовых байтов.
(5) Сообщение снова трактуется как строка 5-битовых символов. Три
из них назначаются прерывателями ключа +1, +2 и +3, как в шифре
Trig3. (6) Сообщение зашифровывается общим многоалфавитным
шифром с хорошо перемешанной таблицей 5-битовых алфавитов
размера 32×32. (7) Затем строка 5-битовых символов разбивается
на 8-битовые байты и производится вторая 8-битовая подстановка. Таким образом, в шифре 5858 выполняется четыре подстановки:
начальная 5-битовая подстановка, 8-битовая подстановка, общая
5-битовая многоалфавитная подстановка и окончательная 8-битовая подстановка. Этот шифр получает оценку 7.

6.5

Подстановка биграмм и триграмм
Еще один способ помешать Эмили использовать частоты букв и контактов для вскрытия шифра – выполнять подстановки биграмм
и даже триграмм. Проще всего сделать это с по­мощью таблицы. Для
биграмм используются таблицы 26×26, каждый элемент которой является биграммой:

101

Сокрытие сообщений в изображениях

A
B
C

A B
BL TC
CA CS
PS DE
...

C
UB
FN
YO

D
NK
GX
UJ

E
RA
OD
BK

F
KS
MH
GC

G
BW
YL
NZ

...
...
...
...

Вместо AA подставляется BL, вместо AB – TC и т. д. Для подстановки
триграмм следует использовать буклет из 26 таблиц, по одной для
каждой первой буквы триграммы.
Подстановки такого типа можно использовать самостоятельно
или в сочетании с каким-нибудь другим методом, например многоалфавитной подстановкой. В первом случае подстановка биграмм
получает оценку 3, а подстановка триграмм – оценку 4. Подстановке биграмм с последующей многоалфавитной подстановкой с сек­
ретными хорошо перемешанными алфавитами я ставлю оценку 5,
а подстановке триграмм с многоалфавитной подстановкой с хорошо
перемешанными алфавитами – оценку 6.

*6.6

Сокрытие сообщений в изображениях
В 1999 году была высказана интересная идея – скрывать сообщения внутри компьютерных файлов данных разных типов. Это современный вариант стеганографии (раздел 2.2). Рассмотрим один
такой метод – сокрытие сообщений в растровом изображении, т. е.
файле формата BMP. Растровые изображения хранятся попиксельно. В самом распространенном растровом формате каждый пиксель
представлен тремя байтами, описывающими доли синего, зеленого
и красного цветов в этой точке изображения. (Этот не зависящий от
устройства порядок определен в стандарте растровых изображений,
принадлежащем Microsoft. Если трудно запомнить порядок, заметьте, что названия цветов Blue (синий), Green (зеленый) и Red (красный) следуют в алфавитном порядке.) Например, 0,0,0 означает, что
цвета нет, т. е. это чисто-черный пиксель; 255,255,255 означает максимальную насыщенность каждого цвета, т. е. белый цвет, а 255,0,0 –
чисто-синий.
Значения пикселей обычно записываются в шестнадцатеричном
виде, так что чисто-синий цвет представляется числом FF0000. В некоторых языках программирования это число записывается в виде
$FF0000, X’FF0000’ или даже 0xFF0000, поскольку 255 в шестнадцатеричной системе равно FF. Иногда порядок цветовых компонент
записывается наоборот. Так, в HTML чисто-синий цвет записывается
в виде #0000FF.
Изображение может содержать сотни или тысячи строк, а каждая строка содержит сотни или тысячи пикселей. Не редкость раст­
ровые изображения размером 3000 строк по 4000 пикселей. В таком изображении будет 12 000 000 пикселей, и оно будет занимать

102

Глава 6

Контрмеры

36 000 000 байт в памяти плюс 54 байта заголовка. Именно поэтому
изображения с высоким разрешением так быстро заполняют память
компьютера.
Идея сокрытия заключается в том, чтобы использовать младший
байт каждой цветовой компоненты для хранения одного бита сообщения. Это может остаться незамеченным, потому что разница
между FF0000 и FE0000 или даже FE0101 зрительно едва уловима.
А в большом изображении изменение одного пикселя практически
невозможно обнаружить. Кроме того, в половине пикселей значение младших битов вовсе не изменяется. Если сообщение скрыто
в изобра­жении, то важно, чтобы содержащий его файл передавался
точно. Изображение нельзя увеличивать, уменьшать, кадрировать,
поворачивать, наклонять, сжимать или преобразовывать в другой
формат.
Сообщение может быть зашифровано любым методом. Но если
Эмили заподозрит, что сообщение скрыто таким способом, то никакой дополнительной секретности мы не добьемся. Заплатив за передачу 8 бит на каждый бит сообщения, мы не получим никакого выигрыша. Нужно лишь отбирать младшие биты каждого пикселя, так
что оценка этого метода такая же, как у самого метода шифрования
сообщения.
Чтобы эта схема дала улучшение безопасности, нужно использовать не все биты, а выбирать только некоторые биты из каждого пикселя в циклическом порядке. Для этого воспользуемся строкой восьмеричных цифр (см. таблицу в разделе 3.1), например 1, 3,
7, 4, 6, как ключом для выборки битов сообщения. Можно назвать
его ключом выборки. Мы имеем 5 восьмеричных цифр и, стало быть,
15 бит выборки. Начинаем с первого пикселя изображения и с первой цифры ключа выборки. Если первый бит этой цифры равен 1, то
помещаем один бит сообщения в младший бит синей компоненты
пикселя, иначе случайным образом полагаем младший бит равным
0 или 1. Если второй бит ключа равен 1, проделываем то же самое для
зеленой компоненты, а если третий бит равен 1, то для красной. Повторяем те же действия для второго пикселя и второй цифры ключа
выборки. И так далее.
Может возникнуть мысль, что если бит ключа равен 0, то лучше
оставить соответствующий бит изображения без изменения. Тогда искажений было бы внесено меньше и Эмили было бы труднее
определить, что оно содержит скрытое сообщение. Так-то оно так,
но если Эмили заподозрит, что используется такой метод, то ей будет проще узнать ключ выборки.
Рассмотрим эту ситуацию подробнее. Предположим, что Эмили
перехватила сообщение, содержащее растровое изображение. Также
предположим, что Эмили произвела поиск в интернете и нашла исходное изображение. Ничто не мешает ей сравнить оба изображения
попиксельно и составить карту отличий. Если в каком-топикселе
младшие биты совпадают, то Эмили ставит в карте X, а если раз-

103

Добавление null-битов

личаются, то |. Затем Эмили пробует разные длины ключа выборки.
Пусть выбрана правильная длина L; если расположить участки отметок такой длины друг под другом, то каждый столбец, для которого бит ключа выборки равен 0, будет содержать только X, тогда как
столбцы, соответствующие биту 1, будут состоять наполовину из X
и наполовину из |. Например, если ключ выборки равен 1, 3, 7, 4, 6, то
можно увидеть такую картину:
001
XXX
XXX
XX|
XXX
XX|

011
X|X
XX|
X||
XXX
XX|

111
XX|
|XX
XX|
||X
X|X

100
XXX
XXX
XXX
|XX
|XX

110
X|X
X|X
|XX
XXX
X|X

Ключ выборки
Карта различий

Для каждого столбца, содержащего |, соответствующий бит ключа
выборки должен быть равен 1. Все остальные биты ключа выборки,
вероятно, равны 0. Чем больше в таблице различий, тем эта вероятность выше.
Поэтому всякий раз, как бит выборки оказывается равным 0,
младший бит цветовой компоненты следует задавать случайным образом. Использование циклического ключа выборки в этом методе
сокрытия сообщений увеличивает на 2 оценку базового шифра, если
она находится в диапазоне от 1 до 4, и на единицу – если в диапазоне
от 5 до 8.
Ключ выборки также можно было бы сгенерировать с по­мощью
цепного генератора псевдослучайных цифр из раздела 4.5, взяв подходящее значение из 7, 9 или 10 цифр. Используем сгенерированные
цифры от 0 до 7 в качестве цифр ключа выборки. Если сгенерирована
цифра 8 или 9, отбрасываем ее и переходим к следующей. Здесь не
важно, удовлетворяют ли псевдослучайные числа статистическому
критерию случайности. Важно лишь, чтобы длина последовательности сгенерированных цифр была больше длины сообщения, измеренной в битах, тогда Эмили не сможет сопоставить участки шифртекста с одинаковым ключом выборки.
При использовании цепного генератора цифр ключа выборки этот
метод сокрытия сообщения прибавляет 3 к оценке базового шифра,
если она находится в диапазоне от 1 до 4, 2 – если в диапазоне от 5
до 7, и 1 – если оценка равна 8. **

6.7

Добавление null-битов
Идею перемешать биты сообщения с null-битами также можно реа­
лизовать, не встраивая сообщение в изображение или иной файл,
и сделать это можно вручную. Сначала зашифруем сообщение прос­
тым подстановочным шифром или еще каким-то методом. Предста-

Глава 6

104

Контрмеры

вим этот предварительный шифртекст в двоичном виде, например
в виде 5-битовых двоичных цифр. Простую подстановку и преобразование в двоичную форму можно выполнить на одном шаге. Можно просто подставлять 5-битовые числа вместо 26 букв алфавита
в каком-то случайном порядке, например:
A
B
C
D
E
F

00011
11110
01000
00000
10110
01011

G
H
I
J
K
L

10011
01101
10100
10000
11001
00100

M
N
O
P
Q
R

11011
00001
11111
00101
11101
10001

S
T
U
V
W
X

01001
10111
01110
10010
11010
00111

Y 11000
Z 01010

3
4
6
7
8
9

00110
01111
11100
00010
01100
10101

Отметим, что помимо 26 букв алфавита в таблицу включено
6 десятичных цифр. Цифры 0, 1, 2 и 5 опущены, чтобы не путать
их с рукописными буквами O, I, Z и S. Это дает 32 знака, необходимых для преобразования 5-битовых чисел обратно в символы для
передачи.
Теперь, когда сообщение представлено строкой битов, можно
добавлять null-биты. Для задания позиций вставки null-битов используется ключ выборки. Ключ имеет вид m1, n1, m2, n2, ... . Это
означает, что нужно взять m1 бит сообщения и вставить после них
n1 null-бит, затем взять еще m2 бит сообщения и вставить после них
n2 null-бит. И так далее. Приведем пример для ключа выборки 2, 1,
3, 1, 4, 2, 3, 2.
M
E
S
S
A
G
E
11011 10110 01001 01001 00011 10011 10110
2 13 14
2 3 2 2 13 14
2 3 2 2 13 14
2 3
11-011-1011--001--00-101-0010--001--11-001-1101--10
111011010110000101000101100101100110111001011010110
11101 10101 10000 10100 01011 00101 10011 01110 01011
Q

9

J

I

F

P

G

U

F

Открытый текст
5-битовые группы
Ключ выборки
После перегруппировки
Добавление null-битов
01011 01011 После
перегруппировки
F
F

При такой схеме MESSAGE зашифровывается в Q9JIF PGUFF F. Четыре null-бита (закрашены серым) добавлены, чтобы длина последней группы составляла 5 бит. Это называется дополнением, или nullдополнением.
Ключ выборки тоже можно было бы задать в цифровой форме,
скажем 110111011110011100. Бит ключа 1 означает, что нужно брать
следующий бит сообщения, а бит 0 – что нужно вставить null-бит.
Эта схема оказывается более стойкой, если использовать два алфавита: для преобразования букв в биты и для обратного преобразования битов в буквы. Стойкость также увеличивается при использовании подстановок переменной длины, как в кодах Хаффмана,
описанных в разделе 10.4. В этом случае длины кодов необязательно
должны соответствовать частотам букв, но все равно должны обла-

105

Объединение нескольких сообщений

дать префиксным свойством, иначе Рива не сможет расшифровать
сообщение.
Есть два способа избежать добавления лишних символов для второй подстановки – с заменой битов буквами. (1) Можно объединять
биты в группы по 4 и использовать только 16 букв алфавита или
16 шестнадцатеричных цифр и (2) применять код переменной длины с шестью 4-битовыми кодовыми группами и двадцатью 5-битовыми кодовыми группами.
Как и раньше, эти кодовые группы должны обладать префиксным
свойством. Приведу пример:
E
T
A
O
I
N

0101
1011
1110
0011
0110
1010

S
H
R
D
L
U

00010
11011
10000
00011
11000
01001

C
M
F
Y
W
G

01000
11010
10010
00101
11111
00100

P
B
V
K
X
Q

01111
11110
10001
11001
00000
10011

J 01110
Z 00001

4-битовая/5-битовая
подстановка

Обратите внимание, что я использовал 4-битовые подстановке для 6 букв с наибольшей частотой. В результате эти 6 букв будут
иметь в шифртексте примерно вдвое большую частоту, чем остальные 20. Это могло бы подтолкнуть неосмотрительного противника
к мысли о том, что используется шифр совершенно другого типа.
Техника добавления null-битов применима ко многим типам
шифров. Поскольку null-бит неотличим от любого другого, их добавление, с точки зрения повышения стойкости, лучше, чем добавление
null-символов. Оно может прибавить к оценке шифра целых 3 балла.
Рассмотрим конкретный пример шифра, который назовем Null5.
Как и раньше, имеются три шага: преобразование из букв в биты,
добавление null-битов и обратное преобразование из битов в буквы. Буквы преобразуются в биты с использованием омофонической
подстановки букв в группы из 5 бит. Для каждой из букв E, T, A, O, I,
N предлагается две подстановки. Null-биты вставляются с по­мощью
ключа выборки, как в разделе 6.6. Биты преобразуются в буквы с по­
мощью 4- и 5-битовых подстановок, как в таблице выше.
Шифр Null5 получает оценку 6.

6.8

Объединение нескольких сообщений
Двоичную форму ключа можно также использовать как ключ для
объединения двух сообщений. Это означает, из двух сообщений образуется одно, в котором биты исходных сообщений чередуются.
Ключ объединения, записанный в системе счисления по основанию 3
или 4, можно использовать для объединения трех или четырех сообщений соответственно. Ключ в системе по основанию 4 можно использовать для объединения трех сообщений со вставкой null-битов.

106

Глава 6

Контрмеры

У объединения нескольких сообщений есть два преимущества:
длина увеличивается не так сильно, как при использовании nullбитов, и можно использовать более простой и быстрый метод шифрования. Если чередовать 4 сообщения с по­мощью длинного ключа
объединения и использовать разные простые подстановки для каждого сообщения, то только это позволяет присвоить шифру оценку 5.
А если еще применить дополнительную простую подстановку к объединенному сообщению, то оценка повышается до 8.
Ключи для объединения сообщений бывают двух видов: счетчика
битов или выборки. В случае счетчика битов сообщения перебираются циклически. Каждая цифра ключа определяет, сколько битов
брать из очередного сообщения. В случае выборки сообщения можно перебирать в любом порядке, но из каждого сообщения берется только один бит. Цифра ключа определяет, из какого сообщения
брать следующий бит. Примеры ниже показывают, как сообщения
010101111010001101011 и 11101010011011100110 объединяются методом счетчика битов с ключом 123123 и методом выборки с ключом
12122112.
12 3 12 3 12 3 12 3 12 3 12 3 12 3
0 101 01
1 110 10
0 011 01
0 1
11
1 010 10
0 110 11
1 001 10
0111011010101101100101100110111010010101

Ключ счетчика битов
Сообщение 1
Сообщение 2
Шифртекст

1212211212122112121221121212211212122112
0 1 01 0 1 11 1 0 10 0 0 11 0 1 01
1 11 0 1 01 0 0 11 0 1 11 0 0 11 0
0111101001101110100111000101111000111010

Ключ выборки
Сообщение 1
Сообщение 2
Шифртекст

Объединение нескольких сообщений может оказаться муторным,
когда длины сообщений различны. Необходим маркер конца для
всех сообщений, кроме самого длинного. Другой способ справиться
с неравными длинами – сбалансированное объединение. Сначала
выпишем все сообщения подряд, разделив их каким-то зарезервированным символом или последовательностью символов. Затем
просто разобьем эту длинную строку на равные части. Например,
если сообщения содержат 50, 60, 70 и 80 символов, то длина объединенного сообщения равна 260 символов плюс 3 разделителя – итого
263 символа. Это сообщение можно разбить на три участка длиной
66, 66, 66 и 65 символов. Если используются 8-битовые байты, то
можно разбить 263×8 = 2104 бита на 4 участка по 526 бит. Необязательно разбивать битовую строку по границам байтов, но ключи
нужно выбирать так, чтобы брать равное число битов из каждого
участка.
Кстати говоря, количество сообщений и количество участков независимы. Сообщений может быть одно или много, а участков – два
и более. Например, одно сообщение можно разбить на три участка
или три сообщения разбить на два участка.

Внедрение сообщения в файл

107

Балансировка – это только половина решения. Еще надо подумать
о том, что делать в конце процесса объединения. Рано или поздно
наступит такой момент, когда все биты из одной строки уже включены в объединенное сообщение, тогда как в других строках еще
остались биты. Если ключ объединения требует, чтобы был включен
бит из уже исчерпанной строки, просто пропустите ее и переходите
к выбору следующего бита.
Соберем все сказанное выше в одном шифре, который назовем
Merge8. Он применяется к одному или более сообщениям, которые
предварительно были конкатенированы, т. е. записаны подряд, одно
за другим. В варианте base-26 все 26 букв преобразуются в двоичную форму с применением 4-битового/5-битового кода, как при
4-битовой/5-битовой подстановке из раздела 6.7. Разделителем сообщений может быть любая последовательность букв, например
XXX или END. В версии base-256 хорошо перемешанная простая подстановка применяется к ASCII-кодам. Получившаяся битовая строка
разбивается на 8 участков равной длины. Для объединения 8 участков используется ключ, состоящий из 32 восьмеричных цифр. Каждая из 8 восьмеричных цифр встречается в ключе 4 раза, так что всего существует 32!/(4!)8 = 2.39×1024 возможных ключей объединения.
К получившейся строке применяется вторая простая подстановка.
И в версии base-26, и в версии base-256 используется 8-битовая подстановка. Шифр Merge8 получает оценку 6.

6.9

Внедрение сообщения в файл
Когда сообщение скрыто в файле изображения, приходится использовать как минимум 7 бит изображения на каждый бит сообщения.
Это крайне неэффективно. Можно скрыть в файле гораздо больше
битов, если не пытаться сделать его похожим на что-то другое. Это
шифртекст, так пусть он и выглядит как шифртекст. Существует масса способов скрыть открытое сообщение внутри файла. Назову лишь
несколько. Как и в разделе 6.6, для каждого байта файла некоторое
число битов открытого текста скрыто среди 8 бит.
„„ Каждый раз берется фиксированное или переменное число битов открытого текста.
„„ Биты помещаются в фиксированные или переменные позиции
внутри каждого байта.
„„ Биты помещаются по порядку или переставляются.
„„ Биты открытого текста вставляются в неизменном виде или
шифруются несложным шифром, например простым подстановочным.
„„ Биты шифртекста оставлены «как есть» или зашифрованы несложным шифром, например простым подстановочным.
Количество, позиции и порядок битов могут задаваться периодическим ключом или какой-то случайной последовательностью.

108

Глава 6

Контрмеры

Оценка шифров из этого класса зависит от параметров и может
варьи­роваться от 1 до 10.
Приведу пример такого шифра. (1) Применить к сообщению хорошо перемешанную ключом простую подстановку. (2) С помощью генератора псевдослучайных чисел с большим внутренним состоянием выбрать от 2 до 6 позиций в каждом байте. Поместить следующие
биты сообщения в количестве от 2 до 6 по порядку в эти позиции.
В остальные биты записать случайные значения. (3) Применить вторую хорошо перемешанную ключом простую подстановку.
Этот метод, называемый EmbedBits, очень прост и работает исключительно быстро. Недостаток в том, что шифртекст получается
примерно в два раза длиннее открытого текста. Шифр EmbedBits
получает оценку 8. Чтобы повысить ее до 10, замените подстановку
одиночных символов подстановкой биграмм, например как в шифре Two Square.

7

Перестановка

Краткое содержание главы:
маршрутная и столбцовая перестановка;
перестановка со случайными числами;
„„ перестановка с ключом;
„„ множественные анаграммы.
„„
„„

В главах 5 и 6 мы рассматривали подстановочные шифры. Вторая
большая категория методов шифрования с секретным ключом – перестановочные шифры. Под перестановкой понимается изменение
порядка элементов сообщения. Элементами могут быть слова, слоги,
буквы и отдельные цифры или биты, представляющие буквы. В этой
главе мы будем иметь дело преимущественно с перестановкой букв,
но помните, что те же самые методы применимы и к другим элементам, например к перестановке слов, описанной в разделе 7.2.2. Мы
рассмотрим много разных типов перестановочных шифров. По большей части их можно реализовать, имея только бумагу и карандаш.

7.1

Маршрутная перестановка
Маршрутная перестановка – простейший и самый старый из перестановочных шифров. Никакого ключа в нем нет. Секретность обес­
печивается выбором маршрутов, или путей.

110

Глава 7

Перестановка

Маршрутная перестановка – действенный способ заинтересовать
криптографией ребенка. Это замечательное развлечение в классе,
в лагере отдыха и на других тусовках. Главное – научить детей писать
буквы ровно по столбцам, иначе прочесть сообщение правильно не
получится. Выручит миллиметровка с широким шагом.
Основная идея заключается в том, что сообщение записывается в прямоугольник с использованием одного маршрута, а читается с использованием другого. Например, для сообщения длиной
30 символов лучше всего взять прямоугольник 5×6. Если в сообщении 29 символов, просто добавьте null-символ. Дополняйте сообщение null-символами, так чтобы оно поместилось в прямоугольник
подходящего размера. Полезно расчертить прямоугольник, прежде
чем приступать к его заполнению. Длинное сообщение разбейте на
блоки удобного размера. Например, сообщение длиной 1000 символов можно разбить на 20 блоков 5×10.
Мы уже видели пример маршрутной перестановки в разделе 4.3.
Сообщение записывалось в сетку размером 5×5 по горизонтали слева направо, а считывалось по вертикали сверху вниз. Горизонталь
и вертикаль – два типа маршрутов. Но не единственные, ниже приведен более полный перечень.
„„ По горизонтали слева направо, справа налево или с чередованием направлений.
„„ По вертикали сверху вниз, снизу верх или с чередованием направлений.
„„ По диагонали из верхнего левого угла в правый нижний, из левого нижнего в правый верхний или с чередованием направлений.
„„ По спирали из любого угла внутрь, из центра наружу, по часовой стрелке или против часовой стрелки.
Можно начать с любого угла прямоугольника, использовать любой
маршрут для записи сообщения и любой другой маршрут для чтения. Ниже приведен пример затейливого маршрута:
1
36
37
39
42

2
6
38
40
43

3
7
11
41
44

4
8
12
16
45

5
9
13
17
21

26
10
14
18
22

27
30
15
19
23

28
31
33
20
24

29
32
34
35
25

Сообщение записывается в сетку в порядке, указанном числами,
а считывается по столбцам, т. е. в порядке 1, 36, 37, 39, 42, 2, 6, 38, … .
В случае маршрутной перестановки Эмили должна лишь угадать
маршрут, по которому считывалось сообщение. После того как Эмили впишет сообщение в прямоугольник, его можно будет прочитать
визуально. Отметим, что Эмили не важно, записывали вы сообщение
в прямоугольник 5×6 по горизонтали или в прямоугольник 6×5 по
вертикали. Не важно и то, записывали вы его сверху вниз или снизу

111

Столбцовая перестановка

вверх. Эмили этого знать не может, и ей это безразлично. Маршрутная перестановка получает оценку 1.

7.2

Столбцовая перестановка
Столбцовая перестановка – рабочая лошадка перестановочных
шифров. Она использовалась военными, дипломатами и шпионами начиная с XVII века. Впервые этот метод описан в книге Джона
Фальконера «Cryptomenysis Patefacta» (Секреты тайной переписки).
После Славной революции 1688 года Джон Фальконер последовал за
свергнутым королем Яковом II в изгнание во Францию, где и умер
после опубликования в 1692 году второго издания книги под новым
названием «Правила объяснения и расшифровки всех видов тай­
нописи».
В столбцовой перестановке используется ключ, в роли которого
может выступать строка последовательных чисел в измененном порядке либо ключевое слово или фраза, преобразуемые в строку последовательных чисел, соответствующих порядку букв слова в алфавите. Рассмотрим ключевое слово SAMPLE. Из букв этого слова
A первая в алфавите, поэтому она получает номер 1. Следующей за
ней в алфавите идет буква E, она получает номер 2. Далее по порядку следуют буквы L, M, P и S. Поэтому SAMPLE преобразуется в 6, 1,
4, 5, 3, 2. Если одна и та же буква встречается более одного раза, то
вхождения нумеруются слева направо. Например, ANACONDA преобразуется в строку 1, 6, 2, 4, 8, 7, 5, 3.
SAMPLE
614532

ANACONDA
16248753

M I S S I S S I P P I
5 1 8 9 2 10 11 3 6 7 4

Запишем слово в сетку по горизонтали слева направо. Число столбцов равно размеру ключа. Для ключа SAMPLE будет шесть столбцов,
а для ключа ANACONDA – восемь. Над сеткой выпишем числовой
ключ, как показано ниже:
ANACONDA
Ключевое слово
16248753
Числовой ключ
ENEMYTAN
Открытый текст
KSSECTOR
FORTYTWO
HEADINGW
EST
EKFHE ESRAT NROW METD AOWG NSOES TTTN YCYI
EKFHE ESRAT NROWM ETDAO WGNSO ESTTT NYCYI

Шифртекст
Группы шифртекста по 5

Прочитаем сообщение сверху вниз согласно числовому ключу.
Первым читается столбец с номером 1, EKFHE, за ним столбец с но-

112

Глава 7

Перестановка

мером 2, ESRAT, столбец с номером 3, NROW, и так далее до столбца
с номером 8, YCYI.
Полномочному получателю Риве придется немного посчитать,
чтобы прочесть это сообщение. Ключ состоит из 8 букв, сообщение –
из 35 букв. 35, поделенное на 8, равно 4 с остатком 3. Это значит, что
массив будет содержать 4 полные строки из 8 букв и неполную строку из 3 букв. Рива должна начертить прямоугольник, соответствующий такому массиву, прежде чем заполнять столбцы, ведь ей нужно
поместить в каждый правильное число символов.
Задача противника, Эмили, немного труднее. Порядок действий
таков: записать буквы из каждого столбца вертикально на полоске
бумаги, а затем прикладывать эти полоски друг к другу, пытаясь
определить порядок столбцов. Она ищет пары полосок, в которых
соответственные буквы образуют часто встречающиеся биграммы.
Найдя хорошее соответствие, она пытается приложить третью полоску до или после первых двух. Когда 3 или 4 полоски будут сложены правильно, начнут проявляться короткие слова, и дальше работа
пойдет быстрее.
Эмили не знает длину ключевого слова, поэтому придется ее угадывать. Она могла бы начать с длины 5 и постепенно ее увеличивать.
Предположим, что она дошла до правильной длины 8. Как и Рива,
она делит 35 на 8. Она знает, что есть 5 коротких столбцов по 4 буквы
и 3 длинных столбца по 5 букв. Проблема в том, где начать и закончить каждую полоску, так чтобы она содержала хотя бы один полный
столбец.
Первая полоска начинается с первого символа шифртекста
и должна содержать 5 букв в случае, если первый прочитанный из
массива столбец был длинным. Вторая полоска начинается с пятой
буквы шифртекста, если первый столбец был коротким, и заканчивается на десятой букве, если оба столбца, первый и второй, были
длинными. Точно так же для третьей и четвертой полосок. Затем
Эмили проделывает аналогичные действия для оставшихся четырех
полосок, только начинает с последней буквы шифртекста и движется
от нее к центру.
Потом Эмили сопоставляет полоски, сдвигая их друг относительно друга, чтобы найти правильное взаимное расположение. Все это
делается вручную, поэтому Эмили должна знать частоты наиболее
употребительных биграмм и триграмм наизусть. На компьютере
было бы быстрее и проще.
Чтобы воспрепятствовать такой процедуре сопоставления, отправитель Сандра считывает одни столбцы сверху вниз, а другие снизу
вверх. Это значит, что Эмили понадобится второй набор полосок,
читаемых в обратную сторону. И количество сопоставляемых полосок удвоится.
Столбцовая перестановка с чтением всех столбцов сверху вниз получает оценку 2, если массив прямоугольный, и 3 в противном случае. Когда столбцы читаются в чередующихся направлениях, оцен-

113

Столбцовая перестановка

ка повышается до 3, если сетка прямоугольная, сетки или столбцы
длинные, и до 4 в противном случае.
Столбцовая перестановка – проверенный временем метод увеличения стойкости любого подстановочного шифра. В сочетании с хорошо перемешанной подстановкой она получает оценку 5. В сочетании с хорошо перемешанным общим многоалфавитным шифром
ее оценка 7. Стойкость такой комбинации максимальна, если длины
двух ключей – взаимно простые числа.
Самый распространенный способ укрепления столбцовой перестановки – ввести строки переменной длины. Тогда Эмили будет
труднее понять, где должны начинаться и заканчиваться полоски.
Ниже продемонстрированы четыре идеи в этом направлении1. Из
них идея (4) дает самый стойкий шифр, потому что полоски разрываются в непредсказуемых точках посередине, а не на концах. Возможны и более изощренные расстановки пробелов, например два
и более пробелов в некоторых столбцах.
Столбцовая перестановка с такими вариациями получает оценку 4,
при условии что Эмили не знает расстановки. Для варианта (4) оценка повышается до 5, если ключ длинный и число пробелов в столбцах
переменное. Французы применяли подобную систему в конце Первой мировой войны. Есть мнение, что немцы смогли прочитать по
крайней мере часть этих сообщений, главным образом потому, что
французы многократно использовали один и тот же ключ.
(1)
TRANSPOSIT
961375482X
INTHISCIPH
ERSHORTRO
WSALTERNAT
EWITHLONG
ROWS
(1)
(2)
(3)
(4)

(2)
TRANSPOSIT
961375482X
THISTIM
EEACHROW
ISLONGERT
HANTHEROWA
BOVE

(3)
TRANSPOSIT
961375482X
HEREISA
TILTEDV
ERSIONO
RSTAIRC
ASE

(4)
TRANSPOSIT
961375482X
THISONEU
SE SAPRES
ETPA TTER
NOFBLA NK
S

TSAIW POAGH HLTSC TROSR ELNRS WOIOT HIRNN IEWER HT
IALNV TWSCO TEMOE RIRGE HESAO THNHW ROTEI HBA
RIEOR ELRRA DOAES EITSE TITSS AVNIH C
TPF EEEN HAB OPT SAA ETO ISL NRT SENS USRK

Еще две вариации на тему лесенки (3): вариант (5) – начинать со
столбца 1 при достижении правого края, и вариант (6) менять направление при достижении правого края, в результате чего полу1

Для понимания текста полезно знать, как переводятся открытые тексты
в примерах (1)–(6): (1) в этом шифре короткие строки чередуются с длинными; (2) на этот раз каждая строка длиннее расположенной над ней;
(3) здесь мы имеем текст, сдвинутый лесенкой; (4) а здесь используется
предустановленный паттерн пробелов; (5) этот паттерн начинается заново с первого столбца; (6) этот паттерн образует зигзаг или последовательность шевронов. – Прим. перев.

Глава 7

114

Перестановка

чается зизгагообразный узор. Преимущество этих вариаций в том,
что в каждой строке, кроме, быть может, последней, число символов
одинаково, поэтому Риве очень просто вычислить число строк. Ниже
приведены примеры этих двух вариаций.
(5)
EXAMPLE
2715643
THISP
ATTER
NSTAR
TSAGA
INFRO
MTHEF
IRSTC
OLUMN

(6)
EXAMPLE
2715643
THISP
ATTER
NFORM
SAZIG
ZAGOR
CHEVR
ONSEQ
UENCE

Шифртекст
(5) ITNAN MSLTT
UPETA RHCMH
(6) ITNAG HOETZ
NPEOI RVSCH

IRFRA OENST SGFTT
ASIRO
MQRRG REEST FZOEN
ASACU

Можно также создать две и более отдельных лесенок разной ширины или организовать лесенки в направлении диагонали и антидиагонали: \ и /.
Если при дешифрировании сообщения, отправленного с применением любого из этих вариантов столбцовой перестановки, возникают трудности с определением количества строк или длины последней строки, то можно воспользоваться таким приемом. Подсчитаем
число букв в сообщении и заполним массив слева направо таким количеством точек, следуя той же схеме, которой Сандра пользовалась
при вписывании букв. Затем вставим буквы поверх точек.
Например, в случае варианта (2) предположим, что мы договорились всегда начинать с 7 букв в первой строке. Шифртекст (2) содержит 38 букв, поэтому помещаем 7 точек в первую строку, 8 точек
во вторую и т. д., пока не разместим все 38 точек. Затем начинаем
вписывать буквы в нужные столбцы, заменяя точки:
961375482X
·······
········
·········
··········
····

961375482X
··I····
··A·····
··L·····T
··N·····W·
··V·

961375482X
··IS··M
··AC··O·
··LO··E·T
··NT··R·W·
··VE

961375482X
·HIS·IM
·EAC·RO·
·SLO·GE·T
·ANT·ER·W·
·OVE

Еще один способ использовать черные клетки – заполнить их nullсимволами. Null-символы следует выбирать так, чтобы они образовывали редко встречающиеся пары букв с обеих сторон, это затруднит Эмили сопоставление столбцов. Лучше использовать расхожие,
а не редкие буквы, в которые легко распознать null-символы. Вот
пример:

Столбцовая перестановка
961375482X
·WHEN·ANEE
L·BITE·SYO
UR·HAND·WI
THA·PAIN·Y
OUCA·NTST·
·ANDT·HATS
A·MORA·Y

961375482X
FWHENAANEE
LWBITEISYO
URGHANDPWI
THAEPAINIY
OUCAHNTSTG
AANDTNHATS
AOMORAUY

115

Шифртекст
HBGAC NMEYW ITTEI HEADO AIDIT HUAEN
ANNAW WRHUA ONTAP HTRNS PNSAY FLUTO
AAEOI YGS

Столбцовая перестановка с null-символами получает оценку 3.
При фиксированном паттерне закрашенных пробелов оценка повышается до 4.

7.2.1

Cysquare
Историческая справка. Во время Второй мировой войны британцы использовали вариант этой идеи, предложенный бригадиром
Джоном Х. Тилтманом в 1941 году и названный им Cysquare. Шифр
Cysquare представлял собой столбцовый перестановочный шифр
с большим числом пробелов. Британцы применяли блокноты с разграфленными квадратами 26×26, в которых примерно 60 % случайно
расположенных клеток было закрашено. Расположение закрашенных клеток на разных страницах различалось. Сообщение записывалось в белые клетки по строкам, а считывалось по столбцам в некотором порядке. Поскольку сетка квадратная, ориентация могла
быть любой.
Ключом служил номер страницы блокнота, ориентация, а также
начальная и конечная позиции в сетке. Шифровальщик должен был
провести на странице линии, обозначающие область сообщения.
Благодаря выбору разных областей одну страницу можно было использовать для шифрования нескольких сообщений.
Недостаток – необходимость раздавать много блокнотов. Чтобы
уменьшить их количество, каждая страница использовалась в течение полного дня для шифрования до 50 сообщений. Стало быть,
писать приходилось со слабым нажимом и много раз стирать написанное. Страницы становились нечитаемыми, и в конце концов шифровальщики отказались от блокнотов. В 1944 году шифр
Cysquare отменили.
Захватив несколько таких блокнотов вместе с инструкциями, немцы стали сами пользоваться этой системой, с 1944 года и до конца
войны. Они называли ее Rasterschlüssel, т. е. сеточный ключ. Но немцы не уделяли должного внимания выбору черных и белых клеток –
в их блокнотах было слишком много соседних белых клеток, поэтому британцы смогли идентифицировать биграммы и триграммы
методом сопоставления полосок. Эти сообщения стали ценным источником разведывательной информации. Шифр Cysquare получает
оценку 7, а шифр Rasterschlüssel – оценку 4.

116

Глава 7

Перестановка

Отметим, что в эпоху компьютеров черные и белые клетки можно
передавать в виде комбинаций битов, а сама сетка может быть любого размера и изменяться после зашифровывания каждого сообщения. Я рекомендую выбирать от 65 до 75 % черных клеток. В этом
случае Cysquare получил бы оценку 8.
Есть упрощенная версия Cysquare, которая не требует напечатанных сеток и позволяет использовать числовой ключ для задания черных клеток. Ниже показаны два варианта перестановочного
шифра Blackout – с чередованием направления и лесенкой. В обоих
случаях черные клетки задаются ключом 3174255. Этот ключ может
использоваться повторно или формироваться генератором псевдо­
случайных чисел. Для задания порядка чтения столбцов следует использовать отдельный ключ.
С чередованием
3
JACKAND
1 JILLWENTU
7
PTH
4 EHILLT
2
OFETCHAP
5 AILOF
5
WATER

3
1
7
4
2
5
5

Лесенкой
JACKAND
JIL LWENTU
PTH
E
HILLT
OFETC HAP
AILOF
WA
TER

Еще один способ укрепления столбцовой перестановки – разбить
текст на блоки нерегулярного размера. Например, при длине сообщения 150 его можно было бы разбить на блоки, содержащие 37, 71
и 42 буквы. Этот метод получает оценку 4. При использовании разных ключей для каждого блока оценка повышается до 5.
Сочетание столбцовой перестановки с любым подстановочным
шифром резко повышает стойкость. Даже за сочетание с простой
подстановкой оценка повышается до 5, поскольку сопоставление
полосок сильно затруднено. И не важно, какая операция применяется первой. Сочетание общего многоалфавитного шифра со столбцовой перестановкой при 12 и более столбцах повышает оценку до
7, даже если период многоалфавитного шифра равен всего лишь 3.
Причина в том, что возможность сопоставить полоски практически
исключена.

7.2.2

Перестановка слов
Перестановка слов – важная историческая столбцовая перестановка
не букв, а слов. Это основной метод, применявшийся Федеральной
армией во время Гражданской войны в США. Идею придумал Энсон
Стейджер, телеграфист, который впоследствии основал телеграфную компанию Вестерн Юнион. Линии связи федералов страдали от
большого числа ошибок передачи. Часто командиры отказывались
от телеграфа и просто посылали пешего или конного курьера. Стейд-

117

Двойная столбцовая перестановка

жер понял, что если передавать не отдельные буквы, а целые слова,
то частота ошибок снизится и повторно передавать сообщения придется реже.
Шифровальщики федералов записывали сообщения слово за словом слева направо в прямоугольный массив, а затем считывали по
различным маршрутам, например по столбцам с чередованием направления или выбирая столбцы попеременно из левой и правой половин массива. Текст щедро уснащался null-словами. Пример приведен ниже. Обратите внимание, что строка заполнена ничего не
значащими null-словами. Столбцы считываются в порядке 1, 3, 5, 2, 4.
BRING
SOUTH
SHOULD
LEFT
EAST
OUR

CANNON
WEST
RECENT
FLANK
TO
GUNS

BRIGADE
TO
ABOUT
MOUNT
DRIVE

SIX
ATTACK
HORSE
CHARGE
ENEMY

FIVE
ENEMY
NORTH
FROM
TOWARD

Открытый текст

BRING SOUTH SHOULD LEFT EAST OUR BRIGADE TO ABOUT MOUNT DRIVE
FIVE ENEMY NORTH FROM TOWARD CANNON WEST RECENT FLANK TO GUNS
SIX ATTACK HORSE CHARGE ENEMY

7.3

Двойная столбцовая перестановка
Как понятно из названия, двойная столбцовая перестановка подразумевает выполнение двух столбцовых перестановок подряд,
желательно с разными ключами. В результате исключается сама
возможность сопоставления полосок. Удивительно, но в 1934 году
Соломон Кулльбак нашел общее решение, которое было напечатано Службой разведки сигналов. Эта брошюра, занимающая 31 страницу, была рассекречена в 1980 году и опубликована издательством
Aegean Park Press. Это издательство в течение многих лет было бесценным источником книг по криптографии. Оно прекратило существование в 2001 году со смертью своего основателя Уэйна Дж.
Баркера, после чего книги стали недоступны. Рад сообщить, что
теперь они имеются на сайте www.openlibrary.org (я заходил туда
в июле 2019 года).
Не буду повторять здесь анализ Кулльбака, скажу только, что он
основан на определении мест шифртекста, в которых встречается
каждая буква открытого текста. Вместо этого я обсужу три способа
противостоять решению Кулльбака. (Кстати, Кулльбак учился в той
же школе, что мой отец, но шестью годами раньше.)
Простой способ – изменить форму сетки, вычеркнув несколько
клеток. Эти клетки могут образовывать прямоугольник или какуюто другую фигуру, располагаться в одном из углов или даже в середине сетки. Вот несколько примеров:

Глава 7

118
Прямоугольник 2×2
········
········
··········
··········
··········

Перестановка

Прямоугольник 3×1
··········
··· ······
··· ······
··· ······
··········

Лесенка
········
······· ·
······ ··
··········
··········

Треугольник
··········
··········
·········
········
·······

Черные участки на двух шагах перестановки могут иметь разные
размеры, формы или местоположения. Эти параметры можно включить в состав ключа, так что для каждого сообщения будут использоваться свои черные участки. Двойная столбцовая перестановка
получает оценку 4. А с черными клетками – оценку 5.
Противоположный метод, называемый NullBlock, также эффективен. Можно вставить блок null-символов в промежуточный шифртекст, в окончательный шифртекст или туда и сюда. Вставлять такой
блок в открытый текст бессмысленно. Размер и положение блока
можно задать с по­мощью числового ключа. Ключи для каждого сообщения должны быть различны.
Сочетание любого перестановочного шифра с любым подстановочным повышает стойкость обоих. Двойная столбцовая перестановка в сочетании с простой подстановкой получает оценку 6.
А в сочетании с общим многоалфавитным шифром – оценку 8.

7.4

Столбцовая перестановка с циклическим
сдвигом
Еще одна вариация на ту же тему – столбцовая перестановка с цик­
лическим сдвигом. Есть две разновидности: со сдвигом по горизонтали и по вертикали. Для циклической перестановки с циклическим
сдвигом по горизонтали нужно два ключа: один для задания циклического сдвига строк, другой для определения порядка столбцов.
Сначала записываем сообщение в прямоугольный блок слева направо по строкам. Затем записываем ключи циклического сдвига по
вертикали слева от строк. Если строк больше, чем длина ключа, то
повторяем ключи столько раз, сколько необходимо. Если в качестве
ключа циклического сдвига выбирается слово или фраза, то преобразуем его в число обычным способом, исходя из порядка букв в алфавите.
Имея числовой ключ, циклически сдвигаем каждую строку влево на указанное в ключе число позиций. Затем считываем буквы по
столбцам в порядке, заданном столбцовым ключом. Ниже приведен
пример с ключом циклического сдвига CYCLES и столбцовым ключом PAULREVERE.

Столбцовая перестановка с циклическим сдвигом
Ключ циклического сдвига
C
Y
C
L
E
S

1
6
2
4
3
5

ONEIFBYLAN
DANDTWOIFB
YSEAANDION
THEOPPOSIT
ESHORESHAL
LBE

PAULREVERE
619572x384
NEIFBYLANO
OIFBDANDTW
EAANDIONYS
PPOSITTHEO
ORESHALESH
ELB

119

Столбцовый ключ
Шифртекст
EIAPR LYAIT AADNH EOWSO HFBNS SNOEP
OEBDD IHNTY ESIFA OEBLN OTL

Метод сопоставления бумажных полосок, который мы использовали для вскрытия столбцовой перестановки, работает и для столбцовой перестановки с циклическим сдвигом. Он лишь немногим
труднее, потому что последняя буква в каждой строке соседствует
с первой буквой, потенциально образуя низкочастотную биграмму.
Но это задержит Эмили ненадолго. Столбцовая перестановка с цик­
лическим сдвигом по горизонтали получает оценку 3.
Циклический сдвиг по вертикали аналогичен. Вместо циклического сдвига строк влево мы сдвигаем столбцы вверх. Ниже приведен пример с ключевым словом CYCLE для циклического сдвига
столбцов и с ключевым словом PAULREVERE, задающим порядок
чтения столбцов.
CYCLECYCLE
1524315243
ONEIFBYLAN
DANDTWOIFB
YSEAANDION
THEOPPOSIT
ESHORESHAL
LBE

PAULREVERE
619572x384
DBEOPWYIAT
YNEIRNOSAL
TAHDFPDHFN
ESEATEOLOB
LHEOABSIIN
OSN

Ключевая фраза
Числовой ключ
Открытый текст

BNASH SWNPE BISHL ITLNB NOIDA ODYTE
LOPRF TAAAF OIEEH EENYO DOS

Шифртекст

Этот шифр по-прежнему можно вскрыть сопоставлением бумажных полосок, как и в случае регулярной столбцовой перестановки, но
Эмили понадобится две полоски для каждого столбца: для верхней
и для нижней секций. Когда столбец циклически сдвигается, некоторые символы, находившиеся сверху, перемещаются вниз и становятся новой нижней секцией. Остальные буквы перемещаются вверх
и становятся новой верхней секцией. В примере выше левый столбец ODYTEL сдвигается вверх на одну позицию, поэтому DYTEL становится новой верхней секцией, а O – новой нижней секцией. Эти
секции должны быть записаны на отдельных полосках, потому что
Эмили не знает, откуда взялись буквы: из длинного столбца или из
короткого. Поэтому процесс сопоставления значительно осложняется. Столбцовая перестановка с циклическим сдвигом по вертикали
получает оценку 4.

120

Глава 7

Перестановка

Можно подвергнуть блок одновременно циклическому сдвигу
по горизонтали и по вертикали. По стойкости это сравнимо с двойной столбцовой перестановкой. Напомним, однако, что чем сложнее шифр, тем больше времени и труда занимает зашифровывание
и расшифровывание. Двойная столбцовая перестановка с циклическим сдвигом получает оценку 5.

7.5

Перестановка со случайными числами
Рассмотрим теперь перестановку совершенно другого типа. В ней не
будет никаких массивов и сеток. А просто буквы сообщения нумеруются случайным образом.
Можно использовать любой генератор случайных чисел. Несколько таких представлено в главе 13. До сих пор я описывал только цепной генератор цифр в разделе 4.5.1, поэтому им и воспользуемся для
иллюстрации. Сгенерируем по одной случайной цифре для каждой
буквы сообщения:
431932748659278301459896508643752196
INCREASEBIDTOTWELVEPOINTSEVENMILLION

Сначала возьмем все буквы с номером 1, слева направо. Это C, V
и I.
431932748659278301459896508643752196
IN-REASEBIDTOTWEL-EPOINTSEVENMILL-ON

CVI

Затем возьмем все буквы с номером 2. Это A, O и L.
431932748659278301459896508643752196
IN-RE-SEBIDT-TWEL-EPOINTSEVENMIL--ON

CVIAOL

Далее возьмем все буквы с номером 3. Это N, E, E и M.
431932748659278301459896508643752196
I--R--SEBIDT-TW-L-EPOINTSEVEN-IL--ON CVIAOLNEEM

Продолжаем, пока еще остаются буквы.
Чтобы дешифрировать сообщение, Рива сначала генерирует случайные цифры. Среди них имеются три единицы, поэтому она записывает первые три буквы шифртекста, CVI, под этими тремя единицами:
431932748659278301459896508643752196
--C--------------V---------------I--

Селекторная перестановка

121

Далее Рива записывает следующие три буквы, AOL, под двойками:
431932748659278301459896508643752196
--C--A------O----V--------------LI--

И так далее.
Перестановка со случайными числами получает оценку 4. Ее можно взломать, перебрав все возможные начальные значения генератора случайных чисел.
Шифр можно укрепить, взяв более длинное начальное значение
или выбирая буквы открытого текста не в естественном порядке 1,
2, 3, ..., а в каком-то другом. Это эквивалентно применению простой
подстановки к выходу генератора случайных чисел. Например, если
бы мы захотели начать с букв с номером 4, то следовало бы заменить
все четверки на единицы. А если бы далее мы захотели взять все буквы с номером 7, то нужно было бы заменить все семерки на двойки
и т. д. Все остальное делается, как и раньше. Количество возможных
ключей при этом увеличивается в 10! = 3 628 800 раз.
При таком улучшении перестановка с цепным генератором цифр
получает оценку 5. Компьютерная версия метода, в которой генератор случайных цифр порождает байты, получает оценку 7 из-за очень
большого числа возможных перестановок 256 различных байт.

7.6

Селекторная перестановка
Раз уж мы заговорили о случайных числах, рассмотрим еще один
перестановочный шифр на основе случайных чисел – селекторную
перестановку. Идея в том, чтобы разбить сообщение на приблизительно равные части, а затем объединить их в случайной последовательности.
Пусть открытый текст содержит 100 символов, и мы хотим разбить
его на три части. Предположим, что имеется генератор случайных чисел, который порождает цифры 0, 1 и 2 с равной вероятностью, и что
мы выбираем начальное значение, играющее роль ключа перестановочного шифра. Необходимо знать размер каждой части сообщения.
Тут все просто. Нужно лишь сгенерировать первые 100 случайных
цифр и подсчитать, сколько среди них экземпляров каждой цифры.
Допустим, сгенерировано 36 нулей, 25 единиц и 39 двоек. Разобьем
сообщение на три части: P0 длиной 36, P1 длиной 25 и P2 длиной 39.
С шифрованием проблем не возникает. Всякий раз, как генератор
порождает 0, берем следующую букву из P0. Когда генератор порождает 1, берем букву из P1, а когда он порождает 2 – букву из P2. Дешифрирование еще проще, поскольку Риве не нужно знать размеры
частей. Получив от генератора 0, она помещает следующую букву
в P0, получив 1 – в P1, а получив 2 – в P2. Затем она конкатенирует

122

Глава 7

Перестановка

все три части или просто читает сообщение, не обращая внимания
на разрывы строк.
Если частей всего две, то Эмили реконструирует сообщение тривиально. Оценка 1. Если частей три, то задача немного усложняется – оценка 2. При 20 и более частях шифр получает оценку 5.

7.7

Перестановка с ключом
Иногда предпочтительнее переставлять блоки сообщения. Лучший шифр такого рода – перестановка с ключом. Запишем числовой ключ над символами сообщения, а затем переместим каждый
символ в позицию, совпадающую с соответственной цифрой ключа.
В примере ниже размер блока равен 8, а ключ равен 41278563. Первой букве, R, соответствует цифра ключа 4, поэтому перемещаем R
в четвертую позицию блока. Второй букве, U, соответствует цифра 1,
поэтому перемещаем U в первую позицию блока. И так далее.
41278563 41278563 41278563 41278563 41278563 4127
RUSSIANT RADEDELE GATIONEX PECTEDTO ARRIVELO NDON
USTRANSI ADTRELED ATXRNEIO ECOPDTTE RROAELIV DONN

Перестановку с ключом можно применять к открытому тексту,
к шифртексту или к тому и другому. Сама по себе перестановка
с ключом – слабый шифр. Ее оценка – от 1 до 3 в зависимости от размера блока.
* Приглядимся к перестановкам пристальнее. В примере ниже
я использовал шестнадцатеричные цифры A, B, C для обозначения
чисел 10, 11, 12. В шифре эти числа будут представлять биты, буквы
или иные переставляемые единицы.
123456789ABC
4A1729C5B683

Исходный порядок
После перестановки

Верхняя строка стандартная. Она представляет исходный порядок,до перестановки. Вторая строка – результат перестановки. Далее в этом разделе вторая строка будет использоваться для описания
перестановок.
В этой перестановке число из позиции 1 перемещается в позицию
4, число из позиции 4 – в позицию 7, из позиции 7 – в позицию 12, из
позиции 12 – в позицию 3, а из позиции 3 – в позицию 1, завершая
цикл 1→4→7→C→3→1. Этот цикл можно записать в виде (1, 4, 7, 12, 3).
Первое число, не принадлежащее этому циклу, – 2. Начав с позиции 2, мы найдем цикл 2→A→6→9→B→8→5→2, который можно записать в виде (2, 10, 6, 9, 11, 8, 5). Тогда всю перестановку можно записать в виде (1, 4, 7, 12, 3) (2, 10, 6, 9, 11, 8, 5).

Перестановка с ключом

123

Эти два цикла имеют период 5 и 7 соответственно, так что период
всей перестановки равен 35. Это значит, что если повторно применять ее к блоку из 12 букв, то получится 35 различных перестановок
букв, а 36-я совпадет с исходным блоком.
Допустим, что мы хотели создать стойкий блочный перестановочный шифр, в котором для каждого блока определена своя перестановка. Применение показанной выше перестановки разное число
раз к каждому блоку не годится, потому что через каждые 35 циклов
мы возвращаемся в исходное место. Эту проблему можно решить,
если использовать две разные перестановки и чередовать их.
Пусть есть две перестановки, A и B. Если A и B выбраны правильно,
то можно сгенерировать огромное число перестановок: A, B, AA, AB,
BA, BB, AAA, AAB, ABA, ..., – и все они будут различны.
Вот здесь важно понимать циклическую структуру перестановок.
Предположим, что выбраны перестановки (1, 4, 7, 12, 3) (2, 10, 6, 9,
11, 8, 5) и (1, 4, 3, 12, 7) (2, 10, 9, 6, 5, 11, 8). Они разбивают блок из 12
единиц на две одинаковые части, а именно: [1, 3, 4, 7, 12] и [2, 5, 6, 8, 9,
10, 11]. Если чередовать две перестановки, то часть [1, 3, 4, 7, 12] будет
переставляться независимо от части [2, 5, 6, 8, 9, 10, 11]. То есть между
двумя множествами чисел нет никакого взаимодействия. Чтобы получить длинный период, каждый цикл второй перестановки должен
как можно сильнее перекрываться с каждым циклом первой перестановки. Вот подходящий набор перестановок:
(1, 4, 7, 12, 3) (2, 10, 6, 9, 11, 8, 5)
(1, 10, 8) (4, 6, 5, 12) (2, 11, 9, 7, 3)
Этот перестановочный шифр получает оценку 3. Чтобы его
вскрыть, нужно перебрать все 12! возможных перестановок первого
блока. Это всего 4.79×108. Для каждой перестановки, порождающей
разумный текст первого блока, Эмили может перебрать все 12! перестановок второго блока. На практике попыток будет гораздо меньше, чем (12!)2 = 2.29×1017, потому что знания первых 3 или 4 символов
блока может оказаться достаточно для исключения маловероятных
комбинаций. На самом деле вскрыть этот шифр реально даже вручную. Трудность медленно возрастает с увеличением размера блоков. **
Существует несколько способов повысить безопасность перестановки с ключом. Один из них – перекрытие блоков. Например, если
размер блока равен 16, то можно начинать блоки не в позициях сообщения 1, 17, 33, ..., а в позициях 1, 9, 17, 25, 33, ... . Тогда каждый
блок перекрывает 8 единиц предыдущего и 8 единиц последующего блоков. Последние восемь единиц сообщения можно объединить
с восьмью первыми единицами, образовав заворачивающийся блок.
Этот шифр получает оценку 4.
Величина перекрытия может быть и переменной. Если текущий
блок начинается в позиции P и имеет длину L, то следующий блок

124

Глава 7

Перестановка

может начинаться в любой позиции от P+1 до P+L. Этот шифр получает оценку 5. Если используются две разные перестановки и позиции перекрытия выбираются случайно, то оценка повышается до 7.
* Второй способ повысить стойкость блочного перестановочного
шифра – выполнить композицию перестановок. Если T и U – перестановки, то их композицией, обозначаемой TU, называется перестановка, получающаяся, если сначала выполнить U, а затем T. Результат будет таким же, как если применить T для перестановки U,
а затем получившуюся перестановку применить к тексту. Рассмот­
рим пример. Пусть T – перестановка 419628573, а U – перестановка
385917462. Поскольку U – блок из 10 символов, то можно использовать T для перестановки U точно так же, как мы использовали бы
T для перестановки 10-буквенного слова. Записываем T в первой
строке, чтобы использовать как ключ перестановки, а U во второй
строке – как переставляемый текст. Первая цифра результата – это
цифра, расположенная под цифрой 1 ключа, т. е. 8 (см. закрашенные
серым цифры). Вторая цифра результата – это цифра, расположенная под цифрой 2 ключа, т. е. 1, и т. д. При использовании T для перестановки U получается 812349675.
419628573
385917462
812349675

T
U
TU

С помощью композиции мы можем генерировать последовательность перестановок, U, TU, TTU, TTTU, ... . Период этой последовательности такой же, как у T. Для блока размера 12 самый длинный
период получается при длинах циклов 3, 4 и 5, т. е. он равен 3×4×5 =
60. Если количество блоков в сообщении больше 60, то желателен более длинный период. Это можно сделать, применяя к перестановке
либо U, либо T в каком-то регулярном или случайном порядке, например U, TU, TTU, UTTU, UUTTU, ... . Так можно сгенерировать очень
большой набор различных перестановок, при условии что сами T и U
имеют длинные периоды, а циклы T перекрываются с циклами U,
как было описано выше.
Чтобы проверить, достаточно ли перекрытие циклов, можно воспользоваться тестом прироста. Начнем с любого цикла T или U.
Он образует множество, содержащее всего один этот цикл. Добавим
к множеству любой другой цикл T или U, имеющий общие элементы с первым. Затем добавим в новое множество еще какой-то цикл
T или U, имеющий общие элементы с ранее выбранными циклами.
Продолжаем в том же духе до тех пор, пока добавление циклов с общими элементами возможно. Если теперь множество циклов содержит все циклы T и U, то перекрытие хорошее. Если вы решите
использовать больше двух перестановок, скажем T, U и V, то перекрываться должна каждая из пар T и U, T и V, U и V.

Деление перестановки пополам

125

Проиллюстрирую на примере перестановок, встречавшихся ранее
в этом разделе, T = (1, 4, 7, 12, 3) (2, 10, 6, 9, 11, 8, 5) и U = (1, 10, 8) (4, 6,
5, 12) (2, 11, 9, 7, 3). Начнем с цикла (1, 4, 7, 12, 3).
(1, 4, 7, 12, 3)
Он имеет общий элемент 1 с циклом U (1, 10, 8), поэтому добавим
этот цикл в множество.
(1, 4, 7, 12, 3) (1, 10, 8)
Оно имеет общий элемент 4 с циклом U (4, 6, 5, 12), поэтому добавляем в него и этот цикл.
(1, 4, 7, 12, 3) (1, 10, 8) (4, 6, 5, 12)
И так далее. Поскольку множество включает все циклы T и U, эта
пара перестановок имеет хорошее перекрытие и генерирует очень
большое семейство перестановок в результате композиций. **

7.8

Деление перестановки пополам
Деление перестановки пополам – предназначенный для применения
на компьютере метод, в котором двоичный ключ используется для
обмена местами единиц – битов, байтов или даже шестнадцатеричных цифр. IBM опубликовала его во внутреннем бюллетене Invention
Disclosure Bulletin, и он рассматривался как кандидат на включение
в стандарт шифрования данных DES. Метод применяется к блоку,
размер которого равен степени 2, обычно 32 или 64 единицы. Для
блока из n единиц длина ключа равна n – 1 бит.
Рассмотрим метод на примере блока из 16 символов. Открытым
текстом будет GEORGE WASHINGTON. В перестановке используется
15-битовый ключ. Первый бит ключа определяет, нужно ли менять
местами половины блока по 8 символов: 0 – не менять, 1 – менять.
Следующие 2 бита ключа определяют, нужно ли менять местами
4-символьные половины этих половин. Если бит 2 ключа равен 1, то
первая четверть меняется местами со второй. Если бит 3 ключа равен 1, то третья четверть меняется местами с четвертой. Следующие
4 бита ключа определяют, нужно ли менять местами половины этих
четвертей. Например, если бит 4 равен 1, то первая восьмушка блока
меняется местами со второй. Последние 8 бит управляют обменом
шестнадцатых частей блока. Например, если последний бит ключа
равен 1, то последние 2 единицы, 15-я и 16-я, т. е. буквы O и N, меняются местами.

126

Глава 7

Перестановка
1

2

3

4
8

5
9

10

6
11

12

7
13

14

15

G E O RG EW A S H I NG T O N

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

7.9

Множественные анаграммы
Общий метод вскрытия перестановочных шифров, который работает для многих типов перестановок и даже когда тип неизвестен,
называется множественными анаграммами. Для его использования
необходимо перехватить несколько сообщений одинаковой длины.
Если для перестановки этих сообщений применялся один и тот же
ключ, то первые буквы всех сообщений окажутся в одной и той же
позиции всех шифртекстов, равно как вторые и все последующие
буквы.
Этим фактом можно воспользоваться. На первой бумажной полоске выпишите все первые буквы шифртекстов, на второй полос­
ке – все вторые буквы и т. д. Количество полосок должно совпадать
с длиной шифртекстов. Чем больше имеется сообщений, тем длиннее будут полоски и тем выше шансы на успех. В общем случае считается, что необходимо как минимум 3 сообщения.
Рассмотрим пример. Пусть имеется три зашифрованных сооб­
щения:

(1) TTWACNAATKAD
(2) NEMSMORMEODA
(3) ETCMMEANEETO

1
T
N
E

2
T
E
T

3
W
M
C

4
A
S
M

5
C
M
M

6
N
O
E

7
A
R
A

8
A
M
N

9
T
E
E

10
K
O
E

11
A
D
T

12
D
A
O

Длина сообщения равна 12. В правой части показаны все 12 полосок.
Сообщение (1) содержит букву K, которой часто предшествуют
буквы C и N. Сообщение (1) содержит ту и другую. Сообщение (2) содержит букву D. Ей с большой вероятностью может предшествовать
буква N. В сообщении (2) есть одна буква N. Посмотрим, существуют
ли какие-то правдоподобные варианты. Имеем:
5 10
C K
M O
M E

6 10
N K
O O
E E

1 11
T A
N D
E T

127

Множественные анаграммы

В сообщении (2) самая вероятная буква, предшествующая ND, – A
или E. Это дает три возможности:
2
T
E
T

1 11
T A
N D
E T

9
T
E
E

1 11
T A
N D
E T

12
D
A
O

1 11
T A
N D
E T

Сопоставляя каждую из них с 9 остальными полосками, обнаруживаем, что лучшее соответствие дает полоска 4.
4
A
S
M

9
T
E
E

1 11
T A
N D
E T

Это хорошо согласуется со столбцами 5 и 10, которые мы уже объединили ранее.
4
A
S
M

9
T
E
E

1 11 5 10
T A C K
N D M O
E T M E

Теперь легко завершить все три сообщения: (1) ATTACK AT DAWN,
(2) SEND MORE AMMO и (3) MEET ME AT ONCE.

8

Цилиндрический шифр
Джефферсона

Краткое содержание главы:
цилиндрический шифр Томаса Джефферсона;
вскрытие цилиндрического шифра, когда есть известное
слово;
„„ вскрытие цилиндрического шифра, когда известных слов нет.
„„
„„

Томас Джефферсон изобрел цилиндрический шифр между 1790 и 1793
годом, когда исполнял должность государственного секретаря при
Джордже Вашингтоне. Устройство состоит из железного стержня,
или оси диаметром от 1/8 до 1/4 дюйма и длиной от 6 до 8 дюймов, на
которую нанизано 36 деревянных дисков диаметром 2 дюйма и толщиной 1/6 дюйма. Эти диски образуют деревянный цилиндр. Плос­
кие поверхности дисков соприкасаются, а внешние круглые края
видны. На один конец оси насажен глухой стопор, напоминающий
шляпку гвоздя, а на другом нарезана резьба, на которую навинчивается гайка, не дающая дискам рассыпаться.
На плоских поверхностях дисков проставлены номера от 1 до 36.
Внешний край поделен на 26 равных секторов, в которые вписаны
или выгравированы 26 букв алфавита в случайном порядке, своем
для каждого диска. Порядок дисков на оси – это ключ шифра, в наши
дни называемого мультиплексным шифром.

Множественные анаграммы

129

Ниже приведено изображение шифровального цилиндра Джефферсона с 26 дисками. Оригинал хранится в Национальном музее
криптологии в Форт-Миде, штат Мэриленд.

Чтобы зашифровать сообщение с по­мощью этого устройства, дис­
ки нужно нанизать на ось в порядке, определяемом ключом. Гайка
завинчивается не до конца, чтобы диски можно было поворачивать.
На первом диске находим первую букву сообщения, а второй диск
поворачиваем так, чтобы вторая буква сообщения находилась рядом
с первой. Затем третий диск поворачивается так, чтобы третья буква
оказалась рядом со второй, и так далее, пока первые 36 букв сообщения не выстроятся в ряд. После этого гайка закрепляется и фиксирует диски.
Вращая цилиндр, мы будем видеть еще 25 строк букв, содержащих
бессмысленную абракадабру. Сандра может выбрать любую из них
в качестве шифртекста. Рива выполнит описанную выше процедуру,
собрав в одном ряду букв шифртекст. После этого будет ясно, какая
из остальных 25 строк содержит сообщение.
По-видимому, Джефферсон так никогда и не воспользовался этим
шифром. Идея находилась под спудом, пока в начале 1890-х годов
ее не открыл заново Этьен Базери. Французы приняли ее на вооружение в 1901 году. В варианте Базери было два усовершенствования.
Он снабдил устройство подставкой, чтобы его можно было поставить
на стол и использовать обе руки, а также добавил направляющую,
чтобы пользователю было проще выравнивать буквы и выбирать
строку для считывания шифртекста. Вариант этого шифра с 25 алюминиевыми дисками изобрел полковник Паркер Хитт в 1914 году,
в 1922 году он был принят армией США под кодовым названием
M-94, а в 1926 – военно-морским флотом США под названием
CSP-488. Длина устройства Хитта составляла всего 4,25 дюйма
(10,8 см), так что его можно было носить в кармане, а на плоских
поверхностях имелись выемки и выступы, чтобы диски не проскальзывали после фиксации.
Ниже приведена фотография устройства CSP-488 из Национального музея криптологии.

130

Глава 8

Цилиндрический шифр Джефферсона

Плоскую версию этого шифра Хитт изобрел в 1916 году, а армия
приняла ее на вооружение в 1935 году под кодовым названием
M-138. Устройство представляло собой плоскую алюминиевую дощечку, в которой было прорезано 25 каналов для размещения бумажных полосок, которые могли скользить в обе стороны, имитируя
вращение дисков. На каждой полоске было напечатано две копии
перемешанного алфавита. Это устройство было безопаснее, потому
что бумажные полоски легко заменить и даже написать от руки в полевых условиях. Вскоре оно было заменено устройством M138A, или
CSP-845 по флотской классификации, в котором было 30 прорезей
для полосок. В комплект поставки устройства входило 100 полосок,
пронумерованных двузначными числами, так что для любого сообщения использовалось 30 из 100 полосок. Это дает 100!/70! = 7.79×1057
возможных ключей.
Устройство M-138A имело петлю в центре, так что его можно
было складывать. Каждая половина оснащалась отдельной направляющей, которая служила для выравнивания полосок и считывания
15 букв шифртекста. Эти усовершенствования значительно повысили стойкость шифра.
Армия отказалась от шифров на полосках в 1942 или 1943 году, но
на флоте они по-прежнему использовались как резервный вариант
на случай, если отключение электричества сделает невозможным
использование электронных или электромеханических устройств.
Мультиплексный шифр практически невозможно вскрыть, если
у Эмили нет копии устройства и она не знает алфавитов. Если же
устройство у нее есть, то вскрыть шифр относительно просто, коль
скоро известны какие-то вероятные слова. При наличии устройства
и знании некоторых слов цилиндрический шифр Джефферсона получает оценку 4 или 5. Если никакие слова неизвестны, то оценка
повышается до 6 или 7. Чем больше шифртекстов есть у Эмили, тем
ниже оценка. Наоборот, при наличии большого числа дополнительных дисков оценка растет. Например, если устройство вмещает
30 дисков, выбираемых из запаса в 100 дисков, то оценка может возрасти до 8. Для очень коротких сообщений – длиной меньше удвоенного числа дисков – вскрыть шифр вряд ли возможно, если только
Эмили не располагает несколькими перехваченными сообщениями,
зашифрованными одним и тем же ключом. Это может случиться,
если отправитель меняет порядок дисков только один раз в день.

Вскрытие при наличии известных слов

8.1

131

Вскрытие при наличии известных слов
Прочитать сообщение, зашифрованное цилиндрическим шифром
Джефферсона, можно, если имеется достаточно текста и известна
хотя бы часть сообщения. Часто хватает знания всего одного слова.
Предположим, нам известно, что Сандра пользуется устройством
M-94 с 25 дисками, и удалось перехватить сообщение
CLPOXFDQBOMTUCESZITNCVGWX
ESIWVILLSCQYRNPFJCNSRWXGK
GAFOEMZTGHJWQZTYMSAXTBILF
UICSBHWHPMBZQRCDH

Предположим также, что мы знаем, что открытый текст начинается со слова URGENT. Оно было преобразовано в шифртекст CLPOXF.
Поскольку URGENT находится в одном ряду, в CLPOXF в другом, расстояния между парами соответственных букв должны быть одинаковы. Условимся считать номер ряда, содержащего URGENT, равным 1
и предположим, что ряд, содержащий CLPOXF, имеет номер 8. Первая
буква открытого текста, U, и первая буква шифртекста, C, берутся из
ряда 1 и ряда 8 первого диска. Поэтому на первом диске расстояние
от U до C должно быть равно 7. На втором диске расстояние от R до L
должно быть равно 7. На третьем диске должно быть равно 7 расстоя­
ние от G до P. И так далее для пар E и O, N и X, T и F.
Самый простой способ поиска – пробовать каждое возможное
расстояние от 1 до 25 по очереди. Начинаем с расстояния 1. Найдем
все диски, для которых расстояние от U до C равно 1. Иными словами, C должно быть следующей буквой после U. Если таких дисков
нет, значит, расстояние точно не равно 1. Затем найдем все диски,
для которых расстояние от R до L равно 1. И снова, если таковых не
оказалось, значит, расстояние не может быть равно 1.
Предположим, мы нашли 12 наборов дисков, в которых все пары
букв находятся на расстоянии 1 друг от друга. Нужно проверить
эти 12 наборов и посмотреть, есть ли среди них правильные. Пусть
в первый набор входят диски 18-4-21-9-13-11. Начинаем проверять
со второго блока шифртекста, содержащего буквы от 26 до 50. Этот
блок начинается с ESIWVI. Установим на диске 18 букву E, на диске 4 –
букву S, на диске 21 – букву I и т. д. Теперь рассмотрим остальные
25 рядов. Если все они содержат чепуху вроде HNSAEI или TFPGUW, то
можно точно сказать, что последовательность дисков 18-4-21-9-13-11
неправильная. С другой стороны, если мы увидим какой-то разумный текст, например строку NCONDI, которая могла бы быть частью
слова UNCONDITIONAL, то, возможно, последовательность 18-4-219-13-11 правильная. Проверяем далее, взяв третий блок шифртекста,
начинающийся с GAFOEM. Если и в третьем, и в четвертом блоке удается выделить разумные фрагменты текста, то последовательность
18-4-21-9-13-11, вероятно, правильна... но надо продолжать про-

132

Глава 8

Цилиндрический шифр Джефферсона

верку, потому что, возможно, удастся найти лучшую последовательность.
Если мы не видим никаких сколько-нибудь обнадеживающих
фрагментов текста, то пробуем оставшиеся 11 последовательностей
дисков. Если так ничего и не нашлось, пробуем расстояние 2, затем 3 и т. д. до 25. Вероятно, придется проверить несколько сотен
комбинаций порядка дисков и расстояния. Это утомительно, но все
же возможно без помощи компьютера. Если ничего не получилось,
возвращаемся и ищем последовательности дисков, для которых две
проверки из трех дают правдоподобный текст.
Выбрав самую вероятную последовательность для первых 6 дисков и соответствующие расстояния, пытаемся продолжить ее на
седьмой диск. Для каждого выбора диска мы уже знаем расстояние
между открытым текстом и шифртекстом, поэтому процесс продолжения пойдет сравнительно быстро.

8.2

Вскрытие при наличии только
шифртекста
Мультиплексный шифр можно вскрыть и тогда, когда известных
слов нет. Это называется вскрытием при наличии только шифртекста. Я первым нашел такое решение («Computer Methods for Decrypting Multiplex Ciphers». Cryptologia 2 (Apr. 1978), pp. 152–160).
В оригинальной статье 1978 года я использовал частоты биграмм
и переходил к триграммам. Сегодня компьютеры гораздо быстрее
и имеют гораздо больше памяти, поэтому шаг биграмм можно пропустить. Метод предполагает, что имеется таблица с вероятностями
всех возможных триграмм в английском языке. Вы можете построить такую таблицу самостоятельно или скачать ее из интернета.
Опишу основную идею метода.
Предположим, как и раньше, что Эмили использует устройство
M-94 с 25 шифровальными алфавитами и что мы перехватили сообщение, содержащее как минимум 3 блока, или 75 букв. Нам известно
только, что сообщение написано по-английски. Пусть перехваченное сообщение имеет вид:
CLPOXFDQBOMTUCESZITNCVGWX
ESIWVILLSCQYRNPFJCNSRWXGK
GAFOEMZTGHJWQZTYMSAXTBILF

Сначала проверим все возможные варианты для первых трех дисков. Их 25×24×23 = 13 800. Для каждого варианта выставим на дисках
первые три буквы каждого блока шифрекста, а именно CLP, ESI и GAF.
Для каждой из этих триграмм посмотрим на остальные 25 рядов.
В них встречаются возможные триграммы открытого текста, соот-

Вскрытие при наличии только шифртекста

133

ветствующие триграммам шифртекста. Поскольку для каждого из
трех рядов имеется 25 вариантов, общее число возможностей равно
13800×253 = 215 625 000. Их легко перебрать на настольном компьютере и даже на ноутбуке.
Вероятность каждой комбинации трех дисков и трех рядов равна
произведению вероятностей трех триграмм открытого текста. Эквивалентно, логарифм этой вероятности равен сумме логарифмов
вероятностей трех триграмм. Идея заключается в том, чтобы оставить только самые вероятные комбинации и отбросить остальные.
Например, можно было бы оставить только 1 % самых вероятных
комбинаций или фиксированное число лучших комбинаций, скажем 1 000 000. Допустим, что мы решили сохранять 2 000 000 лучших
комбинаций.
Сделать это можно, например, так: генерируем все 215 625 000 комбинаций, сортируем их по вероятности и отбрасываем последние
99 %. Это потребовало бы очень много памяти. Есть способы получше. Сначала выделим память для таблицы, которая на 10–25 % больше нужного нам числа комбинаций, скажем с 2 500 000 элементами.
Начнем генерировать комбинации и помещать их в таблицу. Когда
таблица заполнится, ее нужно будет сократить примерно на 20 %.
Это можно сделать, отсортировав таблицу и удалив нижние 20 %.
То есть мы сортируем по вероятности, а затем уменьшаем число
элементов таблиц до 2 000 000. Отсортировать 2 500 000 элементов
быстрее, чем все 215 625 000, но есть способы еще быстрее – и намного. Выберем из таблицы 10 случайных элементов. (Если вы не
знаете, как выбирать случайно, то разбейте таблицу на 11 равных
частей и возьмите начальные элементы первых десяти частей.) Отсортируйте эти 10 элементов по вероятности в порядке возрастания.
Назовем отсортированные элементы a, b, c, d, e, f, g, h, i, j. Обозначим
P вероятность элемента b. Удалим из таблицы все элементы с вероятностью меньше P.
Продолжаем генерировать комбинации, но больше не добавляем
в таблицу элементы с вероятностью, меньшей или равной P. После
каждого заполнения таблицы повторяем процесс выборки, сортировки и пересчета пороговой вероятности P.
В конечном итоге у нас останется примерно 2 000 000 комбинаций
трех дисков и трех рядов. Следующий шаг – продолжить на 4 диска. Пробуем все 22 возможных варианта выбора 4-го диска. Это дает
примерно 44 000 000 комбинаций. Теперь рассмотрим триграммы,
образованные дисками 2, 3 и 4. Для каждой комбинации умножим
вероятность триграммы на дисках 1, 2, 3 на вероятность триграммы
на дисках 2, 3, 4 и получим приближенную вероятность тетраграммы
на всех 4 дисках. Перемножим вероятности тетраграмм открытого
текста, соответствующих всем трем тетраграммам шифртекста CLPO,
ESIW и GAFO.
Это даст нам вероятности 44 000 000 комбинаций четырех дисков
с тремя рядами. И снова мы можем оставить 1 % лучших комбина-

134

Глава 8

Цилиндрический шифр Джефферсона

ций, что даст 440 000 наборов тетраграмм. Используем тот же метод,
что и для триграмм.
Продолжая поступать таким же образом, получаем пентаграммы,
гексаграммы, гептаграммы и т. д. При добавлении каждого следующего диска можно сохранять меньше комбинаций, чем в прошлый
раз. Когда количество комбинаций уменьшится до 100, можно выбрать правильную визуально и закончить вскрытие вручную.
Но есть проблема, из-за которой эта процедура может не привести
к успеху: даже в нормальном тексте может встретиться триграмма,
для которой табличная вероятность равна 0. А если Эмили использует null-символы, то такое может происходить довольно часто. В результате правильный открытый текст будет отвергнут.
Возможное решение – ограничить вероятности триграмм, так чтобы вероятность 0 никогда не возникала. Обозначим P(x) вероятность
строки x. Если вероятность триграммы XYZ равна нулю, то можно
использовать большее из чисел P(X)P(YZ) и P(XY)P(Z). Я предлагаю
делить его, скажем, на 3, потому что XYZ ни разу не встречалась
при подсчете триграмм. Если вероятность XYZ по-прежнему равна
0, то используйте вероятности отдельных букв, например сделайте
P(XYZ) равной P(X)P(Y)P(Z)/10.
Другое решение – не перемножать вероятности, а использовать
для их комбинирования какую-нибудь другую функцию. Например,
можно складывать квадраты вероятностей. Так мы будем вознаграждать часто встречающиеся триграммы, игнорируя редкие.
Если все описанное выше не приносит результата, попробуйте
начать процедуру с другого места шифртекста. Например, начните
с пятого диска. **

9

Фракционирование

Краткое содержание главы:
квадрат Полибия;
разбиение буквы на меньшие части, например биты или
шестнадцатеричные цифры;
„„ перемешивание и рекомбинация этих частей.
„„
„„

Два главных инструмента криптографии – подстановка и перестановка – были рассмотрены в главах 5–8. Третий фундаментальный
элемент – фракционирование. Под этим понимается разбиение
обычных структурных элементов языка – букв, слогов и слов – на
меньшие единицы и оперирование этими единицами. Меньшими
единицами обычно являются биты, десятичные цифры, шестнадцатеричные цифры или цифры в других системах счисления. В этой
главе рассматривается фракционирование с использованием цифр
в системах счисления по основаниям 2, 3, 5, 6 и 16, а также некоторые
другие формы фракционирования.

Глава 9

136

9.1

Фракционирование

Квадрат Полибия
Наверное, древнейшим методом представления букв в виде меньших единиц является квадрат Полибия, который рассматривался
в разделе 4.4. Каждая буква представляется двумя цифрами в пятеричной системе счисления, что дает 25 различных двузначных комбинаций. (У греков не было представления нуля, поэтому цифры начинались с 1.)
Ниже показан квадрат Полибия из раздела 4.4. Каждая буква представляется своими координатами в квадрате, т. е. номерами строки
и столбца. Например, буква P находится на пересечении строки 2
и столбца 5, поэтому представляется числом 25. Когда требуется избежать возможной путаницы, мы будем записывать это в виде 2, 5.

1
2
3
4
5

1
U
Z
L
F
N

2
V
S
E
G
O

3 4
W X
A M
B C
H IJ
Q R

5
Y
P
D
K
T

Перемешанный квадрат Полибия
с ключевым словом SAMPLE

Квадрат Полибия сам по себе способен породить ряд шифров. Например, он может порождать простую подстановку путем замены
каждой буквы сообщения буквой, стоящей справа от нее в квадрате
(U переходит в V) или снизу (U переходит в Z) либо снизу и справа
(U переходит в S) или слева (U переходит в P) и т. д. Эту идею можно
распространить на многоалфавитный шифр и менять направления, скажем вправо, влево, вниз, вправо, влево, вниз и т. д. Можно
также смещаться на 2 буквы или сдвигаться, как ходит шахматный
конь.
Квадрат Полибия можно еще использовать для порождения шифра Полибиева рябь (Polybius Ripple). Сначала заменим каждую букву
сообщения ее координатами, выписав их в одну строку. Начиная со
второго числа в этом списке будем прибавлять предыдущее число
к текущему. Если сумма больше 5, вычитаем 5, чтобы числа всегда
оставались в диапазоне от 1 до 5. Затем преобразуем числа обратно
в буквы, снова воспользовавшись квадратом Полибия.
S E N D H E L P
2232513543323125
2424453325353411
M M J B P D C U

Открытый текст
Координаты
После применения операции «рябь»
Шифртекст

Полибиева рябь получает оценку 3. Шифр можно укрепить, взяв
другой квадрат Полибия для обратного преобразования координат
в буквы.

Шифр Плейфера

137

В разделах 9.2–9.7 рассматривается несколько ручных шифров,
разработанных в XIX веке на основе квадрата Полибия. Еще несколько ручных методов я опишу в разделах 9.8–9.11. И в оставшейся час­
ти главы обсужу некоторые компьютерные методы.

9.2

Шифр Плейфера
Шифр Playfair изобрел Чарльз Уитстон в 1854 году. Уитстон хорошо
известен инженерам-электротехникам благодаря мосту Уитстона
для измерения электрического сопротивления. Уитстон и Уильям
Кук изобрели игольчатый телеграфный аппарат на несколько лет
раньше, чем Сэмюэль Морзе изобрел телеграфный аппарат с ключом. Кук коммерциализировал игольчатый телеграф в Англии за
несколько лет до того, как Морзе основал телеграфную компанию
в США.
Шифр Уитстона назван Playfair, потому что именно Бэрон Лайон
Плейфер, друг Уитстона, который, кстати, был на него очень похож
(оба ярко-рыжие и ростом 183 см), выступил его ярым сторонником
и убедил Министерство иностранных дел Великобритании использовать этот шифр для дипломатической переписки.

Историческое отступление
Поскольку этот шифр не назван в честь Уитстона, его имя осталось свободным для другого шифра, который Уитстон изобрел приблизительно
в 1860 году и представил на Парижской всемирной выставке 1867 года.
Криптограф Уитстона, похожий на большие карманные часы, состоял из
двух концентрических колец из жесткого картона и двух подвижных
стрелок, соединенных простым часовым механизмом. Внутреннее кольцо
можно было стирать и заменять для каждого сообщения. На этом кольце
был нанесен 26-буквенный перемешанный алфавит, а на внешнем кольце – стандартный 26-буквенный алфавит и пробел, т. е. всего было 27 позиций. Пользователь вращал длинную стрелку, так чтобы она указывала
на букву открытого текста на внешнем кольце, при этом связанная с ней
короткая стрелка указывала на букву шифртекста на внутреннем кольце.
Когда длинная стрелка совершала полный оборот на 27 позиций, короткая также пробегала 27 позиций, т. е. совершала полный оборот плюс
1 позиция. Поэтому после каждого оборота короткая стрелка начинала
движение с новой точки. Эквивалентное устройство, состоявшее из подвижных колец без стрелок, полковник Деций Уодсуорт, начальник артиллерийско-технической службы, изготовил еще в 1817 году, опираясь на
чертежи Томаса Джефферсона 1790 года, но с этой идеей навсегда связано имя Уитстона.

138

Глава 9

Фракционирование

Фотографию предоставил Ральф Симпсон. Выгравированная надпись
гласит «The Cryptograph. C. Wheatstone Invr» («Криптограф. Изобретатель
Ч. Уитстон»).

Шифр Плейфера основан на квадрате Полибия и зашифровывает
сразу две буквы, т. е. биграммы. Для подготовки квадрата следует
перемешать алфавит любым из способов, описанных в разделе 5.2.
Одна низкочастотная буква алфавита, например J, Q или Z, опущена, чтобы алфавит уместился в квадрат 5×5. (Во французском языке
буквы J, Q и Z встречаются часто, поэтому опустить следует букву W.
В немецком языке можно опустить любую из букв Q, X или Y.) Если
опущенная буква встретится в сообщении, она заменяется какой-то
другой буквой. В нашем примере J заменяется на I.
Следующий шаг – разбить сообщение на биграммы, например:
ME ET ME TO MO RR OW. Если биграммой оказывается удвоенная
буква, то ее следует разбить на две части, обычно для этого в середину вставляется X. (Это веская причина оставить X в квадрате.) Кроме
того, если сообщение содержит нечетное число букв, то X добавляется в конец. В итоге сообщение принимает вид ME ET ME TO MO RX
RO WX. Теперь его можно зашифровать.
В шифре Плейфера действуют 3 правила: (1) если обе буквы находятся в одной строке, то каждая заменяется буквой справа от нее;
(2) если обе буквы находятся в одном столбце, то каждая заменяется
буквой снизу от нее; (3) во всех остальных случаях каждая буква заменяется буквой, находящейся в одной с ней строке, но в том столбце, в котором находится вторая буква биграммы. Понятно, что все
описанные операции «заворачиваются», т. е. если нужная буква оказывается за пределами квадрата, то берется буква с противоположной его стороны. Таким образом, в квадрате из раздела 9.1 буквой
справа от Y будет U, а буквой снизу от Q будет W.
Эти правила можно переформулировать в терминах координат.
Пусть шифруется биграмма r1c1 r2c2, т. е. первая буква находится на

139

Шифр Плейфера

пересечении строки r1 и столбца c1, а вторая на пересечении строки
r2 и столбца c2. Тогда три правила принимают вид:
1 если r1 = r2, то выполнить подстановку r1, c1+1 r2, c2+1;
2 если c1 = c2, то выполнить подстановку r1+1, c1 r2+1, c2;
3 в противном случае выполнить подстановку r1, c2 r2, c1.
Посмотрим, как применяются эти правила к шифрованию сообщения ME ET ME TO MO RX RO WX. Первая биграмма ME. Буквы M
и E находятся в разных строках и в разных столбцах, следовательно, применимо правило 3. M находится на пересечении строки 2
и столбца 4, а E на пересечении строки 3 и столбца 2. Поэтому M
заменяется буквой на пересечении своей строки, т. е. 2, и столбца
буквы E, т. е. 2. В этом месте находится буква S, так что M заменяется на S. Аналогично E заменяется буквой на пересечении строки 3
и столбца 4, т. е. C.
Точно так же биграмма ET заменяется на DO, а вторая биграмма
ME – на SC. Буквы T и O находятся в одной строке, поэтому применимо правило 1. Они заменяются буквами справа от них, т. е. T заменяется на N, а O – на Q. Биграмма TO заменяется на NQ.
К MO применимо правило 3, т. е. она заменяется на SR. Буквы R
и X находятся в одном столбце, значит, применимо правило 2. RX заменяется на XM. К обеим биграммам RO и WX применимо правило 1,
они заменяются соответственно на TQ и XY. Стало быть, все сообщение принимает вид SC DO SC NQ SR XM TQ XY, или после перегруппировки SCDOS CNQSR XMTQX Y.
Диаграммы ниже помогают наглядно представить порядок шифрования биграмм LY, TO и RX.

1
2
3
4
5

1
U
Z
L
F
N

2
V
S
E
G
O

3
W
A
B
H
Q

4
X
M
C
IJ
R

LY → DU

5
Y
P
D
K
T

1
2
3
4
5

1
U
Z
L
F
N

2
V
S
E
G
O

3
W
A
B
H
Q

4
X
M
C
IJ
R

TO → NQ

5
Y
P
D
K
T

1
2
3
4
5

1
U
Z
L
F
N

2
V
S
E
G
O

3
W
A
B
H
Q

4
X
M
C
IJ
R

5
Y
P
D
K
T

RX → XM

Шифр Плейфера применялся военными и дипломатами по крайней мере до 1960 года. Далее мы кратко рассмотрим методику
вскрытия этого шифра.

9.2.1

Вскрытие шифра Плейфера
Заметим, что каждую букву можно зашифровать только одной из
пяти возможных замен, а именно четырьмя буквами в той же строке
и одной, расположенной прямо под ней. Для каждой буквы в квадрате имеется еще 24, кроме нее. Из них только 4 буквы в одном столбце
с ней могут привести к замене данной буквы той, что находится под

Глава 9

140

Фракционирование

ней. Поэтому вероятность того, что буква будет заменена нижестоящей, равна 4/24 = 1/6. А вероятность, что она будет заменена другой
буквой из той же строки, равна 5/6.
Поскольку всего в квадрате 5 строк и в английском языке су­
ществует 9 букв с частотой больше 5 %, должно найтись несколько
строк, содержащих хотя бы по две высокочастотные буквы. Остальные буквы в этих строках будут встречаться в шифртексте чаще других. Если шифртекста достаточно, то высоки шансы, что от 3 до 5 самых частых букв шифртекста встречаются в одной и той же строке
квадрата.
Если удалить все биграммы, содержащие эти буквы, то от 3 до 5 самых частых букв в оставшихся биграммах с большой вероятностью
находятся в одной и той же строке квадрата. Знания высокочастотных букв в двух из пяти строк достаточно, чтобы начать реконструкцию квадрата. Следующим шагом будет попытка выделить некоторые вероятные слова.
Шифр Плейфера получает оценку 3. Есть несколько способов повысить его стойкость. Рассмотрим некоторые из них.

9.2.2

Укрепление шифра Плейфера
Ниже приведено несколько более стойких вариантов шифра Плейфера.

Nullfair или Nofair
В шифртекст можно добавить null-символы с регулярными интервалами, например:
2 3 2 3 2 3
BR CNT FG IUS MH RAO L
BRECNTPFGRIUSUMHMRAOAL

Ключ null-символов равен 23
Шифртекст Плейфера
Шифртекст с null-символами

Шифр Nullfair получает оценку 5.

Playfair+1
Это совсем простенькое улучшение добавляет повторяющийся двоичный ключ к шифру Плейфера. Если в ключе встретился бит 1, то
используется следующая буква алфавита. Playfair+1 будет более
стойким, если длина двоичного ключа нечетна.
0101101011010110
BRCNTFGIUSMHRAOL
BSCOUFHIVTMIRBPL

Двоичный ключ равен 01011
Шифртекст Плейфера
Шифртекст+1

Playfair+1 получает оценку 5. Этот шифр можно использовать
и с троичными цифрами. Цифры в аддитивном ключе малы, по­

141

Шифр Плейфера

этому сложение можно произвести в уме, не пользуясь специальной
таблицей.

Двойной Плейфер
Шифр Плейфера можно укрепить, применив его дважды. Второй раунд должен раздвинуть биграммы, созданные на первом. (1) Зашифровать сообщение шифром Плейфера. (2) Либо переместить первую
букву в конец, а последнюю в начало, либо добавить null-символы
с обоих концов. (3) Выполнить еще один раунд шифра Плейфера.
Стойкость будет максимальной, если во втором раунде использовать алфавит, перемешанный по-другому. Двойной Плейфер получает оценку 6.

Плейферова рябь
Это вариант двойного Плейфера с одним проходом по сообщению
и одним квадратом Полибия. Обозначим открытый текст P1P2P3P4 ... .
Начнем с левого конца и зашифруем биграмму открытого текста P1P2
шифром Плейфера, в результате получится биграмма C1C2. Затем зашифруем C2P3 и получим D2C3. Отметим, что буква D2 зашифрована
дважды. Далее шифруется C3P4 – получается D3C4 и т. д. На каждом
шаге мы продвигается вправо на один символ. Плейферова рябь получает оценку 6.
Поскольку первая буква C1 и последняя буква Cn шифртекста зашифрованы только один раз, можно зашифровать их как биграмму
и тем самым завершить цикл.
P1 P2 P3 P4 P5 P6
/ / / / /
C1 C2 C3 C4 C5 C6
C1 D2 D3 D4 D5 D6

Открытый текст
Промежуточный текст
Шифртекст

PolyPlayfair
Использовать два разных квадрата Полибия и переключаться между
ними, применяя повторяющийся ключ. Например, ключ 11212 означает, что в каждой последовательности из пяти биграмм первая, вторая и четвертая биграммы должны шифроваться квадратом 1, а третья и пятая – квадратом 2. Эту идею можно обобщить на три и более
квадратов, но время инициализации увеличится. С двумя квадратами и ключом не длиннее 10 цифр шифр PolyPlayfair получает оценку
5. Если ключ генерируется алгоритмом сцепленных цифр и первый
квадрат используется, когда цифра ключа от 0 до 4, а второй, когда
цифра ключа от 5 до 9, то оценка повышается до 6. (Примечание: при
использовании четности в последовательности сцепленных цифр
период будет гораздо короче, что ослабляет шифр.)

Глава 9

142

Фракционирование

Перестановка
Шифртекст, получившийся в результате шифрования открытого
текс­та шифром Плейфера, можно подвергнуть перестановке. Это
может быть сложная столбцовая перестановка, рассмотренная в разделе 7.2, или простое кусочное обращение с по­мощью шифра Базери
типа 4 из раздела 4.6.1. Шифр Плейфера со столбцовой перестановкой получает оценку 7, а с кусочным обращением – оценку 5.

9.3

Шифр Two Square
Шифр Two Square (два квадрата), который иногда называют двойным
Плейфером, – усовершенствованная версия шифра Плейфера. Его
изобрел французский криптограф-любитель Феликс-Мари Деластель и описал в своей книге «Traité Élémentaire de Cryptographie»,
изданной в 1902 году. Как следует из названия, в шифре используется два квадрата Полибия вместо одного и соответственно два перемешанных алфавита. Два квадрата можно расположить бок о бок
или один под другим. Ниже показано расположение по горизонтали.
Два квадрата перемешаны с по­мощью ключевых слов FIRST и SE­
COND, а буква Q из сеток 5×5 исключена.
F
A
G
M
V

I
B
H
N
W

R
C
J
O
X

S
D
K
P
Y

T
E
L
U
Z

M
V
S
D
H

P
W
E
A
I

R
X
C
B
J

T
Y
O
F
K

U
Z
N
G
L

Как и в шифре Плейфера, сообщение шифруется по две буквы за
раз, т. е. шифруются биграммы. Чтобы зашифровать биграмму SO,
мы находим букву S в левом квадрате и букву O в правом квадрате. Вместо S подставляется буква из правого квадрата, находящаяся
в той же строке, что S, и в том же столбце, что O, т. е. T. Вместо O подставляется буква из левого квадрата, находящаяся в той же строке,
что O, и в том же столбце, что S, т. е. K. Следовательно, биграмма SO
преобразуется в TK.
В отличие от шифра Плейфера, не нужно разбивать удвоенные
буквы. Две буквы могут оказаться в разных строках в двух квадратах.
Например, биграмма SS преобразуется в MK. В большинстве случаев
удвоенной букве в шифртексте не будет соответствовать удвоенная
буква в открытом тексте.
Ниже процесс подстановки показан наглядно.
F
A
G
M
V

I
B
H
N
W

R
C
J
O
X

S----------->T U
| E
V W X | Z
KV W X Y
L M N O P
A B C D E
Z S E C O
S U V W X
G H J K L
N D A B F
Y Z T H I
M N O R U
G H--------->R D A B C
-------->Z
L M P R T
E-------->

Шифрование
T преобразуется в V
H преобразуется в R
E преобразуется в Z
THE преобразуется в VRZ

Дешифрирование производится в обратном направлении. Поскольку первая буква триграммы шифртекста VRZ взята из второго
квадрата, дешифрирование с него и начинается:
F I R S T p. Это означает, что
число битов m должно быть не меньше половины числа битов p. Мы
хотим, чтобы p было как можно больше, чтобы у генератора был
длинный период и чтобы m было большим – тогда генератор будет
порождать случайные числа. Насколько большим? Размеры m и p
ограничены размером регистров процессора. Если превысить размер регистра, то придется расплачиваться скоростью работы.
Каждое псевдослучайное число xn генерируется путем умножения предыдущего числа xn–1 на m. Число xn–1 может иметь столько
же битов, сколько p, т. е. если p состоит из b бит, то и xn–1 тоже может состоять из b бит. Поскольку m должно иметь по меньшей мере
b/2 бит, произведение mxn–1 может иметь 3b/2 бит. Если размер ре­
гистра 63 бита, то b не может превышать 2/3 от 63, т. е. 42, а значит,
m может содержать не более 21 бита. Хорошо бы сделать m больше,
чем p. Разумный компромисс – 25 бит для m и 38 бит для p. Тогда
период мог бы доходить до 238.
Чтобы генератор был непредсказуемым, необходимо, чтобы были
одинаковы частоты сгенерированных единиц, частоты пар единиц,

252

Глава 13

Потоковые шифры

троек, четверок и т. д. На практике не имеется смысла заходить
дальшевосьмерок, в крайнем случае десяток байт. Если требуется
абсолютная уверенность, поделите размер ключа на размер сгенерированных единиц. Например, если размер ключа 128 бит и ГПСЧ
порождает 4-битовые шестнадцатеричные цифры, то можете потребовать, чтобы была одинакова частота n-кортежей для всех n, не
больших 32. (Но человек, который и вправду так поступит, очевидно,
страдает навязчивым неврозом и нуждается в лечении.) Даже для
4-битовых случайных чисел стремление идти дальше кортежей, содержащих 16, максимум 20 элементов (т. е. 64 или 80 бит), нельзя
назвать ни необходимым, ни полезным.
Эмили понадобится более 264 (соответственно 280) байт открытого текста, чтобы воспользоваться неравными частотами. Даже если
Сандра никогда не меняет ключ, все равно Эмили вряд ли удастся
набрать столько материала. Приведу конкретный пример, чтобы
было понятнее: допустим, что спутник передает на землю телемет­
рию по лучу со скоростью 1 МБ/с. Допустим также, что данные передаются с использованием двух разных гамм одновременно и что
Эмили знает ключ одной из них. Так вот, притом что она получает
пары открытый текст / шифртекст со скоростью 1 МБ/с, чтобы набрать 264 байт, ей понадобится 585 000 лет. Даже если данные передают 1000 спутников и все пользуются одним и тем же ключом, все
равно понадобится 585 лет.
Если частоты n-кортежей одинаковы для всех значений n, то ваш
генератор истинно случайный. Вы изобрели математический алгоритм генерирования истинно случайных чисел. Поздравляю. Отправляйтесь за филдсовской премией.
Чтобы частоты кортежей были равны для кортежей вплоть до длины n, в общем случае необходимо, чтобы начальное значение само
было кортежем длины не менее n. Для мультипликативных конгруэнтных генераторов частоты одиночных единиц и пар единиц распределены равномерно, но для частот троек это уже не так, а при
n > 3 распределение очень далеко от равномерного: большинство
частот равны 0.
Вскрыть равномерный конгруэнтный шифр нетрудно, если известно несколько символов открытого текста и шифр легко позволяет определить случайный выход по паре открытый текст / шифртекст,
т. е. если в качестве комбинирующей функции используется xor, add
или madd. Например, если для получения байта шифртекс­та к байтам открытого текста и ключа применяется ИСКЛЮЧАЮЩЕЕ ИЛИ,
то Эмили нужно только применить ИСКЛЮЧАЮЩЕЕ ИЛИ к байтам
открытого и шифртекста, чтобы получить байт ключа.
Если модуль генератора состоит из 31 или 32 бит, то Эмили может
перебрать все 231 или 232 возможных начальных значений; это осуществимо даже на ПК. Известные символы открытого текста понадобились бы только для проверки. Если модуль больше, скажем 48
или 64 бита, то первые 2 или 4 известных символа открытого текста

Линейный конгруэнтный генератор

253

используются, чтобы ограничить область поиска. Первый случайный выход ограничивает текущее состояние генератора узким диапазоном, составляющим 1/256 часть от полного диапазона. Второй
известный символ открытого текста дает второй выход, который составляет 1/256 этого диапазона и т. д.
Таким образом, простой мультипликативный конгруэнтный генератор не является криптостойким. Можно взять значительно больший модуль и использовать методы перемножения больших целых
чисел, например Карацубы или Тоома–Кука, но тогда пришлось бы
пожертвовать быстродействием, свойственным этому классу генераторов. Существуют более быстрые способы создания криптостойких генераторов, поэтому мы здесь не будем рассматривать методы
умножения больших целых чисел.

13.4 Линейный конгруэнтный генератор
Линейный конгруэнтный генератор – обобщение мультипликативного конгруэнтного генератора. Он добавляет постоянный член
в рекуррентную формулу. Отправляясь от начального значения s,
последовательность случайных чисел xn генерируется следующим
рекуррентным соотношением:
x0 = s,
xn = (mxn–1 + c) mod P для n = 1,2,3, ...
Иными словами, чтобы получить следующее псевдослучайное
число, мы умножаем предыдущее число на m, прибавляем c, а затем
берем остаток от деления суммы на P. Начальным значением может
быть любое целое число 1, 2, 3, ..., P – 1. Период генератора будет
максимальным, если выполнены три условия:
1 c и P – взаимно простые числа;
2 для любого простого p, являющегося делителем P, m имеет вид
pk+1;
3 если P кратно 4, то m имеет вид 4k+1,
где k – целое число. Это так называемые условия Халла–Добелла,
именованные так в честь Т. Э. Халла и А. Р. Добелла из университета
Британской Колумбии, которые опубликовали их в 1962 году.
Например, предположим, что P = 30, т. е. раскладывается в произведение простых чисел 2×3×5. Тогда m – 1 должно быть кратно 2, 3
и 5. Иначе говоря, m должно быть равно 1. Поэтому если s = 1 и c = 7,
то последовательность псевдослучайных чисел будет иметь вид 1, 8,
15, 22, 29, ... . Это арифметическая прогрессия, в которой нет ничего
случайного. По этой причине в качестве модуля P обычно выбирается степень простого числа, чаще всего двойки. Трудно найти значения m, c и P, порождающие хорошие свойства случайности.

254

Глава 13

Потоковые шифры

Однако у линейных конгруэнтных генераторов есть одно полезное применение. Если нужен генератор с очень длинным периодом,
то можно сложить выходы двух или более линейных конгруэнтных
генераторов, модулями которых являются степени различных прос­
тых чисел. Так мы получим генератор с хорошими свойствами случайности и периодом, равным произведению модулей. Например,
предположим, что мы сложили выходы следующих трех ГПСЧ. Я выбрал все три модуля максимально большими, но еще умещающимися в 32-битовое машинное слово, а множители и постоянные – удовлетворяющими условиям Халла–Добелла. В остальном их выбор
произволен.
xn+1 = (10000001xn + 1234567) mod 231,
yn+1 = (1212121yn + 7654321) mod 319,
zn+1 = (43214321zn + 777777) mod 513.
Пусть wn = (xn + yn + zn) mod 231. Выберем старший байт wn, сдвинув
его вправо на 23 позиции, т. е. vn = wn /223. Последовательность vn обладает хорошими свойствами случайности, при условии что (1) по
меньшей мере один из трех множителей и мультипликативно обратный ему больше квадратного корня из соответствующего ему
модуля и (2) ни один из остальных двух множителей не равен 1 или
P – 1. Период последовательности vn равен 231319513 = 3.0468×1027.

13.5 Цепной XOR-генератор
Простейший цепной XOR-генератор работает со строкой битов, например 10111. Основная идея такова: применить ИСКЛЮЧАЮЩЕЕ
ИЛИ к первому и последнему битам, удалить первый бит и добавить
новый бит в конец строки, т. е. xi = xi–1⊕xi–n. Поскольку n-битовая
строка может принимать 2n значений и поскольку строка, состоящая
только из нулей, порождает последовательность нулей, то самый
длинный период цепного XOR-генератора равен 2n – 1. Рассмотрим
простой пример с 3-битовыми строками.
0 0 1
0 1 1
1 1 1
1 1 0
1 0 1
0 1 0
1 0 0
0 0 1

Начальное значение
Результирующая последовательность
1101001

Последовательность повторяется

После семи шагов начальная строка 001 повторяется, так что период этого генератора равен 7. Такой генератор называется полно-

Цепной XOR-генератор

255

периодным. Цепной XOR-генератор имеет полный период при n = 2,
3, 4, 6, 7, 15, 22. При n = 37 генератору не хватает 0.00057 % до полного периода. То есть 99.99943 % всех 37-битовых значений образует
один большой цикл, а остальные принадлежат коротким циклам.
Для каких-то целей n = 37 может оказаться хорошим выбором. Для
большинства значений n имеется несколько повторяющихся последовательностей битов, одни короткие, другие длинные. Сумма их
длин равна 2n – 1. О единственном периоде можно говорить только
в случае полнопериодных генераторов. В противном случае будет
несколько циклов разной длины.
Допустим, что нам нужен генератор с периодом длиннее 222, но
мы не хотим допускать даже 0.00057-процентного шанса получить
более короткий цикл. Что делать? Один из вариантов – попробовать другие генерирующие функции. Вместо xi = xi–1⊕xi–n попробуем
рекуррентное соотношение xi = xi–1⊕xi–j⊕xi–k⊕xi–n для значений j и k
таких, что 1 < j < k < n. Есть неплохие шансы на то, что некоторые
из этих генераторов будут иметь полный период. Отметим, однако,
что соотношение xi = xi–1⊕xi–j⊕xi–n с тремя членами не может породить полнопериодный генератор. Количество членов должно быть
четным.
Какой бы генератор ни выбрать, результатом является последовательность битов. Чтобы получить псевдослучайную последовательность байтов, будем брать группы битов, т. е. биты 1–8, 9–16, 17–24
и т. д. Следовательно, нужно сгенерировать 8 бит для каждого байта.
Но есть более быстрый способ. Вместо того чтобы применять операцию ИСКЛЮЧАЮЩЕЕ ИЛИ к одиночным битам, будем применять ее
к байтам. По существу, мы параллельно выполняем 8 отдельных битовых генераторов. Так мы получаем целый байт за одну операцию.
Если язык программирования поддерживает, можно использовать
32-битовые слова и получить 4 байта за раз.
Любую из комбинирующих функций, перечисленных в разделе 13.1, можно использовать для комбинирования псевдослучайного
потока с открытым текстом и таким образом получить шифр. Если
Сандра выберет функцию xor, add или madd, то Эмили легко вскроет шифр при наличии достаточного объема открытого текста. Она
без труда определит случайные выходы, соответствующие символам
открытого текста. Это позволит реконструировать участок гаммы.
Затем этот участок можно будет расширить вперед и назад и реконструировать всю гамму, просто выполнив ИСКЛЮЧАЮЩЕЕ ИЛИ.
Но есть прием, позволяющий Сандре поставить Эмили в тупик.
Предположим, что генератор порождает последовательность 32-битовых слов, которые Сандра разбивает на четыре отдельных байта.
Вместо того чтобы всегда начинать со старшего бита, Сандра могла
бы каждый раз начинать с другой позиции. Эквивалентно, Сандра
могла бы сдвигать 32-битовое слово циклически влево или вправо
и менять величину сдвига. Например, ABCDEF после циклического
сдвига на две позиции становится равным CDEFAB. Величины сдви-

256

Глава 13

Потоковые шифры

гов могут образовывать периодическую последовательность чисел
от 0 до 31. В результате Эмили не сможет сопоставить последовательные выходы генератора и реконструировать гамму.

13.6 Цепной аддитивный генератор
Цепные аддитивные генераторы, называемые также генераторами
Фибоначчи с запаздыванием, похожи на цепные XOR-генераторы,
только вместо ИСКЛЮЧАЮЩЕГО ИЛИ используется операция сложения. Сложение выполняется по модулю 2w, где w – размер слова
в битах: xi = (xi–1 + xi–n) mod 2w. Типичные значения w – 15, 31, 63 в случае сложения со знаком и 16, 32, 64 в случае сложения без знака.
По-другому рассматривать операцию по модулю 2w можно как игнорирование переноса из старшего разряда.
Поскольку при сложении возникает перенос из одного разряда
в следующий, период старшего бита в два раза больше периода младшего. Период младшего бита в каждом слове совпадает с периодом
XOR-генератора с теми же начальными значениями. Причина в том,
что сложение – то же самое, что ИСКЛЮЧАЮЩЕЕ ИЛИ с переносом.
Если период младшего бита в цепном аддитивном генераторе равен
P, то период старшего бита равен 2w–1P.
Цепные аддитивные генераторы – простой способ получить более
длинный период ценой небольших дополнительных усилий. Просто
найдите цепной XOR-генератор с длинным периодом, хорошо бы
полнопериодный, а затем увеличьте ширину с одного бита до полного слова. Как и в случае мультипликативных конгруэнтных генераторов, наиболее случайная часть последовательности выходов –
старшая. В качестве последовательности псевдослучайных байтов
используйте только восемь старших бит каждого слова.
И снова для объединения псевдослучайного потока с открытым
текстом и, следовательно, порождения шифра можно использовать
любую из комбинирующих функций, описанных в разделе 13.1.

13.7 Сдвиговый XOR-генератор
Еще один класс ГПСЧ – сдвиговые XOR-генераторы, придуманные
Джорджем Марсалья из Флоридского университета, который извес­
тен прежде всего разработкой комплекта тестов на случайность Diehard. В этих генераторах используются два оператора для работы
с целыми числами:
„„ >2 сдвигает целое число 80 на два
бита вправо, так что получается значение 20.

FRand

257

Биты, выдвигаемые из старшего и младшего разрядов машинного
слова, теряются. Например, 25>>1 равно 12, а не 12.5. Сравните эти
операции с циклическими сдвигами >, при которых биты,
выдвигаемые с одного конца, вдвигаются в другой. Например, если
32-битовое машинное слово состоит из шестнадцатеричных цифр
12345678, то 1234567812 = 67812345,
поскольку каждая шестнадцатеричная цифра содержит 4 бита. Если
слово хранится в более широком регистре процессора, то неиспользуемые биты обнуляются.
В этом классе имеется несколько разных генераторов. Величины
и направления сдвигов следует тщательно выбирать, чтобы генератор имел длинный период. Ниже приведено два примера генератора
Xorshift, предложенного Марсальей. Они имеют длинные периоды,
обладают хорошими свойствами случайности, хотя не проходят некоторые особо требовательные тесты на случайность. В каждом генераторе для порождения следующего члена последовательности
выполняется три комбинированных шага ИСКЛЮЧАЮЩЕГО ИЛИ
и сдвигов влево-вправо-влево. В переменной y хранятся промежуточные значения. Любое положительное число может служить подходящим начальным значением.
32-битовый генератор. Период 232–1.
y = xn ⊕ (xn > 17)
xn+1 = y ⊕ (y 7)
xn+1 = y ⊕ (y >>1. То есть первое 29-битовое слово x1 циклически сдвигается на одну позицию вправо.
Эта псевдослучайная последовательность проходит многие тесты
на случайность, но немного не дотягивает до криптостойкости. Чтобы последовательность была безопасной, нужно брать последовательные выходные байты из разных частей 29-битового слова. И для
выбора этой части можно использовать саму псевдослучайную последовательность. Предположим, что следующие три псевдослучайных выхода равны a, b и c. Положим s = a mod 25. Если s принадлежит
диапазону от 0 до 21, то сдвинем b вправо на s позиций и возьмем
младшие 8 бит. В этом случае генерируются только a и b. Что касается c, то оно будет сгенерировано для следующего псевдослучайного
числа. Если s > 21, то сдвиг на s позиций вправо оставил бы меньше
8 бит. В этом случае игнорируем a и берем s = b mod 22. Сдвигаем c
вправо на s позиций и берем 8 младших бит в качестве случайного
выхода. В виде псевдокода описанные действия выглядят так:
s = xn+1 mod 25
if s ≤ 21 then
r = (xn+2 >> s) and FF (младшие 8 бит r)
else
s = xn+2 mod 22
r = (xn+3 >> s) and FF (младшие 8 бит r)

Регистры сдвига с линейной обратной связью

259

В этой процедуре для порождения каждого безопасного бита
ключа используется в среднем 2.12 псевдослучайного выхода. Байт
ключа в половине случаев происходит из выходов с нечетными номерами, а в половине – с четными. Генератор переключается между
четом и нечетом примерно раз в 8 циклов, нерегулярно.

13.9 Вихрь Мерсенна
Вихрь Мерсенна – ГПСЧ с самым длинным периодом. Его разработали в 1997 году Макото Мацумото и Такудзи Нишимура из Хиросимского университета. Назван он в честь французского теолога
Марина Мерсенна (1588–1648), хорошо известного своей работой
по простым числам вида 2n – 1 и сыгравшего важную роль в распространении работ Галилея, Декарта, Паскаля, Ферма и других
ученых.
Вихрь характеризуется весьма достойными свойствами случайности, хотя и не проходит некоторые тесты на случайность. Он гораздо
медленнее других генераторов случайных чисел, описанных в этой
главе. Важен он прежде всего своим гигантским периодом, равным
простому числу Мерсенна 219937 – 1, открытому в 1971 году Брайантом
Такерманом из IBM Research, Йорктаун, штат Нью-Йорк. Лаборатория IBM Research была так горда этим открытием, что поместила
надпись «219937–1 is prime» на фирменные канцелярские принадлежности и на свой почтовый штемпель.
Как и FRand, вихрь Мерсенна демонстрирует слабость, если начальное значение почти целиком состоит из нулей. В этом случае
до получения байтов, похожих на случайные, может пройти много циклов. Обычно требуется пропустить первые 10 000 или даже
50 000 циклов, прежде чем использовать порождаемые байты для
дела. С другой стороны, в пакете FRand имеется функция, которая
инициализирует генератор, не требуя холостого выполнения начальных циклов.

13.10 Регистры сдвига с линейной обратной
связью
Регистр сдвига с линейной обратной связью (РСЛОС, англ. LFSR) –
любимец инженеров-электротехников, поскольку его очень просто
реализовать в виде цифровой схемы. В РСЛОС используется массив
битов x1, x2, ..., xn. Следующий бит генерируется применением ИСКЛЮЧАЮЩЕГО ИЛИ к нескольким предыдущим, например:
xn+1 = xn ⊕ xn–i ⊕ xn–j ⊕ xn–k

260

Глава 13

Потоковые шифры

с тремя обратными связями. Количество обратных связей, конечно,
необязательно должно быть равно 3, но для нечетных значений период обычно получается гораздо длиннее, чем для четных.
У этого РСЛОС было бы k+1 бит в предположении, что i < j < k. Пос­
ле генерирования каждого нового бита младший бит выдвигается,
а новый помещается на место старшего, поэтому регистр в каждый
момент времени содержит последние k+1 бит псевдослучайной последовательности.
Очевидный недостаток РСЛОС – неспешность, потому что для порождения каждого псевдослучайного байта им требуется 8 циклов.
РСЛОС также самые слабые из генераторов псевдослучайных чисел
в силу своей линейности. Если Эмили известен какой-то открытый
текст и если она сможет определить соответствующие биты ключа,
то сможет реконструировать всю псевдослучайную последовательность, просто решив систему линейных уравнений. А определить
биты ключа Эмили сможет, если Сандра использовала комбинирующую функцию xor, add или madd.
По этой причине псевдослучайные выходы обычно пропускаются
через нелинейную подстановку и только потом объединяются с открытым текстом. Это можно делать побитово или побайтово. Нелинейные побитовые подстановки возможны, потому что на каждом
цикле в регистре доступно k+1 бит. Биты, используемые как входы
нелинейной функции, называются отводами и могут браться из любого места регистра. Использование нелинейных функций затрудняет Эмили определение битов ключа.
На эту роль подходит, в частности, мажоритарная функция. Она
принимает значение 1, если большинство входных битов равны 1,
и 0 в противном случае. Если имеется 3 входных бита A, B и C, то
мажоритарная функция имеет вид AB∨BC∨CA, где ∨ – булева функция ИЛИ. Мажоритарная функция определена для любого нечетного
числа входов, 3, 5, 7, ... . Возможное развитие этой идеи – использовать девять отводов и три схемы 3-битовых мажоритарных функций.
На входы каждой схемы подается три бита из девяти. После этого
три выходных бита пропускаются через четвертую мажоритарную
функцию.
Побайтовые подстановки естественно возникают, если в качест­
ве комбинирующей функции используется sxor, sadd или poly. Построение таких нелинейных подстановок подробно обсуждается
в разделе 12.3. Можно объединить побитовые и побайтовые подстановки. Каждый из восьми бит выходного байта генерируется с по­
мощью отводов и нелинейной битовой функции, а затем все восемь
однобитовых выходов этих схем подаются на вход побайтовой подстановки.
Подумаем, что должна сделать Эмили, чтобы вскрыть шифр
РСЛОС. Предположим, что Сандра использует 40-битовый аппаратный РСЛОС и отводы из позиций 3, 6 и 9 подаются на вход мажоритарной схемы M. Предположим также, что по наивности она исполь-

Оценивание периода

261

зовала для комбинирования функцию xor. Допустим, что Эмили
знает несколько символов открытого текста, а значит, и последовательность выходных битов. Для каждого известного бита множество
значений трех отводов, подаваемых на вход M, сужается до четырех
из восьми возможных. Если бит равен 0, то три отвода должны давать 000, 001, 010 или 100, а если бит равен 1, то 011, 101, 110 или 111.
После четырех циклов в три отвода было подано 12 бит, и для них
существует 44 = 256 возможных комбинаций. Это значимое уменьшение по сравнению с общим числом комбинаций 212 = 4096. Более
того, с точки зрения Эмили, бит, который первоначально находился
в позиции 3, теперь занимает позицию 6, а бит, находившийся в позиции 6, переместился в позицию 9. Это значит, что некоторые из
12-битовых комбинаций можно исключить. Если они различны, то
исключается больше комбинаций. Каждый дополнительный известный выходной бит еще больше уменьшает число возможных комбинаций битов в регистре сдвига.
Пример поможет разобраться. Предположим, что Сандра использует 40-битовый РСЛОС с тремя отводами, которые подаются
на вход мажоритарной функции для порождения выходного бита.
Предположим также, что Эмили все знает об устройстве и знает, что
сообщение отправлено из генерального штаба и, стало быть, начинается с букв GHQ (General Headquarters). Это дает ей 24 бита известного открытого текста. Применив к ним и соответствующим битам
шифртекста ИСКЛЮЧАЮЩЕЕ ИЛИ, она получит 24 выходных бита
устройства. Для каждого из них имеется 4 возможные комбинации
трех входных битов, порождающие известное значение. Всего получается 72 возможных значения битов в трех позициях отводов. Поскольку биты РСЛОС на каждом цикле сдвигаются на одну позицию,
часть этих комбинаций битов может совпадать, поэтому число различных комбинаций меньше.
Какие уроки может извлечь Сандра из этого краткого анализа?
(1) Регистр сдвига нужно делать длинным, желательно не меньше
128 бит. (2) Отводы должны далеко отстоять друг от друга. (3) Не
следует располагать отводы равномерно. Наш выбор битов 3, 6, 9
на редкость неудачен. (4) Использовать комбинирующую функцию,
которая затрудняет противнику определение битов ключа. Не использовать xor, add или madd в качестве комбинирующей функции.
Лучше брать xors и adds, а самый лучший выбор – poly.

13.11 Оценивание периода
Если вы криптограф-любитель, то, возможно, захотите спроектировать собственный генератор псевдослучайных чисел. В этой книге
ничего не говорится о том, как тестировать ГПСЧ, потому что это обширная тема, но давайте хотя бы посмотрим, как можно оценить пе-

262

Глава 13

Потоковые шифры

риод вашего генератора. Метод зависит от размера вектора состоя­
ния (раздел 13.2).
Если вектор состояния мал, скажем 31 бит, то можно просто выполнить 231 циклов и посмотреть, когда начнется повторение. К сожалению, может случиться, что начальное значение никогда не повторится. Но и на этот случай есть прием. Создайте два экземпляра
своего ГПСЧ и инициализируйте их одним и тем же начальным значением S. Затем выполняйте первый экземпляр по одному шагу за
раз, а второй – по два шага. Предположим, что после 3000 циклов
оба экземпляра пришли к одному и тому же вектору состояния. Это
озна­чает, что R3000 = R6000, так что период вашего генератора равен
3000, по крайней мере с начальным значением S.
Если вектор состояния больше, скажем 64 бита, то выполнить
264 циклов генератора практически невозможно. Но все равно можно оценить период по выборке. Создадим таблицу, содержащую,
к примеру, T = 1 000 000 элементов. В N-м элементе хранится номер
цикла, в котором генератор порождает значение N. В начальный момент все элементы равны нулю, поскольку еще не было порождено
ни одного значения. Выберем начальное значение в диапазоне от
1 до T – 1 и выполним сколько-то циклов генератора, скажем G =
1 000 000 000. Если порожденное в цикле значение N меньше T, то
записываем порядковый номер цикла в N-й элемент таблицы. Если
находившееся в этом элементе значение не равно 0, значит, имеет место повторение и мы знаем период. Например, если значение
12795 порождается в цикле 33000, а затем в цикле 73500, то период
генератора для данного начального значения равен 73500 – 33000 =
40500.
Если не найдено ни одного повторения, то можно оценить период,
исходя из того, сколько из T значений было порождено. Если E элементов таблицы отлично от нуля, то доля порожденных элементов
равна E/T. Поскольку было выполнено G циклов генератора, период
можно оценить как G/(E/T) = GT/E.
При обсуждении цепного генератора цифр (раздел 4.5.1) мы видели, что генератор может иметь разные циклы – как короткие, так
и длинные. Необходимо оценить период генератора несколько раз,
с разными начальными значениями. Можно порекомендовать такую
стратегию. Сначала берем начальное значение 1. В качестве второго
начального значения берем наименьшее число, не сгенерированное
при первой попытке. Третьим начальным значением будет наименьшее число, не сгенерированное ни при первой, ни при второй
попытке. Чтобы реализовать эту стратегию, нужно просто не обнулять таблицу между попытками. Если при 20–100 попытках оценки
периода получаются близкими, есть уверенность, что для большинства начальных значений генератор имеет длинный период.

Укрепление генератора

263

13.12 Укрепление генератора
Один из методов укрепления ГПСЧ – использовать генератор выбора, который отделяет операцию генерирования чисел от операции
выбора чисел. Для этого будем хранить в массиве N чисел, например 32, 64 или 256. Разрядность всех чисел должна совпадать с разрядностью желаемых случайных выходов. Например, если вы хотите
генерировать случайные байты, то массив должен содержать 8-битовые числа. Сначала выполняется N циклов ГПСЧ для порождения
начальных чисел, которые помещаются в массив в том порядке,
в котором сгенерированы. Затем ГПСЧ перезапускается с новым начальным значением и используется для порождения последовательности псевдослучайных чисел в диапазоне от 1 до N, которые служат для выбора элемента массива. Выбранный элемент становится
следующим псевдослучайным числом и заменяется новым числом,
порожденным ГПСЧ.
Это означает, что первое, третье, пятое, … случайные числа используются для выбора, а второе, четвертое, шестое, … – для замены
чисел в массиве. Хотя использовать два экземпляра одного и того же
ГПСЧ с разными начальными значениями удобно, период при этом
не увеличится. Улучшенная стратегия – использовать два разных генератора с взаимно простыми периодами. Тогда период объединенного генератора будет равен произведению периодов. Например,
если числа генерируются мультипликативным конгруэнтным генератором с периодом 231 – 1, а выбираются линейным конгруэнтным
генератором с периодом 231, то период объединенного генератора
будет равен 262 – 231 ≈ 4.612×1018.
Период 4.612×1018 достаточно длинный для криптографических
применений, но генератор с выбором все еще не является криптостойким, потому что Эмили может перебрать всю последовательность селектора и опробовать все 231 начальных значений. При наличии достаточного объема открытого текста это могло бы дать ей
последовательность выходов первого генератора, и этого должно
хватить для его вскрытия.
Исправить ситуацию можно несколькими способами. (1) Использовать комбинирующую функцию xors, adds или poly, это затруднит
Эмили задачу определения случайных выходов. (2) Сделать селектор
(генератор выбора) больше, скажем 63 бита вместо 31. (3) Сделать
начальное значение селектора больше, например увеличив множитель и (или) аддитивную постоянную, т. е. m и c в порождающей
функции xn+1 = (mxn+c) mod P. (4) Использовать описанные в следующем разделе методы для конструирования селектора с более длинным периодом.

264

Глава 13

Потоковые шифры

13.13 Комбинирование генераторов
Генераторы псевдослучайных чисел можно комбинировать разными способами для получения более длинных периодов, улучшения
свойств случайности или повышения криптостойкости. Обычно эти
улучшения сопровождают друг друга. Не нужно жертвовать одним,
чтобы добиться другого. При увеличении периода, как правило,
улучшается и случайность. Существует два класса комбинированных
генераторов: фиксированные и переменные комбинации.

Фиксированные комбинации
В случае фиксированной комбинации имеется несколько ГПСЧ, желательно со взаимно простыми периодами. Это могут быть мультипликативные конгруэнтные, линейные конгруэнтные или XORге­не­ра­то­ры со сдвигом. Выходы генераторов можно объединять
побитово или побайтово. Один из побитовых методов – взять фиксированное количество битов от каждого генератора и подать их на
вход какой-то комбинирующей функции. Например, можно взять
от каждого из восьми генераторов старший бит или от каждого из
четырех генераторов два старших бита. Затем к этим 8 битам применяется сильно нелинейная подстановка. Шаг подстановки мешает Эмили разделить выходы генераторов и вскрыть их по отдельности.
Пример побайтового метода – взять старшие байты от каждого генератора и объединить их путем сложения по модулю 256 или
применения ИСКЛЮЧАЮЩЕГО ИЛИ. Два генератора можно скомбинировать, перемножив их выходы и взяв средние 8 бит произведения. Еще один подход – взять линейную комбинацию вида
(a1x1+a2x2+a3x3+a4x4) mod 256, где x1, x2, x3 и x4 – 8-битовые выходы четырех ГПСЧ, а четыре коэффициента a1, a2, a3 и a4 могут быть произвольными нечетными числами от 1 до 255. Для каждого сообщения
коэффициенты могут быть разными.
Например, все четыре ГПСЧ могли бы быть мультипликативными
конгруэнтными генераторами с простым модулем 231 – 1 и разными,
но фиксированными множителями. Четыре 31-битовых начальных
значения плюс четыре 7-битовых коэффициента дают комбинированное начальное значение длиной 152 бита.
Три ГПСЧ можно скомбинировать с по­мощью операции циклического сдвига >>> (раздел 13.7). Если используется 32-битовый беззнаковый генератор, то 32-битовые выходы можно скомбинировать
операцией x1 + (x2 >>>11) + (x3 >>>21) mod 232. Оптимальные величины сдвига – на 1/3 и 2/3 32-битового регистра. Если требуется более трех генераторов, то делайте величины сдвигов как можно более
равномерными. Например, при пяти генераторах величины сдвигов
должны быть равны 1/5, 2/5, 3/5 и 4/5 размера слова с округлением
до ближайшего целого.

Комбинирование генераторов

265

Еще один фиксированный генератор, CyGen, комбинирует два
генератора, C и G, посредством циклического сдвига. C может быть
любого размера, но размер G должен быть 32 или 64 бита. В каждом
цикле мы берем соответственно 5 или 6 бит C, они определяют величину сдвига. Затем выход G циклически сдвигается влево на это
число позиций, и результат становится выходом CyGen. При этом
Эмили не сможет реконструировать G по последовательности его
выходов.
Необязательно ограничиваться только линейными комбинациями. Например, три генератора можно скомбинировать по формуле
xn + ynzn, или xn + yn2 + znzn–1zn–3, или еще что-то в этом роде. По меньшей мере один член суммы должен быть линейным. Возможности
безграничны, и, конечно же, вы можете переключаться с одного метода на другой.

Переменные комбинации
Примером переменной комбинации может служить генератор выбора из раздела 13.11. Но этот раздел я хотел бы начать поучительной историей. Описанный ниже комбинированный генератор CG5
кажется непробиваемо безопасным, однако на поверку таковым не
является.
В комбинированном генераторе CG5 используется 5 мультипликативных конгруэнтных генераторов с разными множителями
и разными 32-битовыми простыми модулями. Назовем эти генераторы G0, G1, G2, G3 и SEL. (Альтернативно SEL мог бы быть линейным конгруэнтным генератором или XOR-генератором со сдвигом
с периодом 231.) Порождающие генераторы G0–G3 используются для
порождения псевдослучайных чисел, а селектор SEL – для выбора
того из них, который будет порождать следующее псевдослучайное
число. Точнее, 2 старших бита SEL определяют, какой из G0–G3 использовать. Предположим, что SEL генерирует биты 10 и, стало быть,
выбирает G2. Затем выполняется один цикл G2, и его выход становится очередным выходом CG5. Комбинированный генератор будет
иметь период примерно 2155 и обладать хорошими свойствами случайности, но … не будет криптостойким. И вот почему.
Предположим, что Эмили располагает достаточным объемом открытого текста, и рассмотрим первые 17 выходов CG5. По меньшей
мере пять из них должны быть порождены одним и тем же генератором. (Если бы каждый из четырех генераторов породил не более
четырех выходов, то всего их было бы максимум 16, а не 17.) Сущест­
вует всего 6188 способов выбрать 5 элементов из 17. Эмили может
перебрать их все. Получается примерно 1.33×1013 комбинаций размещения с начальным значением, подлежащих проверке, но это
число можно значительно уменьшить. Эмили знает старшие 8 бит
каждого из пяти выбранных выходов. Вместо того чтобы начинать
с первого из 17 выходов, она должна начать с первого из пяти вы-

266

Глава 13

Потоковые шифры

бранных выходов. Тогда ей придется проверить только 223 значений
вместо 231. В результате объем работы сокращается до 5.19×1010 комбинаций, что уже вполне выполнимо. Комбинированный генератор
CG5 небезопасен.
Рассмотрим более безопасный генератор. Я назову его Gen5. Как
и прежде, в комбинированном генераторе используется пять мультипликативных конгруэнтных генераторов с разными множителями и разными 31-битовыми модулями. Модули и множители фиксированы и обеспечивают хорошие свойства случайности. На этот
раз я назову генераторы G1, G2, G4, G8 и SEL. Используются только
четыре старших бита селектора SEL. Единица в первом бите означает выбор G1, единица во втором – выбор G2, единица в третьем – выбор G4, единица в четвертом – выбор G8. Если выбрано менее двух
генераторов, то выполняется еще один цикл SEL, чтобы произвести
новый выбор. Используется только 11 из 16 возможных 4-битовых
выходных значений SEL, поэтому дополнительный цикл SEL выполняется в 5/16 случаев, два дополнительных цикла – в 25/256 случаев
и т. д.
Если выбрано два или более генераторов, то выполняется один
цикл каждого, после чего их выходы складываются по модулю 231
и порождается псевдослучайный выход Gen5. Невыбранные генераторы не выполняются, так что все четыре генератора работают
асинхронно. В результате выход немного смещен в сторону меньших чисел, но недостаточно для того, чтобы Эмили смогла этим воспользоваться. Если статистическое смещение вас все-таки тревожит,
то либо (1) игнорируйте старший бит и используйте биты 2–9 суммы в качестве выходного байта, либо (2) воспользуйтесь операцией
Meld8 (раздел 12.3.7). То есть сформируйте выходной байт генератора, применив ИСКЛЮЧАЮЩЕЕ ИЛИ к битам 1–8 и 9–16 суммы.
* Эмили больше не может изолировать какой-либо из четырех
генераторов. Может показаться, что Эмили теоретически способна
выделить одну из шести пар Gi + Gj, где i и j могут принимать значения 1, 2, 4 или 8. Такую пару можно было бы рассматривать как один
генератор, и затем, возможно, удастся отделить Gi от Gj. Рассмотрим
этот подход пристальнее. Чтобы найти начальные значения Gi и Gj,
необходимо по меньшей мере 9 случайных выходов Gen5. Так как
каждая пара встречается всего в 1/11 случаев, Эмили придется рассмотреть 89 или более символов сообщения. Действительно, статис­
тически пять комбинаций трех или четырех генераторов встречаются чаще, чем 6 комбинаций двух генераторов.
Существует приблизительно 6.356×1011 размещений 9 элементов
из 89, поэтому для Эмили было бы эффективнее просто перебрать
231 ≈ 2.147×109 начальных значений генератора SEL. Это позволит ей
найти следующие 10 позиций для всех шести пар Gi + Gj. Также это
позволит подсчитать, сколько раз Gi и Gj использовались до каждого

Комбинирование генераторов

267

из этих вхождений. Например, предположим, что G2 + G4 встречается в 14-м цикле Gen5. Может оказаться, что из этих 14 циклов G2
использовался в шести, а G4 – в девяти. Теперь Эмили знает сумму
шестого выхода G2 и девятого выхода G4.
Если Эмили сможет собрать 10 таких выходных значений, например для G2 + G4, то сможет и определить начальные значения обоих
генераторов, выполнив 231+31–8 = 254 = 1.801×1016 попыток. Это необходимо проделать для каждого из 231 начальных значений SEL, т. е.
всего предстоит выполнить 285 ≈ 3.869×1025 операций. Это гораздо
меньше, чем 2155 попыток, необходимых для вскрытия Gen5 полным
перебором, но намного превосходит целевой показатель – 2128 попыток. Этот генератор получает оценку 9. **
Теперь все готово к решающему удару. Опишу улучшенную версию Gen5, которую буду называть GenX. GenX состоит из двух частей:
генератора псевдослучайных чисел и шифра. ГПСЧ генерирует последовательность 10-битовых псевдослучайных выходов, а шифр
объединяет байты ключа kn с байтами сообщения xn для порождения
шифртекста. Это выводит шифр за пределы шифров со 128-битовым
ключом.
Генератор GenX – это просто расширенная версия Gen5. В нем используется четыре порождающих генератора, G1, G2, G4 и G8, и генератор выбора SEL. Старшие 4 бита SEL применяются для выбора
комбинации от 2 до 4 порождающих генераторов. Для каждого из
выбранных генераторов выполняется один цикл, и выходы складываются по модулю 231; обозначим получившуюся сумму G. Старшие
10 бит G объединяются с по­мощью ИСКЛЮЧАЮЩЕГО ИЛИ со следующими 10 битами G для порождения 10-битового результата, который разбивается на 8-битовый байт ключа kn и два управляющих
бита cn.
Шифр GenX объединяет байт ключа kn с байтом сообщения xn в соответствии с управляющими битами cn, применяя хорошо перемешанную ключом подстановку S. Управляющие биты cn определяют,
какую комбинирующую функцию использовать для каждого байта открытого текста. Вот, например, как можно интерпретировать
управляющие биты:
00
01
10
11

заменить xn на S(kn) + xn,
заменить xn на kn + S(xn),
заменить xn на S(kn) + S(xn),
заменить xn на S(kn + xn).

Все суммы вычисляются по модулю 256. Шифр GenX получает
оценку 10. Ключами этого шифра являются пять 31-битовых начальных значений G1, G2, G4, G8 и SEL плюс ключ перемешивания перестановки S, например методом SkipMix.

268

Глава 13

Потоковые шифры

13.14 Истинно случайные числа
Все рассмотренные выше методы генерирования случайных чисел
порождают псевдослучайные числа. Во всех известных мне книгах,
где обсуждаются случайные числа, авторы не устают твердить, что
программным путем невозможно получить истинно случайные числа. А все потому, что они ограничили себя слишком узким кругом
допустимых методов. В этом разделе я покажу программно реализованный работоспособный метод массового порождения истинно
случайных чисел.
Все описанные в литературе методы порождения истинно случайных чисел опираются на какое-то физическое явление – космические лучи, тепловые шумы, вибрацию, радиоактивный распад и т. д.
Эти методы работают слишком медленно для криптографических
целей.
Но можно порождать истинно случайные числа с по­мощью трехшагового процесса. (1) Создать большой массив истинно случайных
чисел, взятых из природы. (2) Сделать распределение их вероятностей равномерным. (3) Генерировать случайные числа путем выборки и комбинирования чисел из этого массива. В следующих разделах
подробно объясняется каждый шаг.
Природа полна случайностей. Форма, цвет и положение каждого
листочка на любом дереве случайны. Это результат ветров, прохождения солнечного света через листву, поступления питательных веществ от корневой системы, упавших на листья капель дождя и градин, активности питающихся листьями насекомых, птиц и белок,
землетрясений и многих других факторов. Возьмите любую волну
в океане, любое растение или камень в пустыне, любую рябь на реке,
любое облако и раковину на пляже – их размер, форма, цвет, местоположение, ориентация, а иногда и скорость будут случайны.
Иногда случайность можно уловить, просто сфотографировав
местность. Даже из дома выходить необязательно. Просто рассыпьте
пригоршню попкорна на поверхность с каким-то рисунком. Можете
также взять для этой цели сделанные самостоятельно фотографии
своих знакомых и мест, где вы побывали. Есть фотографии, скачанные вами с сайтов и электронных писем. Еще сотни изображений
были загружены на ваш компьютер операционной системой и приложениями. А миллиарды их имеются в сети и доступны с по­мощью
браузера. Эксперимента ради я придумал несуществующее слово,
ZRMWKNV, и поискал изображения с таким словом. Нашлось больше
тысячи сайтов, и некоторые содержали сотни изображений.

13.14.1 Линейное суммирование с запаздыванием
В любом файле изображения найдется немало случайности, особенно если разрешение высокое, а распределение значений байтов да-

Истинно случайные числа

269

леко от равномерного и независимого. Распределение можно сгладить с по­мощью линейного суммирования с запаздыванием, когда
все изображение, включая заголовки, рассматривается как одна
длинная строка байтов длины L. Приведу пример:
xn = (7xn + 31xn–40 + 73xn–1581) mod 256 для n = 1, 2, 3, ..., L.
xn = (27xn + 231xn–137 + 109xn–10051) mod 256 для n = 1, 2, 3, ..., L.
xn = (241xn + 19xn–64 + 165xn–2517) mod 256 для n = 1, 2, 3, ..., L.
Индексы, как всегда, заворачивают. Трех проходов достаточно,
но, если хотите, можете увеличить их число. Делать распределение
слишком равномерным не стоит, потому что тогда оно перестанет
быть случайным. Если собираетесь воспользоваться упрощенной
версией, например xn = (xn + xn–179) mod 256, то понадобится пять проходов. На каждом проходе используйте разные запаздывания.
В коэффициентах 7, 31 и т. д. нет ничего специального. Я выбрал
их произвольно. Это могут быть любые нечетные числа от 1 до 255.
Запаздывания (40, 1581 и т. д.) на каждом проходе следует выбирать
так, чтобы одно запаздывание было намного больше другого. Например, одно запаздывание может быть порядка L, а другое порядка L2 . Так, если размер файла изображения равен 1 000 000 байт, то
запаздывания можно выбрать равными порядка 100 и 10 000, точнее
меньшее запаздывание в диапазоне от 50 до 200, а большее в диапазоне от 5000 до 20 000. Если после линейного суммирования с запаздыванием выполняется еще и простая подстановка с ключом, то
Эмили будет труднее реконструировать файл изображения.

13.14.2 Наложение изображений
Еще один способ построить истинно случайную последовательность – взять два изображения и наложить одно на другое с по­мощью
какой-нибудь комбинирующей функции, например xor или add (см.
раздел 13.1). Хороший метод – выполнить один проход линейного
суммирования с запаздыванием для каждого изображения до комбинирования и еще один проход по результирующему изображению
после комбинирования. Три изображения можно скомбинировать
побитово, применив нелинейную мажоритарную функцию (раздел 13.10), а также по одному проходу линейного суммирования
с запаздыванием до и после комбинирования. Этот метод пригоден
даже тогда, когда все три изображения разного размера. Совместите
одно короткое изображение с левым концом самого длинного, а другое – с правым концом, как показано нарисунке ниже.

270

Глава 13

Потоковые шифры

Там, где перекрываются только два изображения, сложите их побайтово по модулю 256, а там, где перекрываются все три, используйте мажоритарную функцию или линейную комбинацию по модулю 256, например cn = (113xn + 57yn + 225zn) mod 256. Коэффициенты
могут быть любыми нечетными числами от 1 до 255.
Другой подход к выравниванию изображений – продолжить короткие изображения путем повторения. В примере выше размер
изображения x – 22 байта, а изображения y – 33 байта. Изображение x можно продолжить до 33 байт, повторив первые 11 байт. При
таком подходе мажоритарную функцию можно использовать во всех
33 позициях. На практике изображения содержат миллионы байт.

13.15 Обновление случайных байтов
Ну, хорошо. Теперь у нас есть таблица T, содержащая несколько миллионов случайных байтов. Они истинно случайные, потому что даже
если бы Эмили знала все байты T, кроме одного, это не помогло бы
ей определить отсутствующий байт. У Сандры и у Ривы есть копии.
Что дальше? Очевидно, что мы не можем повторять этот процесс
всякий раз, как нужно будет отправить сообщение.
С пользой применить T можно, например разделив ее на ключи
для блочного шифра. Из миллиона случайных байтов можно выкроить 62 500 ключей по 128 бит. В конечном итоге весь миллион будет
потрачен. Если Сандра работает со стойким блочным шифром, то это
несущественно. Она может использовать ключи повторно, при условии что Эмили не в состоянии определить, какие сообщения были
зашифрованы одним и тем же ключом. Но, разумеется, для потокового шифра повторно использовать ключи невозможно.
Предположим, что Сандра не хочет рисковать и использовать несколько раз один и тот же ключ. Возможное решение – обновить
список случайных чисел. Сандра могла бы наложить другое изображение, но тогда у Ривы должна быть его точная копия. Проблему
можно было бы решить, если бы отображения скачивались с сайта,
к которому у Ривы и Сандры есть доступ. Это неплохая стратегия
в ситуации, когда высок риск перехвата передаваемых ключей.
Другой способ – обновить матрицу T с по­мощью линейного суммирования с запаздыванием (раздел 13.14.1). Назовем обновленную
таблицу T1. Теперь Сандра должна передать только 9 коэффициентов и 6 запаздываний, после чего получит очередные 62 500 ключей.
В предположении, что каждый коэффициент занимает 1 байт, а каждое запаздывание 2 байта, Сандре нужно передать всего 21 байт для
создания T1. А далее для выбора ключа сообщения нужно передать
только его смещение от начала T1. Для этого достаточно двух байт,
потому что все смещения кратны 16. По исчерпании T1 мы строим T2,
выбрав новые коэффициенты и запаздывания, и т. д.

Обновление случайных байтов

271

В разделах 13.5 и 13.6 использовались линейные функции, чтобы
увеличить период генератора. В данном случае никакого периода
нет, а значит, нет и такого ограничения. Вот два примера возможных
нелинейных функций:
xn = (axn + bxn–i + S(xn–j)) mod 256 для n = 1, 2, 3, ..., L,
xn = (axn + bxn–i + E(xn–jxn–k)) mod 256 для n = 1, 2, 3, ..., L.
Здесь индексы заворачивают, a и b – нечетные числа от 1 до 255,
а i, j, k – целые числа от 1 до L–1. S может быть как фиксированной
нелинейной подстановкой, так и переменной подстановкой, перемешанной ключом. Функция E(x) определена следующим образом:
E(x) = x + (x>>8) + (x>>16) + (x>>24) + ... = �256x/255�.

Вычисляя E(xn–jxn–k) mod 256, мы, по сути дела, складываем отдельные байты xn–jxn–k. Это более стойкая операция, чем просто использование xn–jxn–k, потому что xn–jxn–k в 3/4 случаев четное.
Альтернативно Сандра могла бы получать ключи из T следующим
образом: взять один байт, пропустить три, взять следующий байт,
пропустить два, взять два байта, пропустить четыре и т. д., следуя
какой-то периодической схеме. Пропуски могут быть малыми, так
чтобы 2 или 3 пропуска можно было бы закодировать одним байтом
ключа. Если Эмили каким-то образом получит доступ к источнику
случайности T, то, возможно, сумеет определить последовательность малых пропусков. Чтобы предотвратить это, можно сочетать
пропуски с прибавлением некоторой последовательности чисел,
также периодической, к выбранным байтам по модулю 256. Безопаснее, когда количество пропусков и количество слагаемых – взаимно
простые числа, например 12 пропусков и 11 слагаемых. При таком
подходе каждый ключ сообщения будет содержать два байта для кодирования начальной точки, 6 байт – для 12 пропусков и 11 слагаемых – всего 20 байт, или 160 бит. Этот метод можно было бы назвать
Skip & Add (пропустить и сложить).
В такого типа системах важно, чтобы Эмили не могла практически
реконструировать T. Например, со временем Эмили могла бы набрать открытые тексты многочисленных сообщений и восстановить
их ключи. Если она также знает, где в T эти ключи находятся, быть
может, потому что Сандра передает эту информацию Риве в каждом
сообщении, то сможет реконструировать части T. По этой причине
саму T никогда не следует использовать в качестве хранилища ключей. T нужно сохранять для конструирования T1, T2, ..., а уже из них
нарезать ключи сообщений. Хранение T защитит Сандру и Риву от
потери или повреждения Ti. T можно было бы назвать базовым ключом, а T1, T2, ... – производными ключами.
Даже если бы Эмили могла каким-то образом реконструировать
T1 или T2, она не сможет по ним восстановить исходную таблицу T,

272

Глава 13

Потоковые шифры

потому что та истинно случайна. Если бы Эмили перебирала все
возможные комбинации коэффициентов и запаздываний, ничто не
подсказало бы ей, какая из этих квинтильонов строк является правильной случайной строкой T.

13.16 Синхронизированные гаммы
В случае криптографии с секретным ключом Сандра и Рива должны использовать один и тот же ключ. Обычно это означает, что либо
(1) зашифрованный ключ передается вместе с сообщением, либо
(2) обе стороны хранят список ключей и выбирают из него конкретный ключ в зависимости от даты, времени суток или еще какого-то
внешнего фактора. Есть и третий метод, относящийся только к потоковым шифрам.
Сандра и Рива могли бы использовать синхронизированную гамму. Это значит, что обе непрерывно генерируют одни и те же гаммы.
Шифруя сообщение, Сандра начинает со следующего байта ключа
в своей гамме, который должен в точности совпадать со следующим байтом в гамме Ривы. Получив сообщение, Рива должна начать
с того же места в своей гамме. Сандра и Рива должны начинать генерирование с одинаковым начальным значением и в одно и то же
время. Синхронизированный метод наиболее полезен, когда между
сторонами имеется прямой кабель или соединение в пределах прямой видимости или когда обе стороны получают сообщения беспроводным способом от одного и того же передатчика. Он хорошо подходит для передачи оцифрованной речи на небольшое расстояние.
Если сообщения передаются по сети со значительными задержками в узлах или ретрансляционных пунктах, особенно по сети с коммутацией пакетов, где части сообщения могут приходить по разным
путям и должны собираться в точке приема, то отправитель должен
указывать временную метку начала передачи, например в заголовке
сообщения.
Поскольку требуется время для зашифрования сообщения Санд­
рой и для его передачи Риве, может показаться, что Рива вынуждена
генерировать случайные ключи на несколько микросекунд позже,
чем Сандра. И то же самое верно для передачи сообщений в обратном направлении.
Выйти из этого тупика можно несколькими способами. Например, Сандра могла бы начинать сообщения только в определенных
циклах генерирования потока псевдослучайных чисел, например
на каждом 100 000-м цикле. Тогда Рива, получив сообщение в цикле
123 456 789 123, будет знать, что генерирование ключа было начато в цикле 123 456 789 000. Если сообщение было получено близко
к циклу, кратному 100 000, например 123 456 701 234, то Рива могла
бы попробовать 123 456 700 000 и 123 456 600 000. Риве придется

Функции хеширования

273

хранить последние два набора по 100 000 псевдослучайных чисел.
Величину 100 000 можно скорректировать в меньшую или большую
сторону в зависимости от быстродействия ГПСЧ и времени передачи
между сторонами.
Остался один вопрос – как Риве определить начало и конец зашифрованного сообщения. Если канал связи находится в состоянии
простоя, когда не передаются ни нули, ни единицы, то проблемы вообще не возникает. В противном случае будем предполагать, что во
время простоя передается постоянный поток нулей. В таком случае
мы будем добавлять лишний единичный бит до и после сообщения,
как если бы оно было заключено в кавычки, и потребуем, чтобы перед началом сообщения было передано как минимум 64 нуля. Шансы, что в обычном сообщении может встретиться подряд 64 нуля,
пренебрежимо малы. (Отметим также, что среднее время между сообщениями в реальности будет больше 50 000 циклов; 64 цикла – это
просто худший случай.) Таким образом, обнаружив единицу после
64 нулей, Рива может быть уверена, что это начало следующего сообщения, а обнаружив единицу, за которой следует 64 или более нулей, она знает, что это конец сообщения.

13.17 Функции хеширования
Функции хеширования, или хеш-функции, не являются шифрами,
но тесно связаны с шифрами и часто применяются в криптографии.
В этом разделе я обсужу два применения хеш-функций и для каждого случая представлю один пример.
Хеш-функции часто применяются при поиске. Предположим,
что имеется список людей – клиентов, пациентов или студентов –
и в нем требуется часто производить поиск сведений о человеке. Хеширование позволяет осуществить быстрый поиск – имя человека
преобразуется в число, которое ищется напрямую в таблице. Например, имя «John Smith» могло бы быть преобразовано в число 2307,
а в записи таблицы с индексом 2307 хранились бы сведения о Джоне
Смите.
Опишем хеш-функцию, предназначенную для этой цели. Для каждой буквы L алфавита случайным образом выберем двоичное значение R(L) некоторого фиксированного размера, скажем 32 бита. Для
хеширования имени просто применим ИСКЛЮЧАЮЩЕЕ ИЛИ к буквам имени и соответствующим им 32-битовым числам. Слабость
этой схемы в том, что анаграммам сопоставляются одинаковые
хеш-значения. Например, ARNOLD, ROLAND и RONALD хешируются
в одно и то же число. Чтобы решить эту проблему, будем циклически
сдвигать хеш-значения влево на одну позицию после добавления
каждой буквы. Операция описывается такой формулой:
Hn = (Hn–1 ⊕ R(Mn)) 1 является простым, если имеет первообразный корень. Напомню (см. раздел 13.3), что r называется первообразным корнем из N, если rN–1 mod N = 1 и r(N–1)/p mod N ≠ 1 для любого p, делящего N – 1. Чтобы проверить N на простоту, нужно только
вычислить rx mod N для значений x = N – 1 и x = (N – 1)/p, где p – делитель N – 1. Назовем этот метод тестом на простоту по первообразным корням, или для краткости тестом по корням. Его придумал
в 1876 году французский математик Эдуард Люка – тот самый, который ввел в оборот термин число Фибоначчи (раздел 3.4). Люка умер
в 1891 году в результате трагического несчастного случая.
Достаточно проверить, являются ли первообразными корнями 2,
3, 5, 7, 11 и 13. Если N имеет хотя бы один первообразный корень, то
с очень высокой вероятностью одно из этих чисел будет таковым.
А если ни одно из них первообразным корнем не является, то не
тратьте время на проверку других значений, а лучше сразу переходите к следующему кандидату на роль простого числа.
Проблема теста Люка по корням в том, что нужно разложить N – 1
на множители, а если N содержит 300 и более цифр, то эффективно

Алгоритм распределения ключей Диффи–Хеллмана

287

сделать это невозможно, по крайней мере без помощи квантового
компьютера. Потому-то этот тест и не упоминается в книгах и на
сайтах, где обсуждается проверка на простоту.
Но это препятствие можно обойти. Напомним, что наша цель состоит не в том, чтобы отыскать общий способ проверки на простоту,
а в том, чтобы получить одно простое число и взять его в качестве
модуля в алгоритме Диффи–Хеллмана. Поэтому вместо того чтобы
искать простое число, мы можем его сконструировать.
Фокус заключается в том, чтобы выбрать N – 1 с известными множителями. Например, можно было бы выбрать N – 1 вида 2n, тогда N
имело бы вид 2n + 1. Единственным простым множителем N – 1 было
бы число 2. Чтобы найти простые числа вида 2n + 1, нужно только
найти такое число b, что bN–1 mod N = 1 и b(N–1)/2 mod N ≠ 1. Я рекомендую попробовать b = 2, 3, 5, 7, 11 и 13. Если ни одно из них не является
первообразным корнем, то пропустите N = 2n + 1 и посмотрите, не
будет ли простым N = 2n+1 + 1. Поиск в сети сообщит вам, что среди
чисел такого вида простыми являются 3, 5, 17, 257 и 65537. Неизвестно, есть ли еще какие-нибудь, хотя на решение этого вопроса потрачены тысячи часов машинного времени. Эти пять простых чисел
называются числами Ферма в честь французского математика Пьера
де Ферма, знаменитого своей заметкой на полях книги по поводу
уравнения an + bn = cn.

План
Прежде чем переходить к деталям, я хочу в общих чертах описать
метод построения большого простого числа P. Метод должен удовлетворять следующим условиям:
1 P

– 1 должно иметь большой простой множитель, так чтобы P
было безопасным;
2 для любого кандидата на роль P вероятность оказаться простым
числом должна быть велика, чтобы минимизировать число проверок на простоту;
3 P – 1 должно иметь мало различных простых множителей, чтобы каждая проверка на простоту занимала как можно меньше
времени.
Любой поиск большого простого числа будет включать проверку
сотен, а то и тысяч кандидатов. Обозначим ожидаемое число проверок E. Наш подход заключается в том, чтобы искать каждого кандидата на роль P – 1 в виде произведения двух чисел, cK. Коэффициент
c будет пробегать последовательность относительно небольших чисел, как правило, сравнимых с E по порядку величины. Ядро K будет
либо большим простым числом, либо произведением степеней максимум двух простых чисел paqb, где хотя бы одно из p и q – большое
простое число. Сначала рассмотрим выбор коэффициентов, а затем
выбор ядра.

Глава 14

288

Одноразовый блокнот

Коэффициенты
Простейший способ выбрать коэффициенты – перебирать простые
числа по одному. Поскольку коэффициенты должны быть четными,
будем пробовать удвоенные простые числа: 2×2, 2×3, 2×5, 2×7, ... .
Этот метод, который мы назовем PickPrimes, минимизирует число
различных простых множителей cK. Как c, так и K имеет не более
двух различных простых множителей. Однако PickPrimes не сокращает количество необходимых проверок.
Другой способ выбора коэффициентов – искать их в виде paqb,
a b c
p q r и т. п. Здесь p, q и r – малые простые числа, например 2, 3 и 5
или 2, 5 и 7. (Ниже в этом разделе мы встретим случай, когда 3 необходимо опустить.) При таком подходе P не может быть кратно 2, 3
и 5, что существенно увеличивает шансы P оказаться простым. Если
вы решите воспользоваться этим методом, то имеет смысл заранее
вычислить и отсортировать список коэффициентов.

Ядро
Ядро K должно иметь хотя бы один простой множитель, R. Я рекомендую выбирать R не менее 2128 ≈ 3.4×1038. Если противник располагает квантовым компьютером, то R должно быть не меньше 2256 =
1.16×1077. А откуда же взять эти простые числа? Если вы готовы согласиться на 30-знаковые числа, то кое-что можно найти на сайте
bigprimes.org.
Если вы ожидаете, что будете генерировать много больших или
очень больших простых чисел, то придется приложить усилия самостоятельно. Подготовьтесь, заранее построив таблицу простых чисел
разного размера. Назовем ее PrimeTab. Сохраните PrimeTab, чтобы
в тот момент, когда потребуются дополнительные простые числа,
не повторять все заново. Можете для начала поместить в таблицу
25 простых чисел, меньших 100. Возможно, вы помните их наизусть,
так что просто наберите в программе. Далее можете, если хотите,
сгенерировать несколько простых чисел длиной от 3 до 12 цифр,
скажем по 2–3 числа каждого размера, воспользовавшись методом
перебора делителей. Я рекомендую внести в процесс элемент случайности, чтобы не строить одни и те же простые числа при каждом
использовании этого метода (и чтобы все читатели, использующие
его, не получали одинаковые числа). На этом этапе PrimeTab могла
бы содержать примерно 50 простых чисел.

Конструирование R (метод малых шагов)
Теперь начнем конструировать R, большой простой множитель Q – 1.
Можно делать малыми шагами, отыскивая простые числа, каждое из
которых немного больше последнего найденного, или рвануть вперед одним гигантским прыжком. Если вы рассчитываете сгенери-

Алгоритм распределения ключей Диффи–Хеллмана

289

ровать много больших простых чисел, то рекомендую остановиться
на малых шагах – тогда в PrimeTab накопится много чисел для последующего использования. Для иллюстрации обоих методов будем
конструировать R малыми шагами, а Q – одним скачком.
Предположим, что PrimeTab содержит k простых чисел, p1 < p2 < p3 <
... < pk. Для построения следующего простого числа начните с выбора
из таблицы любых двух чисел, pi и pj. Обозначим r произведение pipj.
Если r < pk, то можно было бы взять i или j побольше, чтобы не генерировать слишком много малых простых чисел. Конечно, сколько-то
малых простых чисел нужно, поэтому я рекомендую брать большее
i или j, когда pipj < pk2/3. Сначала с по­мощью теста Люка проверим, является ли простым R = 2r + 1. Это легко, т. к. мы знаем, что единственными простыми множителями R – 1 являются 2, pi и pj. Если 2r + 1 не
простое, пробуем 4r + 1, 6r + 1, 10r + 1, … применяя метод PickPrimes
для выбора коэффициентов. Когда количество цифр перевалит за 20,
для поиска каждого простого числа может потребоваться 50 или более попыток.

Уменьшение количества проверок
Когда числа становятся очень большими, мы сможем сэкономить
время, проверяя, делится ли каждый кандидат nr + 1 на много малых
простых чисел, и только потом переходить к поиску первообразного
корня. Например, можно было бы проверить, что nr + 1 не делится
ни на одно из первых 100 простых чисел. Эту проверку можно значительно ускорить, если заранее вычислить xi = r mod pi для каждого
из первых 100 простых чисел. Затем вместо того чтобы вычислять
(nr + 1) mod pi, где r может содержать несколько сотен цифр, мы вычисляем (nxi + 1) mod pi, где xi содержит всего от одной до трех цифр.
То есть пробное деление на (r mod pi) производится только один раз,
а не по одному разу для каждого значения n. Назовем этот метод
PrimeCheck.
Метод PrimeCheck работает, потому что простые числа-кандидаты выбираются последовательно. Проделать то же самое для традиционного метода поиска больших простых чисел не получится, потому что в нем кандидаты выбираются случайно. Поэтому пробное
деление на малые простые числа в PrimeCheck выполняется гораздо
быстрее, а раз так, то можно использовать больше малых простых
чисел, скажем 300 вместо 100, и тем самым уменьшить число попыток.
Как и раньше, если ни одно из чисел 2, 3, 5, 7, 11, 13 не является
первообразным корнем из nr + 1, то кандидата можно пропустить
и перейти к следующему значению n, пока не найдется очередное
простое число. В этом методе для каждого кандидата выполняется
6 проверок, а не 64, как в традиционном, т. е. он в 10 с лишним раз
быстрее. Каждое найденное простое число добавляйте в PrimeTab.

290

Глава 14

Одноразовый блокнот

Конструирование P и Q (метод большого скачка)
Предположим, что наша цель – найти 300-значное простое число
Софи Жермен. Будем продолжать заполнение таблицы PrimeTab,
пока в ней не окажется хотя бы одно простое число, скажем R > 2128.
Теперь мы готовы сгенерировать 300-значное простое число одним
большим скачком. Для начала выберем целевое T требуемого размера, например T = 10300. Можно добиться, чтобы P было сколь угодно
близко к целевому значению, но для алгоритма Диффи–Хеллмана
это необязательно. Достаточно, чтобы T было минимально желательного размера.
Следующий шаг – нахождение Q. Напомним, что Q должно удовлетворять трем условиям: Q должно быть простым, Q – 1 должно
быть кратным большому простому числу R и P = 2Q + 1 тоже должно
быть простым. Стратегия поиска Q заключается в том, чтобы выбрать какое-то начальное число t с известными простыми делителями и пробовать 2t + 1, 4t + 1, 6t + 1, 10t + 1, ..., применяя метод
PickPrimes.
ПРЕДУПРЕЖ ДЕНИЕ Если выбрать t кратным 3, то Q будет
иметь вид 3x + 1. Тогда P = 2Q + 1 = 6x + 3 будет кратно 3. Так что
при t, кратном 3, P не может быть простым.
Поскольку T – минимальное значение P, а Q близко к P/2, то t должно быть близко к T/2. Для построения t начнем с наибольшего прос­
того числа в PrimeTab, а именно R. Возьмем наибольшую степень R,
меньшую T/2, скажем Rr. Например, если T равно 10300, а R порядка
1040, то T/2 = 5×10299, так что r равно 7. Следовательно, Rr порядка 10280.
Переход от 1040 прямо к 10280 – действительно гигантский скачок. Это
Rr намного меньше 5×10299, поэтому положим t = R7S, где S порядка
5×1019. Когда S < 1012, можно воспользоваться перебором делителей
для нахождения следующего простого числа, большего S. Если оно
равно S', то t равно R7S'. Когда S >1012, можно положить S' равным
произведению какого-то простого числа из таблицы PrimeTab и выбранного вами простого числа, меньшего 1012, или сделать S' квадратом либо кубом простого числа. Предположим последнее. В нашем
примере S ≈ 5×1019. Квадратный корень из него равен приблизительно 7 071 067 812. Следующее большее простое число равно U =
7 071 067 851. Поэтому t будет равно R7U2.
Итак, теперь мы построили t и знаем все его простые множители. Можно приступать к поиску Q путем проверки 2t + 1, 4t + 1,
6t + 1, 10t + 1, ... с по­мощью теста по корням. Для случайно выбранного числа N вероятность оказаться простым приближенно равна
1/ln(N). Если N порядка 10300, то ln(N) ≈ 690. Это значит, что понадобится примерно 690 попыток, чтобы найти простое число вида nt+1.
Необходимо также, что P было простым, а вероятность этого тоже
приближенно равна 1/690. Это значит, что всего понадобится 6902 =

Алгоритм распределения ключей Диффи–Хеллмана

291

476 100 попыток, чтобы найти такие числа Q = nt+1 и P = 2Q+1, которые одновременно будут простыми. Очень много.
Эти проверки занимают время, поэтому ценна любая идея, позволяющая уменьшить их количество. В данном случае мы можем воспользоваться естественным обобщением PrimeCheck. Для каждого
простого pi вычисляем xi = t mod pi, как и прежде. Для каждого значения n проверяем, делится ли nxi + 1 на pi, чтобы убедиться, что Q
не является кратным pi, а также проверяем, делится ли 2(nxi + 1) + 1
= 2nxi + 3 на pi, чтобы убедиться, что P не является кратным pi. Таким
образом, мы получаем от списка xi двойную выгоду.

Секретные простые числа
В некоторых шифрах требуется использовать секретное простое число, известное только вам и вашим корреспондентам. Для построения
такого числа можно использовать методы, описанные в этом разделе, но нужна уверенность, что противник не сможет повторить те же
шаги и раскрыть ваше число. Я рекомендую две меры предосторожности. (1) При инициализации таблицы PrimeTab вместо 2–3 прос­
тых чисел длиной от 3 до 12 цифр выберите случайным образом
5–10 простых чисел длиной от 3 до 14 цифр. Ваша цель – поместить
в PrimeTab по меньшей мере 100 начальных простых чисел. (2) Применяйте метод малых шагов для построения P, Q и R, желательно
использовать как минимум 100 шагов в дополнение к начальным
простым числам.

Точный размер
Метод большого скачка для конструирования простых чисел легко
модифицировать для нахождения чисел точно заданного размера. Приведу пример. Пусть требуется найти простое число от 10300
до 1.1×10300. Выберем r немного меньшим, чем 10300/2000000, т. е.
5×10294. Воспользуемся методом PickPrimes, но начнем с простых чисел, больших 1000000, т. е. 1000003, 1000033, 1000037, 1000039, ... . Для
уменьшения количества проверок будем использовать метод PrimeCheck.
Существует примерно 6700 простых чисел между 1 000 000
и 1 100 000 и примерно одно из каждых 690 чисел между 10300
и 1.1×10300 простое, поэтому мы почти наверняка найдем простое
число требуемого размера. Вероятность легко вычислить. Вероятность, что любое наперед заданное число в интересующем нас диапазоне не простое, равна 689/690. Вероятность, что все 6700 выбранных чисел не простые, равна (689/690)6700 ≈ 0.00006. Следовательно,
вероятность успеха равна 99.994 %. **

15

Матричные методы

Краткое содержание главы:
шифры, в которых используется умножение на матрицу
целых чисел или на матрицу элементов кольца;
„„ шифры, в которых используется умножение на большие
и малые числа;
„„ решение сравнений первой степени;
„„ построение колец и обратимых матриц.
„„

Матрицы находят полезные применения в криптографии, потому
что с их помощью можно шифровать сколько угодно большие блоки
текста за одну операцию. Обычно каждый блок сообщения рассмат­
ривается как вектор байтов, т. е. целых чисел по модулю 256.
Инструментарий

Подстановка

Перестановка

Фракционирование

Сжат

ие те
кст

епление

Сц

а

Случайные числаы
риц

Мат

Если Сандра использует матрицу для шифрования сообщения, то
Рива должна использовать обратную матрицу для его дешифриро-

Обращение матрицы

293

вания. Начнем обсуждение матричных методов с техники обращения матриц.

15.1 Обращение матрицы
Существует несколько способов решения матричного уравнения
вида C = AP, когда открытый текст известен. Поскольку Эмили знает
P и C, но не знает A, она может решить уравнения относительно A,
умножив обе части справа на P'; тогда CP' = APP' = A. Следовательно,
Эмили нужно обратить P. У Ривы обратная задача. Она знает A, но не
знает P, поэтому должна обратить A. Умножая обе части слева на A',
она получает A'C = A'AP = P.
У описанного здесь метода есть то преимущество, что обратная
матрица получается непосредственно, без промежуточного шага обратной подстановки, необходимого в других методах. Идея метода
заключается в том, чтобы расположить заданную матрицу бок о бок
с единичной, так чтобы образовалась матрица n×2n двойной ширины. Левая часть приводится к единичной матрице с по­мощью одних
лишь элементарных операций над строками. Эти операции применяются к каждой строке двойной матрицы, так что левая половина преобразуется из исходной матрицы в единичную, а правая – из
единичной в обратную исходной.
Под элементарными понимаются следующие операции над строками: (1) умножение строки на число, отличное от нуля; (2) перестановка двух строк; (3) вычитание одной строки, умноженной на
число, из другой строки.
Алгоритм преобразует элементы исходной матрицы в элементы единичной матрицы по одному, начиная с левого верхнего угла
и спускаясь вниз по самому левому столбцу. Затем то же самое делается для второго столбца и т. д. Если в какой-то момент алгоритм
заходит в тупик, т. е. все элементы активного столбца кратны 2 или
13, то матрица необратима. Если такое происходит с Сандрой, то ей
следует попробовать другую матрицу A. Часто достаточно прибавить
1 к какому-то элементу нижней строки. Если такое приключается
с Эмили, значит, ей нужно еще n элементов открытого текста. Это
даст ей матрицу размера (n+1)×n. После применения описанного алгоритма обратная матрица окажется в правом верхнем углу размера
n×n матрицы двойной ширины.
Приведем пример для случая 3×3. Эта матрица применяется
к 26-буквенному английскому алфавиту, поэтому элементами мат­
рицы являются целые числа по модулю 26. Ни дроби, ни отрицательные числа не возникают. Поскольку все делается по модулю 26,
всякий элемент, не кратный ни 2, ни 13, имеет мультипликативный
обратный. Это позволяет преобразовать первый ненулевой элемент
в каждой строке в 1 и, стало быть, без труда решить, какое кратное
строки вычитать из любой другой строки. Исходная матрица равна

294

Глава 15

Матричные методы

Для перехода к матрице двойной ширины дописываем справа
единичную матрицу 3×3:

Проблема возникает сразу же, потому что первые элементы во
всех строках необратимы. Я сделал это специально, чтобы продемонстрировать весьма полезный трюк. Первый элемент в строке 1
кратен 13, но не кратен 2. Первый элемент в строке 2 кратен 2, но
не кратен 13. Если просто прибавить строку 2 к строке 1, то первый
элемент станет равен 19; он не кратен ни 2, ни 13, а стало быть, обратим. Проблема решена.

Обратным элементом для 19 по модулю 26 является 11, потому
что 19×11 = 209 ≡ 1 mod 26. Умножим первую строку на 11, чтобы
сделать первый элемент матрицы равным 1:

Теперь мы можем закончить работу со столбцом 1, для чего вычтем первую строку, умноженную на 6, из второй, и первую строку, умноженную на 10, из третьей. Тогда первые элементы второй
и треть­ей строки станут равны 0:

Перейдем ко второй строке. Первый ненулевой элемент во второй строке – 9. Обратным к нему является 3, потому что 9×3 = 27 ≡

Обращение матрицы

295

1 mod 26. Умножим вторую строку на 3, чтобы первый элемент в ней
стал равен 1:

Теперь, чтобы покончить со вторым столбцом, нужно вычесть
вторую строку из первой и вычесть вторую строку, умноженную на
25, из третьей. Обратите внимание, как левая часть матрицы двойной ширины постепенно преобразуется в единичную матрицу.

Почти готово. Первый ненулевой элемент в третьей строке – 21.
Обратным к нему является 5, поэтому умножаем нижнюю строку
матрицы на 5.

Чтобы покончить с третьим столбцом, нужно вычесть третью
строку, умноженную на 9, из первой и третью строку, умноженную
на 19, из второй.

Всё! Теперь в левой половине находится единичная матрица,
а в правой – матрица, обратная исходной. Это легко проверить, умножим исходную матрицу на обратную к ней. Результатом должна
быть единичная матрица – и так оно и есть.

296

Глава 15

Матричные методы

15.2 Матрица перестановки
Начнем с очень простого матричного метода, а именно матрицы
перестановки. Это квадратная матрица, в каждой строке и каждом
столбце которой находится ровно одна единица. Все остальные элементы матрицы равны 0. Чтобы переставить блок из 10 букв, мы
можем представить его в виде матрицы размера 1×10 и умножить
справа на матрицу перестановки размера 10×10. В результате получится матрица 1×10 с переставленными буквами.
Чтобы переместить букву из позиции 2 блока в позицию 5, следует
записать 1 в элемент на пересечении второй строки и пятого столбца. Следующая матрица перестановки 4×4 изменяет блок ABCD на
BADC:

Сами по себе матрицы перестановки не особенно полезны, но
если имеется матрица M для выполнения подстановки блока и мат­
рица перестановки T, то обе операции можно выполнить за один
шаг, используя матрицу MT вместо M.

15.3 Шифр Хилла
Самый ранний шифр, основанный на матрицах, – шифр Хилла, предложенный в 1929 году Лестером С. Хиллом из Хантерского колледжа
и опубликованный в журнале «American Mathematical Monthly». Похожий шифр изобрел в 1924 году тогда еще подросток Джек Левин,
впоследствии работавший в Каролинском колледже. Он опубликовал его в 1926 году в журнале «Flynn’s Weekly», специализирующемся на низкопробных детективах. Колонку, посвященную криптографии, в нем вел М. Э. Охавер, изобретатель фракционированного кода
Морзе (раздел 4.4). Кстати говоря, именно в «Flynn’s Weekly» Кенделл
Фостер Кроссен, также упоминавшийся в разделе 4.4, опубликовал
многие свои рассказы. На протяжении всей своей карьеры Левин
пытался принизить шифр Хилла и продвинуть свой собственный.
Шифр Хилла применяется к 26-буквенному алфавиту, в котором
буквы занумерованы от 0 до 25 в перемешанном порядке. То есть
перед матричной операцией выполняется простая подстановка.
Буквы открытого текста берутся блоками по 3. Один блок образует
вектор-столбец, т. е. матрицу P размера 3×1. Этот вектор-столбец
умножается слева на матрицу A размера 3×3, к результату прибав-

Шифр Хилла

297

ляется вектор-столбец B, и получается вектор шифртекста C. В мат­
ричной нотации это записывается в виде C = AP + B, где сложение
и умножение производятся по модулю 26. Наконец, мы преобразуем
числа обратно в буквы, пользуясь тем же соответствием между буквами и цифрами.
К сожалению, многие авторы под шифром Хилла понимают его
ослабленную версию. Чтобы устранить эту путаницу, пронумеруем
несколько версий шифра Хилла. Хилл-0 – самая слабая версия. Используется стандартный английский алфавит без перемешивания,
и вектор B опускается, т. е. C = AP. Шифр Хилл-1 немного более стойкий. Алфавит по-прежнему не перемешан, но вектор B ненулевой.
Хилл-2 – та версия, которая была предложена самим Хиллом. Алфавит перемешан, и вектор B ненулевой. Версия Хилл-3 еще более
стойкая, в ней для преобразования букв в цифры используется один
перемешанный алфавит, а для обратного преобразования цифр
в буквы – другой. Это уже сравнимо с шифром Bifid с сопряженной
матрицей из раздела 9.6.1.
Оригинальный шифр самого Хилла, Хилл-2, был, по существу,
шифром с засекреченным методом. Преобразование букв в цифры
и обе матрицы A и B были фиксированы. Никакого ключа не предполагалось. Всякий, кто знал метод, мог читать сообщения с той
же легкостью, что и полномочный получатель. В большинстве книг
и сайтов, где обсуждается шифр Хилла, перемешанный алфавит игнорируется, а все внимание уделяется матричным операциям. Это
было бы допустимо, если бы использовалось фиксированное преобразование букв в цифры, поскольку известное перемешивание алфавита легко исключается.
Сначала рассмотрим версию Хилл-0, где A – неизвестная матрица
n×n, а вектор B равен 0, т. е. C = AP. Это самое обычное умножение
матриц, которое мы видели в разделе 11.3. Рива может дешифрировать сообщение, умножив шифртекст на матрицу A', обратную A.
Обратная матрица обладает свойством A'A = AA' = I, где I – единичная
матрица (элементы на диагонали равны 1, а все остальные равны 0).
Единичная матрица сродни числу 1 в обычном умножении, где 1×N
= N×1 = N для любого числа N. В случае матриц соответствующее
тождество имеет вид IA = AI = A для любой квадратной матрицы A.
Эмили тоже сможет дешифрировать сообщение, если сумеет определить A'.
Версия шифра Хилла с B = 0 уязвима к атаке с известным открытым текстом. Если Эмили известно n2 символов открытого текста, то
она может организовать их в виде матрицы n×n. Назовем эту матрицу P, а соответствующую матрицу шифртекста C. Тогда C = AP, где C,
A и P – матрицы целых чисел по модулю 26 размера n×n. Решить это
матричное уравнение можно несколькими способами. Один из них
описан в разделе 15.1.1.
Если вектор B ненулевой, то Эмили просто нужно узнать еще n символов открытого текста, и тогда она сможет исключить B из уравне-

298

Глава 15

Матричные методы

ния. Дополнительные известные символы образуют вектор-столбец
P2, а соответствующие символы шифртекста – столбец C2. Эти векторы можно вычесть из обеих частей уравнения: (C – C2) = A(P – P2).
Форма этого уравнения такая же, как у уравнения C = AP, и решается
оно точно так же – обращением матрицы P – P2. Здесь мы вычитаем
вектор-столбец n×1 из матрицы n×n; для этого первый элемент вектора вычитается из каждого элемента первой строки, второй – из
каждого элемента второй строки и т. д.:

Предположим, что открытый текст неизвестен. Но и тогда версию
Хилл-0 можно вскрыть. Будем по-прежнему считать, что секретная
матрица имеет размер 3×3 и C = AP. Умножая слева на матрицу A',
обратную к A, получаем P = A'C. В каждом блоке сообщения первый
символ блока открытого текста зависит только от верхней строки A.
Возможностей всего 263 =17 576, их легко перебрать. Каждая комбинация букв в верхней строке определяет буквы в позициях 1, 4, 7, …
открытого текста. Для всех таких комбинаций подсчитаем частоты
букв.
Эти частоты можно сравнить со стандартными частотами букв
в английском тексте, применив метод высоких пиков, описанный
в разделе 5.9.1. Возьмем комбинации с наилучшим совпадением,
скажем 1 %, или 175 лучших комбинаций. Сделаем то же самое для
второй и третьей букв каждого блока, используя вторую и третью
строки обратной матрицы A'. Это даст 175 правдоподобных комбинаций для каждой из трех строк. Теперь можно попробовать скомбинировать эти комбинации и получить возможные реконструкции
всего сообщения. Нужно перебрать всего лишь 1753 ≈ 5.36×106 комбинаций. Комбинация для первой строки дает первую букву в каждом блоке, для второй строки – вторую букву, а для третьей – третью
букву, так что мы имеем все буквы блока.
Теперь можно воспользоваться частотами триграмм и определить
наиболее вероятный открытый текст. Используйте все триграммы –
не только совпадающие с трехбуквенными блоками, но и пересекающие границы блоков. Процесс такой же, как в разделах 5.10 и 8.2,
поэтому не буду повторяться. Если удовлетворительный результат
получить не удалось, вернитесь в начало и возьмите 2 % или 350 лучших комбинаций для каждой буквы.
Шифр Хилл-1 с секретной матрицей перестановки 3×3 и секретным аддитивным вектором 3×1, но без перемешивания алфавита,
получает оценку 3. Если производится подстановка, перемешанная ключом, до и после матричных операций, то оценка повышается до 5. Его можно вскрыть, как подстановочный триграммный

Шифр Хилла, компьютерные версии

299

шифр общего вида. Оценка повышается с увеличением размера
матрицы. Чтобы достичь оценки 10, размер матрицы должен быть
не меньше 8×8, а матричную операцию Хилл-3 следует применять
дважды. Опишем шаги такого шифра. (1) Преобразовать сообщение
в числовую форму с по­мощью нелинейной подстановки с ключом.
(2) Умно­жить каждый блок на матрицу и прибавить вектор-столбец.
(3) Применить к числам вторую нелинейную подстановку. (4) Умножить каждый блок на вторую матрицу и прибавить второй векторстолбец. (5) Преобразовать результат обратно в буквы, применив
третью нелинейную подстановку с ключом. Обе матрицы можно
фиксировать, но три ключа для перемешивания алфавитов и оба
вектора-столбца следует изменять для каждого сообщения. Назовем
этот шифр DoubleHill.

15.4 Шифр Хилла, компьютерные версии
Шифр Хилла оказался слишком трудным для шифрования вручную.
Хилл сконструировал также механическое устройство для шифрования и дешифрирования. Это было сделано во исполнение патентного законодательства того времени, которое разрешало патентовать
машину, но не математический алгоритм. И все равно шифр почти
не нашел практического применения.
Но теперь, с наступлением эры компьютеров, шифр Хилла снова
стал практически полезным. Умножение матриц – детская игра для
компьютера. И работать он может не с матрицами 3×3, а с матрицами 10×10. Вместо 9 известных символов открытого текста Эмили понадобится 100, чтобы организовать атаку с открытым текстом. Это
почти нереально, разве что путем шпионажа или перехвата сообщений на поле боя. Шифр Хилла с секретной матрицей 10×10 и стандартным алфавитом получает оценку 6. А с перемешанной ключом
подстановкой до и после умножения матриц – оценку 8.
Шифр Хилла можно дополнительно укрепить, если завести несколько матриц и выбирать какую-то для каждого блока периодически либо случайно. Размеры матриц и блоков открытого текста
могут изменяться. Поскольку операция умножения матриц не коммутативна, мы почти наверняка получим разные результаты при
умножении на матрицу слева или справа. Блок открытого текста следует рассматривать как вектор-столбец при умножении слева и как
вектор-строку при умножении справа. Это значит, что шифр можно
сделать еще более стойким, если умножать с разных сторон, меняя
их случайно или периодически. Переменные матрицы, переменные размеры блоков, переменные стороны – можете выбрать что-то
одно или все сразу.
Можно также сочетать с шифром Хилла перестановку, однако не
всякая перестановка повышает стойкость. Предположим, что ис-

300

Глава 15

Матричные методы

пользуется версия Хилл-0 или Хилл-1 и после умножения на мат­
рицу переставляются буквы в каждом блоке. Это то же самое, что
использовать шифр Хилла с разными матрицами-множителями.
Обозначим перестановку T. Применение T после шифра Хилл-1 дает
C = T(AP + B) = (TA)P + (TB). И чего же мы достигли? Просто вместо
матрицы A используется TA, а вместо вектора B – TB. Эмили может
вскрыть этот шифр, имея известный открытый текст, и даже не узнает, что была какая-то перестановка. Если вы хотите использовать
перестановку с шифрами Хилл-0 или Хилл-1, то нужно переставлять
буквы между блоками или разные буквы в разных блоках.
Как ни странно, ситуация точно такая же при использовании
шифров Хилл-2 и Хилл-3. Дело в том, что простая подстановка
и перестановка коммутируют. Если S – произвольная простая подстановка, Т – произвольная перестановка, а M – произвольное сообщение, то S(T(M)) = T(S(M)) и потому ST = TS. Следовательно, для
любой версии шифра Хилла, если вы собираетесь добавить шаг перестановки, обязательно переставляйте буквы между блоками или
разные буквы в разных блоках, меняя их периодически или псевдослучайно.
Еще одна идея – умножать сообщение на матрицы с обеих сторон. Как уже отмечалось, блок текста следует рассматривать как вектор-столбец при умножении на матрице слева и как вектор-строку
при умножении справа. Допустим, что используются матрицы 3×3
и аддитивная матрица B = 0. При умножении на матрицу с одной
стороны выражение для каждого символа шифртекста состоит из
трех членов, в формировании каждого из которых участвует один
символ открытого текста и один элемент матрицы. Если умножать
с обеих сторон, то в выражении для каждого символа шифртекста
будет девять членов, и каждый формируется с участием одной буквы открытого текста и произведения двух элементов матриц. Поэтому коэффициенты при буквах открытого текста квадратичные.
Из 81 возможного квадратичного коэффициента в этих выражениях
могут встречаться 27.
Для шифров Хилл-0 и Хилл-1 Эмили по-прежнему может решить
эти уравнения, зная открытый текст. Есть легкий и трудный способы. Трудный заключается в том, чтобы использовать 18 символов
известного открытого текста для решения 18 квадратных уравнений относительно 18 неизвестных элементов двух матриц 3×3. Удачи вам!
Легкий способ – рассматривать каждый из 27 квадратичных коэффициентов как отдельную переменную. Тогда вместо квадратных
уравнений с 18 переменными мы получим линейные с 27 переменными. Не важно, как эти 27 переменных получены из 18 элементов
матриц, будем рассматривать их как независимые единицы. Поскольку теперь неизвестных 27, Эмили нужно знать 27, а не 18 букв
открытого текста. Маловероятно, но возможно, особенно если она
перехватила несколько сообщений и знает, что они зашифрованы

301

Шифр Хилла, компьютерные версии

одним и тем же ключом. Например, предположим, что Эмили знает,
что все сообщения, отправленные из Швеции, заканчиваются словом STOCKHOLM. Поскольку STOCKHOLM, скорее всего, начинается
в разных позициях трехбуквенных блоков, три разныхсообщения
могут дать ей 27 положений известных букв. Эти 27 уравнений легко
решить и найти все 27 коэффициентов.
Далее можно будет без труда решить 27 одночленных квадратных
уравнений и найти 18 элементов матрицы – но к чему эти хлопоты?
Все связи между буквами открытого текста и буквами шифртекста
выражены в терминах 27 квадратичных коэффициентов. А уж как
эти коэффициенты получены, Эмили знать необязательно.
Случай Хилл-1 мало чем отличается от Хилл-0. Имеется 36 неизвестных, так что Эмили нужно получить 36 символов открытого текста. В остальном процесс решения точно такой же. Ничего подобного
для шифров Хилл-2 и Хилл-3 не существует. Их лучше вскрывать как
подстановочные триграммные шифры.
Можно еще повысить стойкость варианта с умножением на мат­
рицы с двух сторон, если использовать матрицы разного размера.
Приведу два примера такой техники. В первом случае умножение
слева производится на матрицы 3×3, а умножение справа на матрицы 4×4. Поскольку матрицы 3×3 зацепляются с матрицами 4×4, как
показано на рисунке ниже, назовем такую конфигурацию зубчатой
(Butthead).
3×3

3×3

4×4

3×3
4×4

3×3
4×4

В результате получается блок из 12 символов. Поскольку каждая
правая матрица 4×4 пересекается с двумя левыми матрицами 3×3,
каждый символ шифртекста зависит от шести, а не от четырех символов открытого текста. При такой конфигурации для получения
каждого символа шифртекста нужно всего 7 умножений, так что
этот метод работает очень быстро. Если перемешанные алфавиты
секретны, но матрицы известны, то шифр Butthead получает оценку 6. Если секретны и перемешанные алфавиты, и матрицы, то оценка повышается до 8. И оценка равна 10, если используются матрицы
размера 6×6 и 7×7 или больше. Разумеется, выбранные Сандрой размеры матриц должны быть взаимно простыми числами.
Еще одна рекомендуемая конфигурация шифра с умножением на
матрицы с двух сторон – кирпичная стена (Brick Wall). В этом случае
размеры матриц одинаковы, но сами матрицы смещены на половину ширины, как в кирпичной кладке. См. рисунок ниже.
4×4
2×2

4×4
4×4

4×4
4×4

4×4
4×4

2×2

302

Глава 15

Матричные методы

Заметим, что границы матриц никогда не совмещаются. В такой
конфигурации нет блочной структуры; иначе можно сказать, что все
сообщение представляет собой один блок. Поскольку каждая правая
матрица 4×4 пересекает две левые, каждый символ шифртекста зависит от восьми символов открытого текста. Этого достаточно для
обеспечения высокой стойкости.
Если бы мы использовали настоящие матрицы 2×2 для первого
и последнего блоков, то эти блоки оказались бы слабыми и уязвимыми. Кроме того, понадобились бы матрицы 1×1 и 3×3 для сообщений
некратной длины. Лучше всюду использовать матрицы 4×4. На следующих двух рисунках показано, как это можно сделать для сообщения длины 13. В первом случае мы видим размещение левых матриц,
причем последняя матрица выровнена с правым концом сообщения.
A

B

C

D

A

B

C

D

E

F

G H

E

F

G H

I

J

K

L

I

J

K

L

J

K

L

M

M

А здесь показано размещение правых матриц со смещением на
два символа. Первая и последняя матрицы 4×4 выровнены с концами сообщения.
A

B

C

D

A

B

C

D

C

D

E

F

E

F

G H

I

J

G

I

J

H

J

K

L

M

K

L

M

При таком методе расположения последняя левая и последняя
правая матрицы выравниваются с границами сообщения. Этого
можно избежать, завернув матрицу в начало сообщения, как на рисунке ниже.
A

B

C

D

A

B

C

D

C

D

E

F

E

F

G H

I

J

G

I

J

H

K

L

M

K

L

M A

Если используется простая подстановка, перемешанная ключом,
до умножения на матрицу слева, и другая подстановка после умно-

Умножение больших целых чисел

303

жения на матрицу справа, а сами матрицы размера 6×6 или более
держатся в секрете, то шифр Brick Wall получает оценку 10.
Поскольку для обращения матрицы нужно приложить некоторые
усилия, быть может, имеет смысл использовать фиксированные мат­
рицы для умножения слева и справа. Это ослабляет шифр, но такое
ослабление можно компенсировать добавлением третьей простой
подстановки между двумя шагами умножения на матрицу. Матрицы могут быть любого четного размера, начиная от 6×6. По аналогии
с шифром Хилла назовем этот шифр Эверест1 (Everest). Шифр Everest
получает оценку 10.

15.5 Умножение больших целых чисел
Умножение больших целых чисел аналогично умножению матриц
в одном важном отношении: при умножении матриц каждый элемент произведения равен сумме произведений двух элементов, взятых из обеих матриц. При умножении больших целых чисел каждая
цифра произведения равна сумме произведений двух цифр, по одной из каждого сомножителя. Именно по этой причине я поместил
этот раздел в главу о матрицах.
128-битовый блок можно рассматривать как 16 байт или 16 цифр
в 256-ичной системе счисления или как 128-битовое целое. При
перемножении двух таких 256-ичных целых чисел требуется произвести 256 умножений и 256 сложений (включая переносы). Все
гораздо быстрее и проще, если язык программирования позволяет
умножить два 32-битовых числа без знака и получить 64-битовое
число без знака. Тогда понадобится всего 16 умножений и 16 сложений. А если язык еще и поддерживает умножение 64-битовых чисел
с получением 128-битового произведения, то задача дополнительно
упрощается.
Существуют и более быстрые методы умножения очень больших
чисел, например Карацубы и Тоома–Кука, но выигрыш от их использования при умножении 128-битовых или даже 256-битовых чисел
слишком мал, так что я не буду вдаваться в детали. Некоторые языки
программирования берут на себя все заботы о таких деталях, так что
пользователю вообще не о чем беспокоиться.
А теперь рассмотрим шифр Mult128, в котором сообщение разбивается на 128-битовые блоки и каждый блок умножается на сек­
ретное 128-битовое целое M по модулю 2128. Иными словами, используется только младшая половина 256-битового произведения,
а старшая половина отбрасывается. Это означает, что некоторые
промежуточные произведения не нужно вычислять, потому что они
вносят вклад только в старшую половину. Рива может прочитать со1

Игра слов: по-английски Hill – холм. – Прим. перев.

304

Глава 15

Матричные методы

общение, умножив шифртекст на матрицу M', обратную M по модулю 2128. Посмотрим, как такую матрицу найти.

15.5.1 Умножение и деление сравнений
Раньше я обещал, что все требуемые сведения из математики буду
сообщать по мере необходимости. Вот и настал такой момент. Методы вычисления обратной матрицы опираются на умножение линейных сравнений. Прежде чем показать, как это делается, рассмотрим
пример, чтобы понять, в чем проблема. (Часть этого примера уже
излагалась в разделе 3.6. Быть может, сейчас стоит перечитать этот
раздел.)
Не все сравнения одинаковы. Сильные сравнения имеют единственное решение, слабые – много решений. Чем сильнее сравнение, тем больше информации оно дает. Рассмотрим разные сравнения, начав с самого сильного.
5x ≡ 1 (mod 12). Единственное решение x ≡ 5 (mod 12).
10x ≡ 8 (mod 12). Два решения x ≡ 2, 8 (mod 12).
9x ≡ 3 (mod 12). Три решения x ≡ 3, 7, 11 (mod 12).
8x ≡ 4 (mod 12). Четыре решения x ≡ 2, 5, 8, 11 (mod 12).
6x ≡ 6 (mod 12). Шесть решений x ≡ 1, 3, 5, 7, 9, 11 (mod 12).

Причина такого различия в том, что во всех сравнениях ax ≡ b
(mod n), кроме первого, параметры a, b и n имеют общий множитель.
В сравнении 10x ≡ 8 (mod 12) этот общий множитель равен 2, и сравнение имеет два решения. В сравнении 9x ≡ 3 (mod 12) параметры 9,
3 и 12 имеют общий множитель 3, и решений тоже три. И так далее.
Чем больше общий множитель, тем больше решений и тем слабее
сравнение.
Если a, b и n имеют общий множитель d, то сравнение можно разделить на d. Например, для 9x ≡ 3 (mod 12) общий множитель равен
3. Деление на 3 дает сравнение 3x ≡ 1 (mod 4). Его можно решить
в уме. Решение имеет вид x ≡ 3 (mod 4). Проверяется тривиально:
3×3 = 9 ≡ 1 (mod 4). Теперь можно вернуться к исходному сравнению
по модулю 12; первое решение равно 3 (mod 12), а два других получаются прибавлением 12/3 = 4, т. е. равны 7 (mod 12) и 11 (mod 12).
Резюмирую: если a, b и n имеют общий делитель d, то сравнение
имеет d различных решений. Первое решение имеет вид a/d ≡ b/d
(mod n/d), а остальные отстоят друг от друга на n/d.
Рассмотрим еще две ситуации. Снова предположим, что ax ≡ b
(mod n) и что a и n имеют общий множитель, который не делит b,
например 3x ≡ 7 (mod 30). Такое сравнение не имеет решений. Предположим, с другой стороны, что a и b имеют общий множитель d, который не делит n. Тогда можно разделить a и b на d. Например, если
10x ≡ 25 (mod 37), то 2x ≡ 5 (mod 37). Это сравнение можно решить

Решение линейных сравнений

305

в уме, прибавив 37 к 5, так что получится 2x ≡ 42 (mod 37). Деление
на 2 дает x ≡ 21 (mod 37).
a и b можно не только делить, но и умножать на постоянную, m.
При этом m не должно иметь общих множителей с n. Иными словами, m должно быть обратимо по модулю n. В противном случае мы
сделаем сравнение слабее и потеряем часть информации. Например, пусть дано сравнение 9x ≡ 3 (mod 12). Это слабое сравнение,
имеющее 3 решения. Если умножить a и b на 2, то сравнение примет
вид 18x ≡ 6 (mod 12), что эквивалентно сравнению 6x ≡ 6 (mod 12),
имеющему 6 решений. Слабое сравнение стало еще слабее.
Сравнения по одному и тому же модулю можно складывать и вычитать. Пусть имеются сравнения ax ≡ b (mod n) и cx ≡ d (mod n).
Тогда (a+c)x ≡ b+d (mod n) и (a–c)x ≡ b–d (mod n). Это можно использовать для усиления системы слабых сравнений. Рассмотрим, к примеру, сравнения 9x ≡ 3 (mod 12) и 8x ≡ 4 (mod 12). Первое имеет три
решения, второе – четыре. Сложив их, получим сравнение 17x ≡ 7
(mod 12), которое сводится к 5x ≡ 7 (mod 12) и имеет единственное
решение, x ≡ 11 (mod 12). Можно поступить еще умнее и вычесть
одно сравнение из другого, тогда получится (9–8)x ≡ (3–4) (mod 12),
т. е. мы сразу получаем x ≡ 11 (mod 12).

*15.6 Решение линейных сравнений
Теперь, когда мы знаем, как производить действия над сравнениями, не ослабляя их, можно заняться задачей о решении линейного
сравнения ax ≡ b (mod m), где a, b и m – заданные постоянные, а x –
неизвестное значение. В частном случае b = 1 x является обратным
к a по модулю m. В большинстве учебников упоминается только
один метод – расширенный алгоритм Евклида. (Алгоритм Евклида
обычно приписывают Теэтету Афинскому, который жил на сто лет
раньше Евклида.) Это очень хороший метод. И он вполне может применяться, когда модуль мал или имеет несколько различных малых
простых множителей. Его, безусловно, стоит рекомендовать, когда
разложение на множители неизвестно или достаточно велика вероятность наличия малых множителей.
Однако в криптографии есть всего два часто встречающихся случая, когда требуется вычислять обратное значение по модулю: когда
модуль простой и когда он является степенью 2. В этом разделе описывается более прямой метод.

15.6.1 Приведение сравнения
Основной метод решения сравнения ax ≡ b (mod m) – повторяющее­
ся уменьшение коэффициента при x. Самый простой метод называется ResM. Идея в том, чтобы умножить сравнение на такое целое

306

Глава 15

Матричные методы

число n, что a(n–1) 1/2, выбирать n = ⌈q⌉. На
первый взгляд, все просто, но есть одно осложнение. Когда n = ⌈q⌉,
na больше m, поэтому мы приводим сравнение путем вычитания из
него кратных m, как делали в начале этого раздела. Когда n = ⌊q⌋, na
меньше m, поэтому сравнение приводится путем вычитания его из
кратных m.
Начнем со сравнения
41x ≡ 90 (mod 101).

Поскольку 101/41 = 2.463, умножаем сравнение на 2:
82x ≡ 180 (mod 101).

Вычитаем его из кратных 101, а именно
101x ≡ 202 (mod 101).

Поскольку 101 – 82 = 19 и 202–180 = 22, получаем
19x ≡ 22 (mod 101).

Чтобы проиллюстрировать, чего мы достигли, решим сравнение
с применением и без применения правила половины:
Без правила половины
135x ≡ 77 (mod 1009)
71x ≡ 616 (mod 1009)
56x ≡ 159 (mod 1009)
55x ≡ 1003 (mod 1009)
36x ≡ 895 (mod 1009)
35x ≡ 730 (mod 1009)
6x ≡ 990 (mod 1009)
5x ≡ 825 (mod 1009)
x ≡ 165 (mod 1009)

С правилом половины
135x ≡ 77 (mod 1009)
64x ≡ 470 (mod 1009)
15x ≡ 457 (mod 1009)
4x ≡ 660 (mod 1009)
x ≡ 165 (mod 1009)

Без правила половины приведение потребовало восьми шагов,
а с правилом половины – всего четырех. Это соотношение меняется
в зависимости от коэффициентов и модуля, но 8:4 – довольно типичный результат. Метод ResM с правилом половины будем называть
ResMH.

Глава 15

308

Матричные методы

15.6.3 Лесенка
Если целые числа очень большие, то это все равно медленно, потому
что приходится умножать и делить большие числа. Избежать этого
помогает метод лесенки. В нем на каждом шаге используется два
сравнения. Вместо того чтобы умножать коэффициент при x на возрастающие числа, чтобы приблизить его к модулю, метод лесенки
предлагает умножать коэффициент в каждом сравнении на малое
число, дабы приблизить его к предыдущему коэффициенту. Чтобы
начать процесс, необходимо дополнительное сравнение. Мы возьмем для этой цели сравнение mx ≡ m (mod m), эквивалентное 0x ≡ 0
(mod m).
Рассмотрим пример, в котором участвуют относительно большие
числа:
28338689x ≡ 28338689 (mod 28338689) И
 скусственное начальное
сравнение
6114257x ≡
90926 (mod 28338689) С
 равнение, подлежащее
решению
Поскольку 28338689/6114257 ≈ 4.635, умножаем обе части на 5
и вычитаем одно сравнение из другого:
6114257x ≡ 90926 (mod 28338689),
2232596x ≡ 454630 (mod 28338689).

Здесь 6114257/2232596 ≈ 2.739, поэтому умножаем на 3 и вычи­
таем:
2232596x ≡ 454630 (mod 28338689),
583531x ≡ 1272964 (mod 28338689).

Продолжая в том же духе, получаем:
101528x ≡ 4637226 (mod 28338689),
25637x ≡ 26550392 (mod 28338689),
1020x ≡ 16548275 (mod 28338689),
137x ≡ 9585163 (mod 28338689),
61x ≡ 6129512 (mod 28338689),
15x ≡ 25664828 (mod 28338689),
x ≡ 16824956 (mod 28338689).

Во всех приведенных выше примерах модуль был простым числом. Если модуль составной, то ситуация усложняется. Я не буду рассматривать здесь все сложности. Для криптографии наиболее важен
случай, когда модуль является степенью 2, например 232 или 2128.
В этом случае модуль, выбираемый на каждом шаге, должен быть

Решение линейных сравнений

309

нечетным. Поэтому вместо округления к ближайшему целому мы
всегда округляем к нечетному числу. Например, и 3.14, и 3.99 следует округлять до 3. Метод ResMH с лесенкой будем называть ResMHL.

15.6.4 Цепные дроби
Если имеется два или более линейных сравнений, то коэффициент
при x можно уменьшить гораздо быстрее, применив метод цепных
(или непрерывных) дробей. Цепная дробь – это способ аппроксимировать десятичное число дробью с произвольной точностью. Рассмот­
рим десятичное число R = 0.13579. Оно заключено между 1/7 и 1/8.
Точнее, R ≈ 1/7.3643. Это можно записать как 1 0.3643. Обратите вни7+
мание на знак + в знаменателе. Он означает, что следующее далее
число прибавляется к знаменателю, а не ко всей дроби 1/7.
Дробь 0.3643 можно аппроксимировать числом 1/2.745, или
1 0.745, так что теперь R принимает вид 1 1 0.745. Здесь 0.745
7+ 2+
2+
очень близко к 3/4, так что аппроксимацию можно записать в виде
1 1 3 . Чтобы вернуться к обыкновенной дроби, следует произвес­
7+ 2+ 4
ти действия в обратном порядке:

Дробь 11/81 приближенно равна 0.13580, т. е. отличается от 0.13579
всего на 0.00001. Как видите, этот метод дает очень хорошие приближения.
Рассмотрим снова пример из раздела 15.4.3:
6114257x ≡ 90926 (mod 28338689).

В качестве второго сравнения воспользуемся описанным выше
приемом 0 = 0:
28338689x ≡ 28338689 (mod 28338689).

Здесь 6114257/28338689 разлагается в цепную дробь следующим
образом:

Хорошее эвристическое правило для получения близкой аппроксимации – остановиться непосредственно перед большим знаменателем, в данном случае 24. Оборвав цепную дробь перед 24, получим

310

Глава 15

Матричные методы

или 241/1117.
Умножая коэффициент 6114257 в первом сравнении на 1117, а коэффициент 28338689 во втором сравнении на 241 и вычитая одно из
другого, получаем:
6829625069x ≡ 101564342 (mod 28338689)
6829624049x ≡
0 (mod 28338689)
1020x ≡ 101564342 (mod 28338689)
1020x ≡ 16548275 (mod 28338689)

Это уменьшает коэффициент при x с 6114257 до 1020, т. е. примерно в 5994 раза. Таким образом, применение метода цепных дробей
резко уменьшает число шагов по сравнению с другими методами.
Однако при его использовании возможны сложности, потому что
коэффициент на предыдущем шаге может оказаться гораздо больше, чем на следующем, как, например, при переходе от 6829625069
к 1020. Для балансирования коэффициентов можно чередовать шаги
методом цепных дробей и методом половины. **

15.7 Шифры на основе больших целых чисел
На основе умножения больших целых чисел можно построить много шифров. В разделе 15.3 описан шифр Mult128, подразумевающий разбиение сообщения на 128-битовые блоки. Каждый блок
рассмат­ривается как 128-битовое целое и умножается на секретное
128-битовое целое M по модулю 2128. Чтобы биты хорошо перемешались, все байты множителя должны быть отличны от нуля. Но все
равно этот шифр слабый, потому что младшие n бит каждого блока шифртекс­та зависят только от младших n бит открытого текста
и младших n ключа M. В результате шифрование младшего байта
оказывается простой подстановкой. Выполнение простой подстановки до и после умножения не устраняет эту слабость. Аналогично к двум младшим байтам применяется подстановка биграмм,
а к трем младшим байтам – подстановка триграмм. Шифр Mult128
получает оценку 3.
Простой и очень быстрый способ исправить проблему младшего
байта – объединить старший байт с младшим, например с по­мощью
комбинирующей функции xors или adds. В этом случае оценка повышается до 5. Еще лучше объединить старшие 8 байт с младшими
8 байтами с по­мощью xors или adds. Тогда оценка повысится до 7.
Вот пример:

311

Умножение на малое число
ABCDEFGH
ABCDEFGHIJKLMNOP
ABCDEFGH;8i=W?6}

Первые 8 букв используются как ключ
Блок открытого текста
После объединения, но перед умножением

Одним из способов укрепить шифр могла бы стать перестановка
16 байт, но при наличии достаточного объема шифртекста Эмили
смогла бы определить позицию, в которой изменения минимальны, и пришла бы к выводу, что это переставленный младший байт.
Шифр Mult128 с перестановкой получает оценку 4.
Гораздо более стойкий подход – умножить, переставить и снова
умножить. Перестановка должна перемещать слабые младшие байты в старшую половину блока. Вот несколько примеров подходящих
перестановок: (1) изменение порядка байтов на противоположный,
(2) обмен младшей и старшей половин блока, (3) чередование байтов из младшей и старшей половин в обратном порядке. Если байты
нумеруются от старших к младшим и номера записаны в шестнадцатеричном виде, цифрами от 0 до F, то эти три перестановки можно
представить в виде:
Обращение
FEDCBA9876543210

Перестановка половин
89ABCDEF01234567

Чередование
F7E6D5C4B3A29180

Если язык программирования позволяет работать с блоком и как
с набором 32-битовых слов, и как с набором байтов, то, быть может,
быстрее будет изменить порядок всех четырех слов, что приводит
к такой перестановке:
CDEF89AB45670123

Этот шифр, который мы назовем MPM128, получает оценку 7.
Если включить в данный процесс шаги перестановки, то стойкость
взлетит до небес. Пусть S1, S2, S3 и S4 – четыре независимые хорошо
перемешанные ключом перестановки, P – фиксированная перестановка 5BF4AE39D28C1706, а M1, M2, M3 – операции умножения на три
секретных 128-битовых ключа. Тогда шифр S1M1PS2M2S3PM3S4, называемый Tiger, получает оценку 10.

15.8 Умножение на малое число
Мини-версию шифра Mult128 можно реализовать с по­мощью обыкновенного 32-битового умножения без знака. 128-битовый блок рассматривается как четыре 32-битовых целых числа. Каждое из этих
целых чисел умножается на секретное 32-битовое целое по модулю
232. Все четыре множителя должны быть нечетными, иначе последующее дешифрирование будет невозможно. Получается 32-битовый шифр. Чтобы получить 128-битовый шифр, четыре отдельных

312

Глава 15

Матричные методы

4-байтовых произведения можно рассмотреть как 16-байтовый блок
и перемешать с применением следующей фиксированной перестановки 16-байтового ключа (раздел 7.6):
3E9472D8B61CFA50

За этой перестановкой следует второй шаг умножения, в котором
16-байтовый блок снова рассматривается как четыре 32-битовых
целых. Множители могут быть теми же самыми или новыми. Далее следует вторая перестановка и еще один раунд умножения, так
что всего имеется три раунда умножения и два раунда перестановки. Этот шифр, называемый Mult32, получает оценку 7. Он гораздо
быст­рее всех вариантов шифра Mult128.
Будем рассматривать 16 байт 128-битового блока как байтовую
матрицу 4×4. Четыре байта в любой строке этой матрицы можно рассматривать как 32-битовое целое. Обычно 4 байта целого читаются
слева направо, т. е. самый левый байт считается старшим. Однако
можно читать их и в противоположном порядке, считая самый левый байт младшим. Возьмем шестнадцатеричное число 01020304.
Если умножить его на шестнадцатеричное число 01010101 по модулю 232 обычным образом, то получится 0A090704. Если же умножить
число, записанное в обратном порядке, 04030201, на то же 01010101
по модулю 232, то получится 0A060301.
Точно так же четыре байта в любом столбце можно рассматривать
как 32-битовое целое, читая его сверху вниз или снизу вверх. Назовем два горизонтальных направления Восток и Запад, а два вертикальных – Север и Юг. Умножение строк и столбцов на нечетные
32-битовые числа по модулю 232 в порядке Восток, Север, Запад, Юг
приводит к очень тщательному перемешиванию. Для этого необходимо шестнадцать 32-битовых множителей. Общий размер ключа
равен 16×31 = 496 бит, а не 16×32 = 512, потому что множители должны быть нечетными. Этот шифр, который можно было бы назвать
Compass (компас), получает оценку 8.
Чтобы увеличить оценку до 10, добавьте один или несколько раундов подстановки, например Восток, Север, подстановка, Запад,
Юг. Еще лучше добавить несколько подстановок, например Восток,
подстановка, Север, Запад, подстановка, Юг. Назовем этот вариант
CompassS. Даже при использовании фиксированных, но сильно нелинейных подстановок шифр CompassS получает оценку 10.
Другой способ использования умножения на малое целое число –
циклическое умножение. Занумеруем байты в каждой 32-битовой
строке 1, 2, 3, 4 слева направо, т. е. от старшего байта к младшему.
Умножим это число на нечетное целое по модулю 232. Переместим
байт 1 в конец – 2, 3, 4, 1. Снова умножим на нечетное целое по модулю 232. Повторим еще дважды, так чтобы каждый байт побывал
в каждой позиции по одному разу. То есть байты берутся в порядке
1234, 2341, 3412 и, наконец, 4123. Это следует сделать для каждой из

Умножение по модулю P

313

четырех строк байтовой матрицы 4×4. Всего получается 16 умножений и 12 циклических сдвигов.
Затем те же операции применяются к столбцам. Итого имеем
32 умножения и 24 циклических сдвига. Этот шифр с циклическим
умножением получает оценку 8. У него может быть до 32 различных
32-битовых множителей, используемых в качестве ключей.
Описанные в этом разделе методы можно различными способами
сочетать с методами из раздела 15.4. Приведу лишь один пример,
который назову Mat36. Разобьем сообщение на блоки по 36 символов, рассматриваемые как девять 32-битовых целых. Они образуют
матрицу целых чисел по модулю 232 размера 3×3. Эту матрицу будем
умножать на секретную обратимую матрицу размера 3×3. Если прос­
то умножать справа на другую матрицу 3×3, то младшие байты 9 целых чисел будут зашифрованы слабо. Вместо этого мы циклически
сдвинем весь 36-байтовый блок влево на 16 позиций, а затем умно­
жим его справа на вторую секретную обратимую матрицу целых чисел размера 3×3. Шифр Mat36 получает оценку 8.

15.9 Умножение по модулю P
Если умножение производится по модулю 2n, то младшие байты
оказываются зашифрованы слабо и, чтобы эту слабость устранить,
приходится устраивать танцы с бубнами. Эта проблема не возникает, когда умножение производится по модулю простого числа P. При
условии что множитель велик, каждый бит произведения зависит
от каждого бита открытого текста. Но возникает другая проблема.
Предположим, что выбрано простое число P < 2n и множитель M такой, что 1 < M < P. Это позволяет безопасно умножать значения от 0
до P – 1 на M по модулю P, так что Рива может их дешифрировать,
умножив на число M', обратное M.
Однако значение открытого текста 0 останется неизменным
и значения открытого текста от P до 2n – 1 нельзя умножать безопасно, так как результат может оказаться неоднозначным. Например,
при умножении 3 и P+3 на M по модулю P получится одинаковый
результат, поскольку 3M ≡ PM + 3M (mod P). А это значит, что Рива
не сможет сказать, что было в сообщении: 3 или P+3. Следовательно,
значения от P до 2n – 1 нужно оставлять без изменения. Для этого
определим следующую функцию modp:
modp(x) = Mx mod P, если x < P,
modp(x) = x,
если x ≥ P.
Для решения проблемы Сандра могла бы, например, применить
ИСКЛЮЧАЮЩЕЕ ИЛИ к секретному значению и открытому тексту.
Это приводит к семейству шифров по модулю P. Остановимся на зна-

314

Глава 15

Матричные методы

чении n = 64 (блок размером 8 байт), простом модуле P = 264 – 59 =
18446744073709551557 и множителе M = 39958679596607489, тоже
простом.
Чтобы зашифровывать 64-битовый блок открытого текста B, Санд­
ра выбирает секретную 64-битовую постоянную C1 в качестве ключа и вычисляет x = modp(C1⊕B) + C1. Это первый шифр в семействе.
Назовем его PMod1. Он получает оценку 5. Второй шифр, PMod2,
представляет собой две итерации PMod1, с использованием второй
64-битовой постоянной, C2:
x1 = modp(C1⊕B) + C1,
x2 = modp(C2⊕x1) + C2.

Шифр PMod2 получает оценку 7. Третий шифр в этом семействе,
PMod3, включает три итерации и получает оценку 9:
x1 = modp(C1⊕B) + C1,
x2 = modp(C2⊕x1) + C2,
x3 = modp(C3⊕x2) + C3.

Четвертый член семейства, PMod4, получает оценку 10. Полный
размер ключа в этом случае равен 256 байтам, в четыре раза больше
размера блока:
x1 = modp(C1⊕B) + C1,
x2 = modp(C2⊕x1) + C2,
x3 = modp(C3⊕x2) + C3,
x4 = modp(C4⊕x3) + C4.

Все сложения производятся по модулю 2n, а не P.
Все четыре шифра PModX работают очень быстро, потому что
сложение, умножение и деление по модулю 64-битовых целых непосредственно поддерживаются большинством языков программирования. В некоторых компьютерах эти операции вообще выполняются одной командой. Поэтому шифр PModX работает с 4 или 8 байтами
как с одной единицей, а не обрабатывает каждый 4-битовый блочок
по отдельности, как в шифре DES. Этот класс шифров идеален для
шифрования, реализованного программно. PMod2 безопаснее DES
из-за гораздо большего размера ключа, а PMod4 безопаснее 3DES.
Есть и другой подход к умножению по модулю P, не страдающий
от проблемы неизменившихся значений. Идея в том, чтобы разбить
диапазон целых чисел от 0 до 264 – 1 на два отдельных диапазона
с разными простыми модулями и множителями. Выберем два прос­
тых числа P и Q таких, что P + Q= 264 + 2. Существует приблизительно 1016 таких пар, так что подобрать нужную легко, например P =
9228410438352162389 и Q = 9218333635357389229. Выберем также
два больших множителя M < P и N < Q. Нетривиальная часть заклю-

315

Изменение основания

чается в том, что нужно сдвигать каждый диапазон, чтобы умножались только числа в диапазоне от 1 до P–1 или от 1 до Q–1. Для этого
переопределим функцию modp.
modp(x) = ((x+1)M mod P) – 1,
если x ≤ P–2,
modp(x) = ((x–P+2)N mod Q) + P – 2, если x > P–2.
При такой функции modp шифры PMod1–PMod4 работают так же,
как и раньше, и получают такие же оценки. На рисунке ниже показано, как разбивается диапазон от 0 до 264 – 1.
P
01

Q
P-1

0

01

P-2 P-1

Q-1

P+Q-3 2 64

15.10 Изменение основания
Изменение основания системы счисления тесно связано с умножением на большое целое число. Для очень больших чисел изменение
основания – медленная операция, поэтому наилучшая стратегия –
разбить сообщение на блоки и преобразовывать каждый блок отдельно. Изменение основания размывает границу между байтами
сообщения.
Есть два метода преобразования чисел из одной системы счисления в другую: от младших разрядов к старшим и наоборот. Большинство из нас изучают эти методы в школе, но потом забывают. Чтобы
освежить память читателей, ниже продемонстрированы оба. Сначала мы преобразуем число 1A87 одиннадцатиричной системы в семеричную, начиная с младших разрядов, а потом обратно в одиннадцатеричную, начиная со старших разрядов.
В первом случае мы последовательно делим число на новое основание. Каждый остаток становится новой цифрой преобразованного
числа. Вот шаги преобразования числа 1A87:
1A87/7 дает 312 с остатком 4;
312/7 дает 49 с остатком 5;
49/7 дает 7 с остатком 4;
7/7 дает 1 с остатком 0.
Таким образом, 1A8711 = 104547.
Во втором случае мы последовательно умножаем старшие цифры
на старое основание и прибавляем новую цифру. Вот шаги преобразования числа 10454:

316

Глава 15

Матричные методы

1×7+0 дает 7;
7×7+4 дает 49;
49×7+5 дает 312;
312×7+4 дает 1A87.
Если у вас возникли сомнения по поводу правильности вычислений, вспомните, что 7, 49, 312 и 1A87 записаны в одиннадцатеричной системе.
На базе изменения основания системы счисления можно построить много красивых шифров. Например, 16-байтовый блок можно
также рассматривать как 16-значное число в 256-ичной системе
счисления. Преобразуем его в другую систему, скажем по основанию 263. Затем переставим 263-ичные цифры или выполним подстановку или сделаем то и другое сразу. Получившееся число можно
было бы преобразовать в 277-ичную систему и проделать то же самое. И напоследок вернуться в 256-ичную систему. Для хранения результата потребуется 17-байтовое число. Использовать можно любое
основание от 256 до 362. Напомню, что начальную цифру 0 в любом
промежуточном результате нельзя отбрасывать, потому что она необходима Риве для дешифрирования шифртекста.
Если каждое последующее основание лишь немного больше предыдущего, то на каждом этапе понадобится одинаковое количество
цифр. Количество цифр увеличивается только на последнем шаге,
когда число преобразуется в 256-ичную систему. Основания необязательно должны быть простыми числами.
Опишу идею блочного шифра на базе изменения основания системы счисления. Начинаем с секретной хорошо перемешанной ключом простой подстановки S. Эта подстановка применяется к байтам,
т. е. к целым числам от 0 до 255. S можно продолжить на основания,
большие 256, если оставлять каждую цифру, большую 255, без изменения. Это позволяет обойтись без отдельной таблицы подстановки
для каждого возможного основания. Выберем три основания B1, B2
и B3, удовлетворяющие условию 256 < B1 < B2 < B3 < 363. Понадобится
также три перестановки 16 элементов T1, T2 и T3. Элементами являются целые числа, которые могут достигать B3 – 1, так что для записи
каждого понадобится больше одного байта.
Блочный шифр 3Base включает следующие шаги: (1) подстановка S; (2) преобразование в систему по основанию B1; (3) подстановка S; (4) перестановка T1; (5) преобразование в систему по основанию B2; (6) подстановка S; (7) перестановка T2; (8) преобразование
в систему по основанию B3; (9) подстановка S; (10) перестановка T3;
(11) преобразование в систему по основанию 256; (12) подстановка S. Блок шифра состоит из 16 элементов на всех шагах вплоть до
11-го. А на шаге 12 размер блока увеличивается до 17 байт. Шифр
3Base получает оценку 10.

Кольца

317

*15.11 Кольца
Кольцо – это абстрактная версия целых чисел. То есть кольцо – это
множество, элементы которого можно складывать и умножать, как
целые числа. Вы уже знакомы с несколькими кольцами: целых чисел, рациональных чисел, вещественных чисел, целых по фиксированному модулю, а возможно, также комплексных и алгебраических
чисел. Не столь хорошо известны кольца полиномов с коэффициентами, принадлежащими некоторому кольцу, матриц с элементами,
принадлежащими некоторому кольцу, а также чисел вида a+b 13,
a+b 7+c 49 и a+b 2+c 3+d 6, где a, b, c и d могут быть целыми, ра­
циональными или числами по фиксированному модулю.
Прежде чем обсуждать использование колец в криптографии,
перечислим формальные аксиомы кольца. Сложение в кольце обозначается знаком + (a+b), а умножение – простым расположением
элементов рядом (ab).
„„ Для любых элементов кольца a и b сумма a+b и произведение ab
также являются элементами кольца (замкнутость).
„„ Для любых элементов кольца a, b и c имеет место равенство
a+(b+c)= (a+b)+c (ассоциативность сложения).
„„ Для любых элементов кольца a и b имеет место равенство a+b =
b+a (коммутативность сложения).
„„ Существует элемент кольца, обозначаемый 0, такой, что 0+a =
a+0 = a для любого элемента кольца a (нейтральный элемент относительно сложения, или аддитивный нейтральный элемент).
„„ Для любого элемента кольца a существует элемент, обозначае­
мый –a, такой, что a+(–a) = (–a)+a = 0 (обратимость относительно сложения).
„„ Для любых элементов кольца a, b и c имеет место равенство
a(bc)=(ab)c (ассоциативность умножения).
„„ Для любых элементов кольца a, b и c имеют место равенства
a(b+c) = ab+ac и (a+b)c = ac+bc (дистрибутивность).
„„ Существует элемент кольца, обозначаемый 1, такой, что 1a =
a1 = a для любого элемента кольца (нейтральный элемент относительно умножения, или мультипликативный нейтральный
элемент).
При сложении с аддитивным обратным элементом скобки обычно
опускаются, т. е. (–a)+b записывается в виде –a+b, а a+(–b) – в виде a–b.
Отметим, что операция умножения в кольце не обязана быть коммутативной. Но если это так, то кольцо называется коммутативным.
Все приведенные выше примеры колец коммутативны. Если у элемента кольца a имеется мультипликативный обратный a' такой, что
aa' = 1, то a называется обратимым. При работе с конечными кольцами рекомендуется попробовать попарно перемножить все элементы, определить, какие элементы обратимы, и составить их таблицу,
к которой можно будет быстро обратиться.

318

Глава 15

Матричные методы

Простой способ применить арифметику колец к шифрованию –
объединить пульсирующий шифр из раздела 11.8 и линейное суммирование с запаздыванием из раздела 13.14.1. Выберем кольцо R13
с элементами вида a+b 13, где a и b – шестнадцатеричные цифры,
т. е. целые по модулю 16. Две шестнадцатеричные цифры a и b образуют байт, представляющий некоторый символ. Например, буква
X в кодировке ASCII представлена шестнадцатеричным числом 58,
которому соответствует элемент кольца 5+8 13.
Сумма двух элементов кольца R13, a+b 13 и c+d 13, равна
(a+с)+(b+d) 13, а произведение (ac+13bd)+(ad+bc) 13, причем все
операции сложения производятся по модулю 16. Например, если x =
2+3 13 и y = 4+5 13, то x+y = 6+8 13 и xy = 11+6 13.
Для комбинации пульсирующего шифра и линейного суммирования с запаздыванием, которую можно было бы назвать Lag Ripple,
мы заменяем xn выражением axn+bxn–i+cxn–j, где коэффициенты a, b
и c – элементы кольца, в данном случае R13, а запаздывания i и j –
малые целые числа, например 2 и 5. Открытый текст можно было бы
разбить на блоки, скажем по 16 байт, но если сообщение короткое, то
шифр можно применить сразу ко всему сообщению. Предположим
именно этот случай. Тогда шифрование можно записать в виде:
xn = axn + bxn–2 + cxn–5 для n = 1, 2, 3, ..., L.
Здесь a – обратимый элемент R13, b и c – произвольные элементы
R13, а L – длина сообщения. Арифметические операции выполняются в кольце. Можете считать это вариантом комбинирующей функции madd из раздела 11.8. Для шифрования первых нескольких байтов применяется обычное заворачивание.
В случае одного прохода с известными фиксированными запаздываниями шифр Lag Ripple получает оценку 2, поскольку всего существует 2563 возможных комбинаций коэффициентов. Если шифр
сопровождается простой подстановкой до и после, то оценка повышается до 5. При трех проходах с разными коэффициентами и запаздываниями оценка достигает 6.
В шифре Triple Ripple используется 3 прохода с секретной простой
подстановкой, перемешанной ключом, перед каждой фазой пульсации и после последней фазы. На каждом проходе секретные коэффициенты и запаздывания изменяются. Дополнительно на каждом
проходе можно начинать фазу пульсации в разных позициях сообщения, с заворачиванием. Шифр Triple Ripple получает оценку 10.

15.12 Матрицы над кольцом
В разделах 15.1 и 15.2 мы рассматривали шифр Хилла, в котором
каждый блок сообщения рассматривался как вектор целых чисел,
и этот вектор умножался на целочисленную матрицу по модулю 26

319

Построение кольца

или 256. В числах 26 и 256 нет ничего особенного. Символы сообщения можно представить элементами любого кольца. Если символов
больше, чем элементов в кольце, можно использовать пары или
тройки элементов, так же как пары целых чисел от 1 до 5 использовались в квадрате Полибия (раздел 9.1) для представления 25-буквенного алфавита.
Предположим, что мы использовали матрицу над кольцом R13
с элементами вида a+b 13. Если рассматривать блок открытого текс­
та как вектор из 32 шестнадцатеричных цифр, а не как 16 байт и выписать выражение для каждой цифры произведения матриц, то мы
увидим, что каждая шестнадцатеричная цифра шифртекста является линейной комбинацией цифр открытого текста. Поэтому использование матрицы 16×16 над кольцом R13 эквивалентно использованию матрицы 32×32 над кольцом шестнадцатеричных цифр, т. е.
целых по модулю 16. Следовательно, такой шифр по-прежнему уязвим к атаке с известным открытым текстом. Для атаки потребовалось бы как минимум 256 байт открытого текста. Вероятно, 16×17 =
272 байт было бы достаточно.
Отправитель легко может отразить такую атаку, применив прос­
тую подстановку с ключом до и после умножения матриц. Можно
было бы также построить собственное кольцо, неизвестное никому,
кроме полномочных корреспондентов. Если кольцо удастся сохранить в секрете, то никто не сможет организовать атаку против вашего матричного шифра.

15.13 Построение кольца
Кольцо, содержащее N элементов, называется кольцом порядка N.
Оно представляется двумя таблицами N×N – своими таблицами сложения и умножения. Построение кольца производится в два этапа.
Для демонстрации построим кольцо из 8 элементов. Начнем с таб­
лицы сложения. Из аксиом кольца мы знаем о существовании двух
элементов – аддитивного нейтрального элемента 0 и мультипликативного нейтрального элемента 1. Суммы 0+a и a+0 известны для
всех a. Это дает верхнюю строку и левый столбец таблицы сложения.
+
0
1
2
3
4
5
6
7

0
0
1
2
3
4
5
6
7

1
1








2
2








3
3








4
4








5
5








6
6








7
7








320

Глава 15

Матричные методы

Перейдем ко второй строке. Наша стратегия заключается в том,
чтобы взять первую сумму, которой еще не присвоено значение,
присвоить его, а затем сделать все возможные выводы относительно других сумм, пользуясь аксиомой ассоциативности. Пусть мы хотим, чтобы 1+1 = 2, 2+1 = 3, 3+1 = 4 и 4+1 = 0. Применяя аксиому ассоциативности, мы можем заполнить левую верхнюю часть таблицы.
Например, можно найти 2+2, потому что 2+2 = (1+1)+2 = 1+(1+2) =
1+3 = 4.
+
0
1
2
3
4
5
6
7

0
0
1
2
3
4
5
6
7

1
1
2
3
4
0




2
2
3
4
0
1




3
3
4
0
1
2




4
4
0
1
2
3




5
5








6
6








7
7








Поскольку 4+1 = 0, отсюда следует, что аддитивным обратным элементом к 1 является 4, а обратным к 4 – 1. Аналогично 2 является обратным к 3, а 3 – обратным к 2. А какое значение следует присвоить
5+1? Это не может быть 0, потому что 4 и 5 не могут быть одновременно обратными 1. И 1 не может быть, потому что тогда 5 было бы
равно 0. Это никак не может быть 2, потому что 5+1 = 1+1 означало
бы, что 5 = 1. Аналогично 5+1 не может быть равно ни 3, ни 4. И не
может быть равно 5, потому что 5+5 = 5 означает, что 5 = 0. Остается
две возможности: 5+1 = 6 или 5+1 = 7. Обе имеют одинаковое право
на существование, поэтому положим 5+1 = 6. Отсюда вытекает, что
6+1 = 7 и 7+1 = 5. Это значит, что 5+1+1+1 = 5. Следовательно, 1+1+1 =
0. Но мы уже знаем, что 1+1+1 = 3, и получается, что 3 = 0. Невозможно. Мы зашли в тупик. Полагать 4+1 = 0 нельзя.
В чем же ошибка? Цикл 1+1+1+1+1 = 0 состоит из 5 членов. Длина
любого такого цикла в кольце порядка N должна быть делителем N.
Поскольку 5 не делит 8, довести до конца построение таблицы сложения оказалось невозможно. У нас есть три возможности: сделать
длину цикла равной 2, 4 или 8. Если выбрать длину цикла 8, то получим кольцо целых чисел по модулю 8. При длине цикла 2 сложение
будет совпадать с ИСКЛЮЧАЮЩИМ ИЛИ. Поскольку наша цель – получить новое кольцо, остается только длина цикла 4. Таблица сложения должна иметь вид:

321

Построение кольца

+
0
1
2
3
4
5
6
7

0
0
1
2
3
4
5
6
7

1
1
2
3
0
7
4
5
6

2
2
3
0
1
6
7
4
5

3
3
0
1
2
5
6
7
4

4
4
7
6
5
2
1
0
3

5
5
4
7
6
1
0
3
2

6
6
5
4
7
0
3
2
1

7
7
6
5
4
3
2
1
0

Теперь таблицу умножения можно составить, пользуясь аксиомой
дистрибутивности. Например, 2×2 = 2×(1+1) = 2+2 = 0.
×
0
1
2
3
4
5
6
7

0
0
0
0
0
0
0
0
0

1
0
1
2
3
4
5
6
7

2
0
2
0
2
2
0
2
0

3
0
3
2
1
6
5
4
7

4
0
4
2
6
4
0
6
2

5
0
5
0
5
0
5
0
5

6
0
6
2
4
6
0
4
2

7
0
7
0
7
2
5
2
5

Назовем это кольцо R8. Оно коммутативно, поскольку ab = ba для
всех элементов a и b. Заметим, что 1 и 3 – единственные элементы
R8, имеющие мультипликативный обратный, и что каждый из них
обратен самому себе.
Два кольца заслуживают особого внимания – гауссовы целые числа и кватернионы.

15.13.1 Гауссовы целые числа
Гауссовыми целыми числами называются числа вида a+bi, где a и b –
целые числа, а i – мнимая единица, –1. Иначе говоря, гауссовы целые числа – это комплексные числа, у которых вещественная и мнимая части – целые. Для целей криптографии a и b должны быть
целыми по модулю 16. Таким образом, гауссово число a+bi можно
использовать для представления шестнадцатеричного числа ab. Например, буква X, имеющая шестнадцатеричный ASCII-код 58, представляется гауссовым целым 5+8i.

Глава 15

322

Матричные методы

Гауссовы целые числа складываются и умножаются по следующим
правилам:
(a+bi) + (c+di) = (a+c) + (b+d)i,
(a+bi) × (c+di) = (ac–bd) + (ad+bc)i,
где для применений в криптографии сложение и умножение производятся по модулю 16.

15.13.2 Кватернионы
Кватернионы изобрел в 1843 году ирландский математик Уильям
Роуэн Гамильтон из Тринити-колледжа в Дублине, Королевский
астроном Ирландии. Они понадобились ему для описания движений
вращающегося тела. Кватернионы – это числа вида a+bi+cj+dk, где a,
b, c и d – обыкновенные числа, а i, j и k – абстрактные единицы. Определяющими для кватернионов соотношениями являются i2 = j2 = k2 =
ijk = –1. Из них можно вывести правила умножения:
ij = k
jk =i
ki = j

ji = -k
kj = -i
ik = -j

Умножение кватернионов не коммутативно. Кватернионы часто
выступают в роли канонического примера некоммутативного кольца.
Кватернионы широко используются в физике, например для
представления точек на сферической поверхности и вращений
твердого тела. Их можно адаптировать и для криптографических
целей, если считать, что a, b, c, d – целые числа по модулю 16 или
256. Тогда каждый кватернион будет представлять 2 или 4 символа
сообщения.
Другой способ использования кватернионов – считать, что a, b, c,
d – целые по модулю 232. Мы можем использовать секретное хорошо
перемешанное множество 5-, 6- или 8-битовых кодов символов, так
что каждый коэффициент будет представлять 6, 5 или 4 символа соответственно. Таким образом, весь кватернион будет представлять
24, 20 или 16 символов сообщения. Зашифровать кватернион сообщения M можно, умножив его слева или справа на секретный множитель-кватернион. Поскольку умножение кватернионов не коммутативно, гораздо более стойкий шифр получится, если умножать
и слева, и справа – AMB. Как и при умножении обычных чисел, младший байт каждой компоненты оказывается самым слабым, поэтому
рекомендуется после первого умножения циклически сдвинуть весь
16-байтовый блок влево на 16 позиций. Тот же самый набор кодов
символов можно использовать для преобразования произведения
обратно в стандартную кодировку ASCII, но лучше взять разные наборы кодов, предпочтительно с кодами разного размера.

Нахождение обратимых матриц

323

Этот метод, который мы назовем Qmult, получает оценку 10. Для
дешифрирования сообщения Рива должна умножить слева на кватернион, обратный A’, а справа на кватернион, обратный B’. Кватернион, обратный a+bi+cj+dk, имеет вид (a–bi–cj–dk)/(a2+b2+c2+d2). Поскольку все операции производятся по модулю 232, a2+b2+c2+d2 будет
иметь мультипликативный обратный элемент, если является нечетным, т. е. когда нечетны один или три коэффициента.

15.14 Нахождение обратимых матриц
Чтобы можно было использовать матрицу в шифре типа Хилла, эта
матрица должна быть обратимой. Но отыскать обратимые матрицы
зачастую трудно. Если количество обратимых элементов в кольце
равно i, а всего элементов r, то вероятность, что случайная матрица
n×n над этим кольцом будет обратимой, равна (i/r)n. Для кольца R8
i/r = 2/8 = 1/4. (Тут налицо резкий контраст с матрицами над кольцом рациональных или вещественных чисел, где у каждого элемента, кроме 0, имеется мультипликативный обратный, а потому почти
любая матрица обратима.) Если матрицы малы, то обычно найти обратимую матрицу удается, случайно выбирая элементы и пробуя все
возможные значения последнего или, в худшем случае, двух последних элементов. Благодаря использованию одного или двух последних элементов мы можем свести матрицу к двум нижним строкам
и избежать полного сведения в каждой попытке.
Я решил не рассматривать в этой книге определители, потому что
не знаю ни одного их применения в криптографии. Однако для читателей, знакомых с определителями, скажу, что матрица обратима, если значение ее определителя является обратимым элементом
кольца. В частности, матрица над кольцом целых чисел обратима,
только если ее определитель равен +1 или –1.
Для больших матриц нахождение обратимой матрицы может оказаться вычислительно неразрешимой задачей. Вместо этого обратимую матрицу нужно построить. Начинаем с построения множества
матриц желаемого размера, имеющих одну из двух специальных
форм: треугольную или блочно-диагональную. Ниже приведены
примеры четырех типов треугольных матриц 4×4.
Верхнетреугольная

Нижнетреугольная

Верхне­
антитреугольная

Нижне­
антитреугольная

324

Глава 15

Матричные методы

В верхнетреугольной матрице ненулевые элементы находятся
только на главной диагонали и выше нее, а все остальные равны
нулю. В нижнетреугольной матрице ненулевые элементы находятся только на главной диагонали и ниже нее, а все остальные равны
нулю. В верхнеантитреугольной матрице ненулевые элементы находятся только на антидиагонали и выше нее, а все остальные равны
нулю. В нижнеантитреугольной матрице ненулевые элементы находятся только на антидиагонали и ниже нее, а все остальные равны
нулю.
Треугольная матрица обратима, если обратимы все диагональные
элементы. Антитреугольная матрица обратима, если обратимы все
антидиагональные элементы. Найти обратные матрицы легко с по­
мощью техники, описанной в разделе 15.1.1. Для верхнетреугольной
и нижнеантитреугольной матрицы процесс приведения следует выполнять справа налево.
Обратимую матрицу общего вида можно построить из треугольных
путем перемножения. Но делать это нужно аккуратно. Произведение
двух верхнетреугольных матриц также является верхнетреугольной
матрицей, а произведение двух нижнетреугольных – нижнетре­
угольной. Антитреугольные матрицы таким свойством не обладают.
Правильный подход – включить в произведение матрицы всех четырех типов. Если треугольные матрицы обозначить A, B, C, D, а обратные к ним A', B', C', D', то обратной к произведению ABCD будет
матрица D'C'B'A'.
Помимо треугольных, к процессу построения обратимых матриц
можно привлечь блочно-диагональные матрицы. Ниже приведен
пример такой матрицы размера 5×5. Ее можно назвать матрицей
типа 2,3, потому что она состоит из матриц 2×2 и 3×3, расположенных вдоль главной диагонали:

.

Произведением двух блочно-диагональных матриц является мат­
рица такого же вида.
Преимущество блочно-диагональных матриц в том, что обращать можно каждый блок в отдельности. Если затем расположить
найденные таким образом обратные матрицы вдоль диагонали, то
получится матрица, обратная к исходной. Нахождение обратимой
матрицы 16×16 может оказаться практически неразрешимой задачей, но найти четыре обратимые матрицы 4×4 не так уж сложно.
Продолжить построенную обратимую блочно-диагональную матри-

Нахождение обратимых матриц

325

цу до полной можно, перемножив несколько блочно-диагональных
матриц разного типа или добавив в произведение обратимые тре­
угольные матрицы.
Давайте, за работу. Постройте собственную обратимую блочнодиагональную матрицу, состоящую из самых крупных блоков, которые сможете найти, и добавьте четыре треугольные матрицы, по
одной каждого вида. Окончательная обратимая матрица будет произведением всех пяти матриц. **

16

Трехпроходный протокол

Краткое содержание главы:
трехпроходный протокол на основе возведения в степень;
„„ трехпроходный протокол на основе умножения матриц;
„„ трехпроходный протокол на основе двустороннего
умножения матриц.
„„

В разделах 2.2 и 2.3 было сказано, что в современной криптографии
можно выделить три ветви: с секретным ключом, с открытым ключом и с персональным ключом. До сих пор описывались только методы криптографии с секретным ключом. Криптография с открытым
ключом описывается во многих книгах, и здесь мы ее затрагивать не
будем. А эта глава посвящена менее известной дисциплине – криптографии с персональным ключом. Иногда ее называют бесключевой
криптографией, поскольку стороны не нуждаются ни в передаче, ни
в разделении ключей.
Основная идея криптографии с персональным ключом заключается в том, что у обоих корреспондентов, Сандры и Ривы, имеется
свой персональный ключ. Он никогда не передается и не разделяется с кем-то еще, даже друг с другом, поэтому у Эмили нет никакой возможности узнать персональные ключи путем подключения
к проводным линиям, перехвата широковещательных сообщений или какой-либо иной формы подслушивания. У криптографии

Нахождение обратимых матриц

327

с персональным ключом имеется важнейшее достоинство – ничего
не нужно подготавливать заранее. Не нужен ни секретный ключ, ни
защищенные каналы связи для обмена ключами. Сообщения можно передавать по открытым каналам. Отсутствуют серверы ключей
и прочая инфраструктура.
Криптография с персональным ключом основана на трехпроходном протоколе, который изобрел Ади Шамир из израильского института Вейцмана в 1975 году. Для его иллюстрации я сочинил небольшую историю:
Жил-был король, влюбившийся в королеву соседней страны. Чтобы
завоевать ее сердце, король решил отправить ей бесценную жемчужину. Была у короля шкатулка, которую невозможно взломать,
и крепкий навесной замок. Но как передать королеве ключ? Если
у гонца будет и шкатулка, и ключ, то он сможет открыть шкатулку и похитить жемчужину. Король мог бы отправить ключ
со вторым гонцом, но опасался, что гонцы сговорятся о встрече на дороге и украдут жемчужину вместе. Королева предложила
остроумное решение.
Пусть король запрет шкатулку на свой замок и отправит ее королеве. Она навесит на нее свой замок и отправит обратно королю. Король отопрет свой замок своим ключом и отправит королеве шкатулку, закрытую только на ее замок. Королева сможет
отпереть шкатулку своим ключом и забрать жемчужину.
Здесь два замка – метафоры двух шифрований, а два ключа – метафоры соответствующих дешифрирований. Сообщение шифруется
функцией отправителя, отправляется получателю, шифруется функцией получателя и возвращается отправителю, который дешифрирует его своей функцией и отправляет обратно получателю, который
дешифрирует его своей функцией. Таким образом, сообщение передается три раза, отсюда и название – трехпроходный протокол.
* Разберем эту процедуру подробнее. Обозначим сообщение M,
функции шифрования и дешифрирования Сандры – S и S', а функции шифрования и дешифрирования Ривы – R и R'. На первом проходе Сандра шифрует сообщение M своей функцией шифрования S
и отправляет SM Риве. На втором проходе Рива шифрует сообщение
SM своей функцией шифрования R и отправляет дважды зашифрованное сообщение RSM обратно Сандре. На третьем проходе Сандра
применяет свою функцию дешифрирования S' к сообщению RSM
и получает S'RSM. Предполагается, что эта операция снимет шифрование S. Но так будет, только если либо функции R и S, либо S' и R
коммутируют, т. е. S'RSM = RS'SM = RM. Это позволит Риве снять свое
шифрование и прочитать сообщение.
Итак, чтобы трехпроходный протокол работал, нам необходимо найти коммутативную функцию шифрования или две функции
шифрования, коммутирующие друг с другом. Сходу я могу предло-

328

Глава 16

Трехпроходный протокол

жить три коммутативные функции шифрования: сложение, умножение и ИСКЛЮЧАЮЩЕЕ ИЛИ. Легко представить себе схему, в которой длина ключа совпадает с длиной сообщения, а само шифрование
заключается в побайтовом сложении ключа с сообщением, или побайтовом перемножении байтов ключа и сообщения, или применении ИСКЛЮЧАЮЩЕГО ИЛИ к сообщению и ключу. Все это простые
варианты одноразового блокнота.
Ни одна из этих схем не безопасна. Если Эмили удастся получать
все три зашифрованных сообщения, она сможет легко снять шифрование. Если функцией является сложение, то три сообщения имеют
вид M+S, M+S+R и M+R. Сложив первое и третье сообщения и вычтя
из суммы второе, она получит (M+S)+(M+R)–(M+S+R) = M, т. е. в точности сообщение M. Тот же метод работает, когда функцией шифрования является умножение. Тогда три сообщения – это (M×S), (M×R)
и (M×S×R). Результатом операции (M×S)×(M×R)÷(M×S×R) снова является M. Если для шифрования применяется ИСКЛЮЧАЮЩЕЕ ИЛИ,
то найти M еще проще, т. к. ИСКЛЮЧАЮЩЕЕ ИЛИ – самообратная
функция. Если просто применить ко всем трем зашифрованным сообщениям ИСКЛЮЧАЮЩЕЕ ИЛИ, то получится исходное сообщение: (M⊕S)⊕(M⊕R)⊕(M⊕S⊕R) =M.
Коммутирующими функциями шифрования являются подстановка и перестановка. Они также небезопасны. Поскольку Эмили будет
видеть сообщение до и после перестановки, ей не составит никакого
труда вычислить эту перестановку.
Таким образом, нам нужна пара коммутирующих функций шифрования S и R такая, чтобы Эмили не могла определить M, даже зная
SM, RSM и RM.

16.1 Метод Шамира
Для решения этой проблемы Шамир применил операцию возведения в степень. Пусть p – большое простое число длиной, скажем,
от 300 до 600 десятичных цифр. Сандра выбирает показатель степени для шифрования s. Соответствующий показатель степени для
дешифрирования s' должен быть таким, чтобы ss' ≡ 1 (mod p–1). Из
малой теоремы Ферма следует, что если 0 < a < p, то ap–1 ≡ 1 (mod p).
В разделе 14.4.2 описано, как выбирать простое p, а в разделе 15.4 –
как найти s'. Аналогично Рива выбирает свои показатели степени
для дешифрирования, r и r'. Обе функции шифрования коммутируют, потому что (Ms)r = Msr = Mrs = (Mr)s.
Сандра вычисляет (Ms mod p) и отправляет результат Риве. Рива
вычисляет (Msr mod p) и отправляет Сандре. Сандра вычисляет
(Msrs' mod p) = (Mr mod p) и отправляет Риве, которая наконец-то вычисляет (Mrr' mod p) = M и получает исходное сообщение.
Этот метод считается безопасным, потому что для нахождения s
или r необходимо решить задачу дискретного логарифмирования,

Дискретный логарифм

329

а в разделе 14.4 мы говорили, что эта задача является вычислительно сложной. Неизвестно ни одного практически осуществимого алгоритма ее решения.
Этот метод работает очень медленно. Все операции возведения
в степень и приведения по модулю больших чисел требуют большого объема вычислений. В следующем разделе описана одна попытка
решения данной проблемы.

16.2 Метод Мэсси–Омуры
Метод Мэсси–Омуры предложили Джеймс Мэсси из Высшей технической школы Цюриха и Джим К. Омура из Калифорнийского университета в Лос-Анджелесе в 1982 году. (В патенте имя написано
как Джимми Омура. Мы с ним учились на одном курсе в MIT, хотя
я его не помню.) Система Мэсси–Омура по существу совпадает с системой Шамира, только модуль имеет вид 2k. Вычеты по модулю 2k
можно вычислить, просто взяв младшие k бит числа. Это гораздо
быстрее, чем вычисление вычета по модулю p, для чего нужно выполнять длинное деление 300- или 600-значных чисел.
Вопрос о том, какой метод быстрее, в течение нескольких лет живо
обсуждался в публикациях Ассоциации по вычислительной технике (ACM) и Института инженеров по электротехнике и электронике
(IEEE).

16.3 Дискретный логарифм
Безопасность алгоритма распределения ключей Диффи–Хеллмана,
трехпроходного протокола Шамира и метода Мэсси–Омуры зависит
от трудности решения задачи дискретного логарифмирования. Есть
три популярных алгоритма ее решения: полный перебор, эффективный до 1012, алгоритм больших и малых шагов Дэниэла Шенкса1,
эффективный до 1018, и ро-алгоритм Джона Полларда, эффективный
до 1022. Однако нам нужен алгоритм, способный работать с числами
порядка 10300. Чтобы прочувствовать, насколько трудна эта задача,
рассмотрим комбинированный метод ее решения. На домашнем ПК
сделать это не получится. Нужен мейнфрейм с большим объемом
памяти или сеть из многих совместно работающих ПК. Впрочем,
можете пропустить этот раздел и просто принять на веру, что задача
дискретного логарифмирования очень трудна.

1

Этот алгоритм был впервые предложен в 1962 году советским математиком Александром Гельфондом и заново открыт Дэниэлом Шенксом
в 1972 году. – Прим. перев.

Глава 16

330

Трехпроходный протокол

16.3.1 Логарифмы
Начнем с обсуждения того, как люди вычисляли обыкновенные логарифмы до появления компьютеров. Один из методов заключался
в том, чтобы взять число, например b = 1.000001, и упорно вычислять его последовательные степени. Так мы нашли бы, что степень
b693148 – ближайшая к 2, а b2302586 – ближайшая к 10. А это значит, что
значение log10(2) очень близко к 693148/2302586 ≈ 0.3010302. Более
точное значение 0.3010300, так что этот метод дает очень хорошую
аппроксимацию.
То же самое можно сделать в кольце, например целых чисел по
простому модулю p. Предположим, что Сандра отправляет сообщение 6 mod 13, а Рива возвращает в ответ сообщение 7 mod 13. Эмили хочет узнать, какой показатель степени Рива использовала при
шифровании. Но вместо степеней 1.000001 мы использовали бы
первообразный корень по модулю 13, например 2. При таком малом
модуле Эмили легко может перебрать все степени 2 по модулю 13.
1 2 3 4 5 6 7 8 9 10 11 12
2 4 8 3 6 12 11 9 5 10 7 1

N
2N (mod 13)

Теперь Эмили знает, что Сандра отправила 25, а Рива в ответ отправила 211. Итак, (25)r ≡ 25r ≡ 211 (mod 13). Это значит, что 5r ≡ 11
(mod 12). Это сравнение можно решить в уме. Действительно, 11+12 =
23, 23+12 = 35. Но 35 кратно 5, а именно равно 5×7, а это значит, что
r должно быть равно 7. Это можно проверить с по­мощью ручного
калькулятора: 67 = 279936 ≡ 7 (mod 13). Сандра отправила 6, Рива в ответ отправила 7, так что все сходится.

16.3.2 Степени простых чисел
Полный перебор – это, конечно, возможный вариант для Эмили, но
при больших p он не годится. Попробуем идею, лежащую в основе
ро-алгоритма Полларда. Первый шаг – сгенерировать несколько последовательностей степеней по модулю p и изучить повторения.
Эмили может проверять одновременно несколько первообразных
корней, по одному на каждом процессорном ядре. Будем считать,
что ядер два. Если b – первообразный корень по модулю p, то Эмили
может вычислять на одном ядре последовательность b2, b3, b4, b5, ...
(mod p), а на другом b2, b4, b8, b16, ... (mod p). Это дает Эмили две отдельные последовательности степеней для каждого используемого
ей первообразного корня.
Помимо вычисления первообразных корней, Эмили может проверять и непосредственно. Сандра отправляет SM, а Рива отправляет в ответ RSM. Эмили может построить последовательности (SM)2,
(SM)3, (SM)4, (SM)5, ... и (SM)2, (SM)4, (SM)8, (SM)16, ... и аналогично для
RSM. Это дает Эмили еще четыре последовательности степеней.

Дискретный логарифм

331

Помимо этих регулярных последовательностей степеней, она
может генерировать и нерегулярные. Обычно они называются случайными блужданиями. Один из способов – возвести последнюю сгенерированную степень в квадрат, а затем умножить на одну из ранее вычисленных степеней. Предыдущую степень можно выбирать
случайно или брать средний элемент списка. Например, предположим, что уже вычислены степени x, x2, x4, x8 и x16. Для вычисления
следующей степени она могла бы возвести x16 в квадрат, получив x32,
а затем умножить, скажем, на x2 и получить x34. Для получения следующей степени нужно было бы возвести в квадрат x34 и результат
x68 умножить на другой элемент списка, скажем x8 – получится x76.
И так далее.
Еще одна форма случайного блуждания получается при использовании двух или трех базовых простых чисел, каждое из которых
должно быть первообразным корнем. Начнем с произведения этих
чисел. Для генерирования следующего произведения Эмили случайно выбирает одно из базовых простых чисел и умножает на него. Чем
больше последовательностей Эмили сгенерирует, тем скорее она
начнет получать результаты.

16.3.3 Коллизия
Ну хорошо, нагенерировала Эмили кучу последовательностей.
А дальше что? Она ищет число, встретившееся в двух списках. Это
называется коллизией, или столкновением. Допустим, оказалось, что
3172964 ≡ 1034298755 (mod p). Это позволит выразить 103 в виде степени 3
по модулю p, решив сравнение 172964r ≡ 4298755 (mod p–1). Метод
решения таких сравнений описан в разделе 15.4. Накопив достаточно коллизий, Эмили может выстроить цепочку, например: RSM ≡ 19a,
19 ≡ 773b, 773 ≡ 131c, ..., 103y ≡ (SM)z. Умножив все компоненты по
модулю p–1, она получит, что RSM ≡ (SM)r (mod p). Это показатель
степени r в функции шифрования Ривы. Эмили вскрыла шифр!
На самом деле все не так просто. Если p – 300-значное простое
число, то Эмили придется вычислить порядка 10150 степеней, прежде
чем начнут появляться коллизии. Если бы она располагала миллионом процессоров, непрерывно вычисляющих эти степени со скоростью 1 000 000 в секунду, то смогла бы сгенерировать 3×1019 степеней
в год. А значит, до получения хоть каких-нибудь результатов прошло
бы примерно 10130 лет и гораздо больше – до выстраивания цепочки. И ко всему прочему понадобилось бы несколько хранилищ по
10150 байт.

16.3.4 Факторизация
Вместо того чтобы искать коллизии, Эмили могла бы при каждом генерировании новой степени попробовать разложить на множители
(факторизовать) ее вычет по модулю p. Предположим, что ей удалось

332

Глава 16

Трехпроходный протокол

факторизовать вычет 97a (mod p) и найти, что 97a ≡ 11b29c83d (mod p).
Она может решить это сравнение относительно 97. Пусть мультипликативный обратный элемент для a по модулю p–1 равен a'. Возведем
это сравнение в степень a'. Имеем 97aa' ≡ 97 ≡ (11b29c83d)a' (mod p). Пос­
ле перемножения всех показателей степени и приведения их по модулю p–1 получаем 97 ≡ 11e29f83g (mod p) для некоторых значений
e, f и g. (Длина каждого фактического значения могла бы достигать
300 цифр, даже если p содержит 300 цифр.) Имея выражение для одного из базовых простых чисел, в данном случае 97, Эмили может
подставить его во все факторизованные произведения – как те, что
уже найдены, так и те, что будут найдены позже.
Эмили не сможет факторизовать вычет каждой степени. Факторизовать 300-значное число очень трудно, в смысле – занимает много времени. Лучшая стратегия – выбрать фиксированное базовое
множество F(B) простых чисел, скажем всех простых чисел, не превышающих B = 106 или, быть может, B = 107. F(B) называется базой
множителей. Пробуем разложить каждую степень, пользуясь только простыми числами из базы множителей. Числа, которые удается факторизовать таким образом, называются B-гладкими. По мере
роста чисел доля B-гладких чисел становится все меньше. Среди
300-значных чисел B-гладких совсем мало. Когда Эмили находит
какой-то множитель, еще не факторизованная часть числа сокращается. Если после перебора всех простых чисел в базовом множестве
какая-то часть числа осталась нефакторизованной, то дальнейшие
попытки следует прекратить. Эффективнее отбросить эту степень
и перейти к следующей.
Вот что должна делать Эмили: продолжать генерировать произведения и факторизовать их вычеты по модулю p. Оставлять только
B-гладкие числа и отбрасывать остальные. Проверять коллизии среди B-гладких чисел. При обнаружении коллизии решать сравнение
относительно наибольшего простого числа в произведении, чтобы для выражения каждого произведения требовалось все меньше
и меньше базовых простых чисел. Для решения этой задачи она может зарезервировать один или несколько процессоров.
Предположим, что qn – степень простого числа, и пусть ее вычет
по модулю p равен x. Пробуем разложить x на простые множители
из базового множества B. Если x не B-гладкое, то пробуем факторизовать числа x+p, x+2p, x+3p, ... . Факторизовать 301- или 302-значное
не намного сложнее, чем 300-значное. Зададим фиксированное число таких попыток, скажем 10 для каждого вычета.
В процессе генерирования степеней Эмили должна уделять особое
внимание произведениям SM и RSM. Напомним, что цель всего этого – найти такой показатель степени r, что (SM)r ≡ RSM (mod p). Сделать это она не сможет, пока не разложит SM и RSM в произведение
степеней базовых простых чисел. Для начала она должна построить
много последовательностей степеней SM и RSM. Успешно отыскав
такое выражение, она ищет простые числа в выражении, которое

Матричный трехпроходный протокол

333

еще не было представлено в терминах степеней меньших простых
чисел. Далее она обращает внимание на эти числа. И продолжает,
пока SM и RSM не будут выражены в виде степеней одного простого
числа. Теперь она может найти r, применив методы из раздела 15.3.2.

16.3.5 Оценки
Предположим, что Эмили использует 106 базовых простых чисел, т. е.
не превышающих B = 15 485 863. Чтобы выразить их все в терминах
одного простого числа, потребуется 106 сравнений. Для их хранения
нужна матрица показателей степени размера 106×106. Первоначально эта матрица разрежена, но в процессе поиска решения постепенно заполняется, поэтому методы работы с разреженными матрицами не принесут пользы. Каждый показатель степени – 300-значное
число. Значит, потребуется порядка 1015 байт, или один петабайт. На
момент написания книги (март 2022) самый большой в мире суперкомпьютер Summit в Ок-Риджской национальной лаборатории был
оснащен 2.76 петабайта адресуемой памяти.
Время работы, очевидно, зависит от того, сколько времени нужно
для поиска B-гладких чисел. Плотность B-гладких чисел описывается функцией де Брёйна Ψ(p, B), которая равна числу B-гладких чисел, меньших p. Ее изучал голландский математик Николас Говерт де
Брёйн. Значение Ψ(x, x1/u) хорошо аппроксимируется функцией xρ(u),
где ρ(u) – функция Дикмана, предложенная статистиком страхового
общества Карлом Дикманом. Функция Дикмана ρ(u) аппроксимируется функцией u–u. В нашем случае x = 10300 и x1/u = 15 485 863, так что
u = 41.725. Таким образом, для нахождения каждого B-гладкого числа потребуется 41.72541.725 ≈ 4.08×1067 попыток.
Всего для нахождения 106 B-гладких чисел потребуется больше
73
10 попыток. Факторизация каждого числа может потребовать 106 операций перебора делителей, т. е. всего 1079 таких операций. Поскольку
числа 300-значные, количество операций при каждом переборе делителей будет равно какому-то кратному 300. Ну, пусть всего 1082 операций. Это гораздо лучше, чем 10150 операций в методе коллизий, но все
равно за пределами возможностей современных компьютеров.
Итак, мы показали, что 300 цифр более чем достаточно в обозримом будущем, быть может на ближайшие 20–30 лет. Все может
измениться по мере разработки квантовых компьютеров, но пока
300 цифр обеспечивают безопасность.

16.4 Матричный трехпроходный протокол
В методах Шамира и Мэсси–Омуры, применяемых в трехпроходном
алгоритме, используется возведение в степень. Но есть и другой
подход на основе матриц. Мы уже встречались с ним при обсуждении шифра Хилла в разделе 15.1. Сообщение разбивается на блоки.

334

Глава 16

Трехпроходный протокол

Каждый блок рассматривается как вектор целых чисел по модулю
256. Этот вектор умножается слева или справа на обратимую квад­
ратную матрицу целых чисел по модулю 256. Для трехпроходной
версии Сандра будет хранить матрицу S для шифрования и обратную к ней матрицу S' для дешифрирования, а Рива – аналогичные
матрицы R и R'. Это матрицы не над множеством целых чисел по модулю 256, а над кольцом R, содержащим 256 элементов, и символы
сообщения интерпретируются как элементы этого кольца. Обозначим блок сообщения M, так что Сандра отправляет Риве SM, а Рива
в ответ отправляет RSM. Сандра дешифрирует это сообщение с по­
мощью S' и получает S'RSM = RM. Теперь Рива может дешифрировать
его с по­мощью R' и получить R'RM = M.
Нетривиальная часть – сделать так, чтобы S'RSM = RM. Умножение
матриц не коммутативно, поэтому Сандра и Рива должны выбирать
специальные матрицы S и R, коммутирующие друг с другом. Уточню: S и R не являются коммутативными матрицами. Если выбрать
случайную матрицу X, то почти наверняка SX ≠ XS и RX ≠ XR. Это
очень важно, так что я повторю: S и R – не коммутативные матрицы.
Но они коммутируют между собой.

16.4.1 Коммутативное семейство матриц
Сандре и Риве понадобится большой запас матриц, чтобы Эмили
не могла просто перебрать их все. Это значит, что нужно большое
коммутативное семейство матриц Ғ, из которого будут выбираться
матрицы для каждого блока сообщения.
ПРИМЕЧАНИЕ Ғ – это именно коммутативное семейство мат­
риц, а не семейство коммутативных матриц. Важно понимать,
что коммутативно семейство, а не сами матрицы. Почти все
мат­рицы в Ғ не будут коммутативными. Они коммутируют друг
с другом, но не с другими матрицами.
Самый простой способ построить коммутативное семейство – начать с произвольной обратимой матрицы F и взять ее степени, F0,
F1, F2, F3, ..., где F0 – единичная матрица I, а F1 = F. Будем называть F
порождающей матрицей семейства Ғ.
Сандре и Риве понадобятся разные матрицы для каждого блока
сообщения, в противном случае Эмили смогла бы решить систему
линейных уравнений R(SMi) = RSMi при наличии достаточного набора блоков сообщений Mi с известным открытым текстом.

16.4.2 Мультипликативный порядок
Чтобы семейство Ғ было большим, нужно найти или построить порождающую матрицу F высокого мультипликативного порядка. Это
значит, что наименьшее целое n > 0 такое, что Fn = I, должно быть

Матричный трехпроходный протокол

335

велико, по меньшей мере 1025, но лучше – больше. Если матрица F
обратима, такое n обязательно существует, и матрицей F', обратной
к F, будет Fn–1. Метод нахождения обратимых матриц описан в разделе 15.8. Определение мультипликативного порядка F сродни искусству. Очевидно, что не имеет практического смысла просто вычислять последовательные степени F, пока не окажется, что Fn = I, уж
во всяком случае не тогда, когда n > 1025. И все же это можно сделать.
Чтобы найти мультипликативный порядок, начнем с матриц 1×1,
т. е. элементов кольца. Определим мультипликативный порядок этих
элементов. Это легко сделать прямым перебором, поскольку максимально возможное значение n равно 255. Вероятные значения – 2, 3,
7, 15, 31, 63, 127 и 255. Мультипликативные порядки матриц большего размера часто оказываются кратны этим числам.
Предположим, что мультипликативные порядки элементов кольца оказались равны 2, 7 и 31. При рассмотрении матриц 2×2 сначала
возведем каждую матрицу A в степень, являющуюся произведением порядков отдельных элементов, например 247231 = 24304. Затем
переберем степени B = A24304. Предположим, оказалось, что B52 = I.
Теперь мы точно знаем, что мультипликативный порядок m матрицы A делит x = 24304×52 = 267213×31 и является кратным 2613. Далее
следует посмотреть, не равны ли I матрицы Ax/7 и Ax/31. Если Ax/7 = I, то
можно попробовать Ax/49. В данном случае наибольшим мультипликативным порядком может оказаться 267×13×31.
Далее переходим к матрицам 3×3. Если в мультипликативных порядках матриц 2×2 не встречалось никаких множителей, кроме 2, 3,
7, 13 и 31, то хорошим начальным показателем степени может стать
x = 2872132312. Переберем последовательные степени B = Ax и повторим процесс снижения показателя. По мере увеличения размера матриц мультипликативный порядок может оказаться слишком
большим для прямого перебора. В таком случае придется угадывать,
какие новые простые множители появятся.
Наблюдайте закономерности в последовательности мультипликативных порядков. Тут вам понадобятся таланты детектива. Например, предположим, что встречаются 23 – 1, 26 – 1, 29 – 1 и 212 – 1. Напрямую вы их не увидите, потому что не все они простые: 26 – 1 = 63 =
327, 29 – 1 = 511 = 7×73, 212 – 1 = 4095 = 325×7×13. Но обнаружение 13 среди простых множителей позволяет высказать догадку, что «настоящим» множителем может быть 212 – 1, а обнаружение 73 – сильный
довод в пользу того, что множителем может оказаться 29 – 1. Если
встретились 23 – 1, 26 – 1, 29 – 1 и 212 – 1, то можно ожидать, что скоро
встретится и 215 – 1. Если все они встретились, то, поскольку каждый
делится на 7, мультипликативный порядок будет делиться на 74.

16.4.3 Максимальный порядок
Цель Сандры – сделать семейство Ғ максимально большим, чтобы
ей и Риве было из чего выбирать матрицы S и R. Есть полезный

336

Глава 16

Трехпроходный протокол

прием – наблюдать за мультипликативными порядками сомножителей. Например, если мультипликативный порядок A равен 19m,
а мультипликативный порядок B равен 23m, то мультипликативный порядок AB мог бы быть равным 19×23m = 437m. Если это не
так, то мультипликативный порядок 437m могли бы иметь матрицы A'B или AB'.
По возможности Сандра должна стремиться к тому, чтобы у порождающей матрицы F мультипликативный порядок был большим
простым числом, скажем m > 1035, дабы предотвратить атаку Силвера–Полига–Хеллмана (раздел 14.4). Сандре придется факторизовать
2n – 1 для различных n, чтобы найти значения, имеющие большие
простые множители, а затем найти порождающую матрицу, мультипликативный порядок которой делится на одно из таких 2n – 1, пробуя матрицы возрастающего размера.

16.4.4 Атаки Эмили
Предположим, что Сандра выбрала F и Ғ и отправила сообщение
Риве. Поскольку Сандра и Рива сообщаются по открытому каналу,
например через интернет, будем предполагать, что Эмили знает F,
Ғ, SM, RSM и RM. Ее цель – найти либо R, либо S, так что шансы удваиваются. Сосредоточимся на нахождении R. Эмили знает две вещи
об R. Во-первых, ей известны значения SM и RSM, что дает систему
n линейных уравнений с n2 неизвестными элементами R. Во-вторых,
она знает, что R принадлежит семейству Ғ, поэтому должна коммутировать с F, т. е. RF = FR. Если кольцо R коммутативно, то это дает
ей недостающие n(n–1) линейных уравнений относительно n2 элементов R.
Эта идея работает, потому что левая часть матричного уравнения
RF = FR порождает суммы членов вида rf, где r – неизвестный элемент R, а f – известный элемент F. Правая же часть порождает суммы членов вида fr. Поскольку кольцо коммутативное, левые члены
rf можно преобразовать к виду fr и объединить с правыми членами
для образования линейных уравнений.
Итак, мы имеем n2 линейных уравнений с n2 неизвестными, и кажется, что решить эту систему и найти R – детская задача. Однако
не все так просто. Вспомните (раздел 15.3.1), что сравнения бывают
слабыми и сильными. И то же самое относится к линейным уравнениям над любым конечным кольцом, размер которого не является простым числом. Чем больше простых множителей в размере
кольца, тем вероятнее появление слабых уравнений. В нашем случае
размер кольца равен 28, т. е. простых множителей восемь, поэтому
многие линейные уравнения, скорее всего, окажутся слабыми. Если
кольцо R выбрано хорошо, то типичный размер матриц мог бы быть
равен 30×30, а если плохо, то 128×128 или даже 256×256. Но даже
если кольцо выбрано хорошо и половина уравнений сильная, следует ожидать, что система из 30×30 = 900 уравнений будет иметь как

Матричный трехпроходный протокол

337

минимум 2450 решений. На практике число решений гораздо больше,
потому что могут быть уравнения, имеющие 4, 8 или 16 решений.
Для Эмили есть хорошая новость. Она может решать уравнения
относительно R', а не R, и любое из найденных 2450 или более решений будет обращением R, что позволит получить сообщение в виде
R'RM = M.

16.4.5 Некоммутативное кольцо
Похоже, Сандру и Риву постигла неудача. Эмили победила.
Возможный ответ на эту атаку со стороны Сандры и Ривы – использовать некоммутативное кольцо. Примерами таких колец являются матрицы и кватернионы (раздел 15.7.2). Элементами матрицы
вполне могут быть матрицы, а коэффициентами кватернионов –
мат­рицы или кватернионы. Но то и другое плохо. Чтобы получить
высокий мультипликативный порядок, матрицы должны быть очень
большими.
Лучше пойти по другому пути и сконструировать собственное
кольцо N, применяя методы из раздела 15.7. Выбирать кольцо нужно
так, чтобы в нем было много элементов, обладающих следующими
свойствами: (1) обратимы, (2) имеют высокий мультипликативный
порядок и (3) не коммутативны. Отыскать кольцо, удовлетворяющее
всем этим условиям, нелегко. Например, кольцо, все элементы которого имеют максимальный мультипликативный порядок (255 для
кольца из 256 элементов), вообще не может иметь некоммутативных элементов. Если бы удалось найти кольцо, в котором половина
элементов обратима, половина имеет мультипликативный порядок,
равный примерно половине размера кольца, а половина не коммутативна, то нам и этого было бы достаточно. Достичь всех трех целей
одновременно невозможно, но можно превзойти одни и подойти
близко к другим.
В некоммутативном кольце матричное уравнение RF = FR уже
нельзя линеаризовать, потому что равенство rf = fr в общем случае
не имеет места. Вместо этого мы получаем систему билинейных уравнений. Члены билинейного уравнения имеют вид axb, где a и b – элементы кольца, а x – искомая переменная. Для решения линейных
уравнений существует простой систематический подход, например
метод исключения Гаусса, но для билинейных это уже не так. Не существует даже общего метода решения такого простого уравнения,
как ax + xb = c с одной переменной x. Поэтому решить билинейные
уравнения над кольцом «невозможно».

16.4.6 Решение билинейных уравнений
А теперь я покажу, как все же решить билинейные уравнения. Хит­
рость в том, чтобы изменить представление элементов кольца N.
Мы уже встречали несколько таких примеров. Элементы кольца R13

338

Глава 16

Трехпроходный протокол

представляются в виде a + b 13, гауссовы целые числа – в виде a +
bi, кватернионы – в виде a+bi+cj+dk. Здесь i, j и k – абстрактные единицы, произведения которых определяют поведение кольца, а a, b,
c и d – коммутативные элементы кольца. Кватернионы могут быть
не коммутативны, потому что умножение единиц не коммутативно,
т. е. ij ≠ ji, ik ≠ ki и jk ≠ kj. В случае гауссовых чисел мнимая единица
всего одна, поэтому они коммутативны.
Идея в том, чтобы линеаризовать билинейные уравнения, отыс­
кав подходящее представление некоммутативного кольца N. Сделать это просто. Для начала разобьем элементы N на два множества, A и B, где A содержит элементы, имеющие представления,
а B – остальные элементы. В начальный момент A пусто, а B содержит все элементы кольца. Переместим все коммутативные
элементы в множество A. Эти элементы представляют сами себя.
Они образуют член «a» в представлении. Любой из оставшихся обратимых элементов выберем в качестве единицы i. Возьмем все
элементы кольца, которые можно представить в виде a+bi, где
a и b – коммутативные элементы, и переместим их из множества
B в множество A. Пока что все элементы A по-прежнему коммутативны.
Множество B не может оказаться пустым, потому что N не коммутативно. Мы уже отмечали, что кольцо с единственной единицей, подобное кольцу гауссовых чисел, обязано быть коммутативным. Поэтому возьмем еще какой-нибудь обратимый элемент из множест­ва
B и назовем его второй единицей, j. На этот раз мы берем все элементы, которые можно представить в виде a+bi+cj, и перемещаем
их из B в A. В множестве B могут еще оставаться элементы. В таком
случае описанные шаги следовало бы повторить, но для простоты
предположим, что (1) хватает всего двух единиц; (2) все элементы
кольца можно представить в виде a+bi+cj, где i и j – абст­рактные единицы; (3) a, b и c – коммутативные элементы кольца N. На практике
количество единиц может зависеть от выбора i и j, поэтому следует
попробовать несколько раз, стараясь добиться минимального числа.
Это важно, потому что чем больше единиц, тем больше уравнений
получится после линеаризации. А поскольку время, необходимое
для решения системы линейных уравнений, пропорционально кубу
их числа, это далеко не безразлично. Вернемся к матричному уравнению RF = FR и представим элементы кольца в виде a+bi+cj. Неизвестные элементы R будут иметь вид x+yi+zj, где x, y и z – неизвестные коммутативные элементы кольца. Теперь член произведения
матриц RF можно записать в виде
(x+yi+zj)(a+bi+cj) = ax + bxi + cxj + ayi + byi2 + cyij + azj + bzji + czj2,
где i2, j2, ij и ji представимы в виде линейных комбинаций 1, i и j,
например d+ei+fj. Конечно, фактические представления зависят от
выбора кольца и его элементов i и j.

Матричный трехпроходный протокол

339

То же самое следует проделать с членами в произведении FR.
В итоге вместо 900 уравнений с 900 неизвестными мы получим 2700
с 2700 неизвестными. И количество ложных решений возрастет с 2450
до 21350. Это плохая новость для Эмили. Ложные решения не помогут
ей восстановить сообщение.

16.4.7 Слабые элементы
В семействе Ғ имеются слабые элементы, например диагональные
или треугольные матрицы, которые Эмили легко может обратить.
Такие элементы не следует использовать в качестве ключей. При
выборе матрицы из Ғ проверяйте, что выше и ниже главной диагонали есть хотя бы один ненулевой элемент. Чтобы ускорить проверку, сравнивайте с нулем только X12, X13 и X23, а также X21, X31 и X32.
Если хотя бы в одной тройке все элементы равны нулю, отбросьте
X и выберите другую матрицу. Процент отброшенных матриц будет
пренебрежимо мал.

16.4.8 Как сделать побыстрее
Пока что не ясно, есть ли у матриц какие-нибудь преимущества
перед возведением в степень. Для выбора матрицы S или R из семейства Ғ требуется возводить порождающую матрицу F в большую
степень. И чем же это лучше или быстрее возведения в большую степень большого целого числа? Разница в подготовке. В методах Шамира и Мэсси–Омуры Сандра и Рива должны возвести в большую
степень число, полученное от другой стороны. Поскольку заранее
это число неизвестно, они не могут принять никаких дополнительных мер, ускоряющих возведение в степень.
Но в методе на основе матриц порождающая матрица F известна
заранее. И Сандра, и Рива могут заранее вычислить какие-то степени F и сохранить их; тогда для вычисления новой степени F можно
будет ограничиться всего одним или двумя умножениями матриц.
Для начала можно сгенерировать 16 матриц F, F2, F4, F8, ..., F32768, для
чего понадобится 15 операций умножения.
Но если бы они на этом и остановились, то Эмили могла бы сделать то же самое. У нее был бы тот же базовый набор матриц, что
у Сандры и Ривы, поэтому она смогла бы без труда определить их
матрицы шифрования, S и R. Чтобы предотвратить это, Сандра
и Рива должны рандомизировать свои наборы матриц. Для этого
они случайным образом выбирают две из своих матриц и перемножают их. Это произведение заменит одну из двух выбранных матриц
в базовом наборе. Сандра и Рива делают это независимо. Ни одна из
них не знает, какие степени F выбрала другая сторона.
Эту операцию замены следует повторить на этапе инициализации
многократно, скажем 1000 раз, так чтобы набор матриц у каждой стороны был совершенно случаен. Если вам кажется, что 1000 слишком

340

Глава 16

Трехпроходный протокол

много, вспомните, что в методе Шамира используется 300-значное
простое число и что каждое возведение в степень требует примерно
1000 умножений и 1000 приведений по модулю. Сандра и Рива должны также хранить обращения своих матриц. При каждом перемножении двух степеней F нужно перемножать также соответствующие
степени F’, чтобы потом не приходилось обращать степени.
Этот этап подготовки, генерирование базового набора, выполняется только один раз, до отправки первого сообщения. Имея такой
набор порождающих матриц, мы можем вычислить матрицу для отправки сообщения, выполнив всего одно умножение для самой мат­
рицы и еще одно для обратной к ней. Мы случайно выбираем две
разные матрицы Fa и Fb из базового набора, перемножаем их, получая Fa+b, а затем заменяем Fa на Fa+b, чтобы каждый раз генерировалась другая матрица.
Я обнаружил, что при использовании такой техники матричный
метод с матрицей 30×30 примерно в 2100 раз быстрее методов Шамира и Мэсси–Омуры на основе возведения в степень с 1024-битовым модулем.

16.5 Двусторонний трехпроходный протокол
В описанном выше методе умножать на матрицу можно слева или
справа, т. е. зашифрованное сообщение может принимать вид SM
или MS. Но можно также умножать с обеих сторон. Втаком случае
сообщение разбивается на блоки по n2 символов и выбирается два
независимых коммутативных семейства матриц n×n, Ғ и Ɠ, с порождающими матрицами F и G. Сандра будет шифровать сообщение
матрицами S из Ғ и T из Ɠ, а Рива – перешифровывать с по­мощью
матриц R из Ғ и Q из Ɠ.
Сандра отправляет Риве зашифрованное сообщение SMT. Рива
перешифровывает его и отправляет обратно сообщение RSMTQ.
Сандра снимает свое шифрование, умножая на матрицы S' и T', и отправляет S'RSMTQT' = RMQ Риве, которая дешифрирует его своими
обратными матрицами R' и Q', поскольку R'RMQQ' = M. Двусторонний
метод непрактичен для коротких сообщений из-за большого размера блока, но для длинных сообщений он гораздо быстрее одностороннего метода, потому что число символов в каждом блоке равно
n2, а не n. Для матриц 30×30 ускорение может быть 15-кратным, т. е.
примерно в 30 000 раз быстрее метода Шамира или Мэсси–Омура.
Эмили предстоит найти две матрицы одновременно. Пусть Эмили
перехватила матрицы X, Y и Z, т. е. X = SMT, Y = RSMTQ и Z = RMQ.
Эмили знает, что Y = RXQ и Z = S'YT'. На первый взгляд кажется, что
Эмили должна будет решить большую систему квадратных уравнений над некоммутативным кольцом N, что гораздо труднее, чем
решение системы линейных или билинейных уравнений. Однако

Двусторонний трехпроходный протокол

341

пос­ле умножения этих уравнений соответственно на R', Q', S и T они
принимают вид R'Y = XQ, YQ' = RX, SZ = YT' и ZT = S'Y. После раскрытия скобок эти матричные уравнения дают билинейные уравнения.
А как решать билинейные уравнения, мы видели в разделе 16.4.6.
Эмили сможет восстановить M, если сумеет найти R' и Q' или S'
и T'. Она может выбрать, какие из четырех уравнений решать: первые два или последние два. Продолжим пример с матрицами 30×30
и займемся решением уравнения R'Y = XQ. В R' имеется 900 неизвестных и еще 900 в Q. Это матричное уравнение дает 900 билинейных уравнений с 1800 неизвестными. Эмили также знает, что R' принадлежит Ғ, а Q принадлежит Ɠ, так что R'F = FR' и QG = GQ. Каждое
из этих условий дает еще 30×29 = 870 билинейных уравнений. Всего
Эмили имеет 2640 билинейных уравнений с 1800 неизвестными. Эти
уравнения можно линеаризовать, изменив представление элементов кольца.
В итоге получаем 7920 линейных уравнений с 5400 неизвестными.
Если уравнений больше, чем неизвестных, то система называется
переопределенной. В процессе приведения системы уравнений Эмили лишние уравнения просто пропадают. То есть многие строки мат­
рицы 7920×5400 будут состоять из одних нулей. Их можно сдвинуть
в нижнюю часть матрицы и игнорировать. Поскольку двусторонние
уравнения образуют переопределенную систему, они сильнее односторонних. С другой стороны, и неизвестных в два раза больше.
Не ясно, какой метод более стойкий. Можете отдать предпочтение
двустороннему, просто потому что он намного быстрее. **

17
Коды

Краткое содержание главы:
„„

идеи для конструирования кодов.

На протяжении столетий, несмотря на прогресс в области шифров,
затем шифровальных машин, а теперь и компьютерной криптографии, военные всегда полагались на коды. Можно предположить, что
даже в наши дни военные все еще используют коды как резервный
вариант на случай, если электронные устройства выйдут из строя
или прервется подача питания.
В большинстве кодов буквы, слоги, слова или фразы заменяются
группами символов фиксированного размера, обычно 3, 4 или 5 десятичными цифрами либо 3 или 4 буквами. Встречаются также коды
переменной длины. Принято выделять два типа кодов: одинарные
и двойные. В случае одинарного кода слова и фразы выписываются
в алфавитном порядке, а кодовые группы присваиваются в числовом порядке, хотя и не подряд, так чтобы для поиска слов и кодовых
групп можно было использовать один и тот же список. Слабость этого кода очевидна. Если противник прознал, что 08452 означает CANNON (пушка), то он будет знать, что коды, близкие к 08452, должны
соответствовать таким словам, как CAMOUFLAGE, CAMPAIGN, CANCEL, CANINE, CANVAS, CAPITAL, CAPITULATE, CAPSIZE, CAPTAIN
и т. д.

Джокер

343

В случае двойного кода кодовые группы сопоставляются в случайном порядке. Кодовая книга содержит два отдельных списка: один
со словами и фразами в алфавитном порядке, другой с кодовыми
группами в числовом порядке. В прошлом на составление кодовых
книг уходили месяцы, и обходилось это очень дорого. Поэтому государственные службы могли пользоваться одним и тем же кодом
годами, что резко снижало его эффективность. Начиная с 1960-х годов задачу компилирования двойного кода взял на себя компьютер,
и занимает это секунды.
Компиляторы кодов применяли множество приемов, делающих
код более безопасным. Для часто встречающихся слов и фраз включалось много эквивалентных кодовых групп, или синонимов. Так,
код ВМФ мог содержать от 10 до 20 кодовых групп для слова «ship»
(корабль), армейский код – много кодовых групп для слова «artillery»
(артиллерия), а дипломатический код – для слова «treaty» (договор).
В кодах встречалось много групп-пустышек. Целые секции сообщения могли быть абсолютно пустыми, т. е. не нести никакой информации. Некоторые кодовые группы могли принимать несколько значений в зависимости от некоторого индикатора, например последней
цифры предыдущей группы.
Иногда кодовые книги печатаются в две колонки. Код берется из
левой или правой колонки в зависимости от индикатора. Например,
если текущая кодовая группа начинается четной цифрой, то следующая кодовая группа берется из левой колонки, иначе из правой.

17.1 Джокер
Джокер – предложенный мной стиль кодирования. Если читатель захочет придумать собственный код, то джокер может стать источником полезных идей. Основная идея заключается в том, что в каждой
кодовой группе одна буква или цифра отличается от остальных. Так,
в группе из 5 символов четыре символа могут нести какой-то смысл,
а пятый, джокер, присутствует только для внесения хаоса. Даже одного null-символа достаточно, чтобы серьезно затруднить задачу
противнику, но специальная буква или цифра позволяет сделать гораздо больше.
Предположим, что код состоит из групп по 5 цифр. Четыре цифры –
это сам код, а одна – джокер. Для начала будем считать, что в первой
кодовой группе каждого сообщения джокер всегда занимает среднюю
позицию. Допустим также, что мы работаем с двухколонной кодовой
книгой и у кодов в левой и правой колонках значения совершенно
различны. Например, 0022 в левой колонке может означать «rescue»
(спасите), а 0022 в правой колонке – «engine» (двигатель).
Аналогично могло бы быть две колонки значений джокера, чтобы
джокер мог переместиться в другую позицию или в другую колонку.

344

Глава 17

Коды

Ниже перечислены возможные значения джокера. Их гораздо
больше десяти. Можете выбрать десятку по своему усмотрению. Или
использовать две колонки и взять 20 значений джокера. Или использовать буквы вместо цифр и выбрать 26 значений джокера.
„„ Начиная со следующей группы джокер перемещается на одну
позицию влево.
„„ Начиная со следующей группы джокер перемещается на одну
позицию вправо.
„„ Начиная со следующей группы джокер перемещается в позицию 1.
„„ Начиная со следующей группы джокер перемещается в позицию 2 и т. д.
„„ Только в следующей группе джокер находится в позиции 1.
„„ Только в следующей группе джокер находится в позиции 2 и т. д.
„„ Переключиться на левую колонку кодов.
„„ Переключиться на правую колонку кодов.
„„ Переключиться на противоположную колонку кодов.
„„ Только для следующего кода использовать противоположную
колонку.
„„ Для следующих двух кодов использовать противоположную колонку и т. д.
„„ Далее следует группа-пустышка.
„„ Вторая после текущей группа является пустышкой.
„„ Следующие две группы – пустышки и т. д.
„„ В следующей группе код – пустышка, но джокер настоящий.
„„ В следующей группе код настоящий, но джокер – пустышка.
„„ Поменять порядок следующих двух групп.
„„ Прибавить 1111 к коду в следующей группе (сложение без переноса).
„„ Прибавить 3030 к коду в следующей группе (сложение без переноса) и т. д.
„„ Если следующий код четный, прибавить 2222, иначе вычесть
2222 (без переноса).
„„ Прибавить 1 к джокеру в следующей группе (без переноса).
„„ Прибавить 2 к джокеру в следующей группе (без переноса) и т. д.
„„ Прибавить этот 4-значный код к следующему 4-значному коду.
Джокер исключается.
„„ Читать цифры следующего кода в обратном направлении, например 1075 в действительности означает 5701.
„„ Игнорировать следующие коды, пока не встретится код, начинающийся с 0.
„„ Следующая группа является специальным индикатором.
Пример сложения без переноса см. в разделе 4.6.
Специальные индикаторы нуждаются в более подробном объяснении. В специальном индикаторе все пять цифр кодовой группы служат специальной цели, например сообщают, где будет джо-

345

Джокер

кер или какую колонку использовать. Так, специальный индикатор
13152 мог бы означать, что в следующих пяти группах джокер будет
находиться в позициях 1, 3, 1, 5, 2 именно в таком порядке. Специальный индикатор также мог бы сообщить, из какой колонки брать
следующие пять кодов: нечетная цифра означала бы, что из левой,
а четная – что из правой. Специальный индикатор 10384 означал бы
тогда, что в следующих пяти группах коды берутся из левой, правой,
левой, правой и правой колонок.
Еще одно возможное применение специального индикатора –
задать числа, прибавляемые к кодам в следующих пяти группах.
Например, можно было бы установить такое соответствие между
цифрами специального индикатора и значениями, прибавляемыми
к 4-значным кодам:
1
2
3
4

1000
0100
0010
0001

5
6
7
8

1100
0110
0011
1110

9 0111
0 1111

Эти значения следовало бы прибавлять без переноса, т. е. сложение производится по модулю 10.
Джокер всегда задает, какое действие следует предпринять в следующей группе или нескольких группах, но никак не в текущей или
предыдущей. Так, не следует наделять джокер семантикой «отменить
предыдущий джокер». Если джокер задает действие, распространяющееся на несколько последующих групп, следите за тем, чтобы
действия двух джокеров не конфликтовали. Например, не должно
быть ситуации, когда джокер в группе 20 говорит «следующие три
кода берутся из левой колонки», а джокер в группе 21 – «следующие
три кода берутся из правой колонки».
Еще один прием – использовать вместо джокера букву от A до E.
Буква может находиться в любой позиции и переопределять ожидаемую позицию джокера. Буква A означает, что следующий джокер
будет находиться в позиции 1, B – в позиции 2 и т. д. Можно также
наделить семантикой буквы F, G и H. Например, F могло бы означать,
что код следует брать из противоположной колонки, а следующий
джокер будет в позиции 1.
Не используйте букву I, если есть хотя бы малейший шанс перепутать ее с цифрой 1. Я люблю использовать букву J в роли суперджокера. Она означает, что все последующее – пустышки. Можете
передавать мусор на протяжении 10, 20 или 100 кодовых групп, вогнав Эмили в ступор. Или можете использовать пустышки, чтобы
отправить дезинформирующее сообщение, например: «Высадка
в Нормандии перенесена на 10 июня, пляж Юта».

18

Квантовые компьютеры

Краткое содержание главы:
свойства квантовых компьютеров;
использование квантовых компьютеров для связи;
„„ использование квантовых компьютеров для распределения
ключей;
„„ использование квантовых компьютеров для решения задач
оптимизации;
„„ использование квантовых компьютеров для
дешифрирования блочных шифров;
„„ следующий шаг – ультракомпьютеры.
„„
„„

Сейчас, когда я пишу эту книгу, квантовые компьютеры находятся
в состоянии младенчества. Во всем мире насчитывается не более
20 квантовых компьютеров, и ни один не содержит более 50 кубитов, или квантовых битов. Я понимаю, что к моменту выхода книги
многое или даже все из написанного устареет или окажется неверным. Математика, применяемая в квантовой механике и квантовых
вычислениях, по большей части выходит далеко за рамки этой книги, поэтому во многих случаях я просто называю квантовые методы
и алгоритмы, не объясняя, как они работают.
В основе квантовых вычислений лежит квантовый бит, или кубит.
У кубита есть два базисных состояния, обозначаемых |0〉 и |1〉, они со-

Суперпозиция

347

ответствуют состояниям 0 и 1 обыкновенного бита в традиционном
компьютере. Нотация |1〉 называется бра-кет. Когда угловая скобка
находится слева, 〈0|, говорят о состоянии бра, поэтому 〈0| читается
«бра-0». Когда угловая скобка находится справа, говорят о состоянии
кет, поэтому |1〉 читается «кет-1». Эту нотацию предложил английский физик, нобелевский лауреат Пол Адриен Морис Дирак.
Обыкновенный бит в традиционном компьютере имеет вполне
определенное значение: 0 или 1. Никаких других значений, в частности промежуточных, быть не может. Бит не может принимать сразу
несколько значений, а иногда не быть равным ни 0, ни 1. Физическое
устройство, например намагниченный участок поверхности, можно
переключить из одного состояния в другое с по­мощью электрического тока или магнитного поля. Возможен краткий переходный период, но устройство не может остаться в каком-то промежуточном
или смешанном состоянии.

18.1 Суперпозиция
С другой стороны, у кубита нет никакого значения до тех пор, пока
не будет произведено измерение или наблюдение. В этот момент
значение может быть равно 0 или 1. Базисное состояние |0〉 означает, что с вероятностью 1.0 значение равно 0, а базисное состояние 1 – что оно равно 1. В общем случае состояние кубита является
суперпозицией обоих базисных состояний α|0〉 + β|1〉, где α и β – комплексные числа такие, что |α|2 + |β|2 = 1. Вероятность, что результатом
измерения этого кубита будет 0, равна |α|2, а вероятность, что оно
окажется равным 1, равна |β|2. Нотация |α| обозначает модуль α. Модуль комплексного числа a + bi равен a2 + b2. Поскольку результат
измерения имеет вероятностный характер, измерение двух кубитов
в одинаковых состояниях может давать разные результаты. В суперпозиции может находиться сколько угодно состояний.
Если квантовое состояние x состоит из нескольких кубитов, скажем x1, x2, x3, то состояние 〈x| представляется в виде вектора-строки
(x1, x2, x3), в котором черточка над каждым компонентом означает
комплексное сопряжение. Для комплексного числа α = a + bi комплекс­
но сопряженным называется число α = a – bi. При этом произведение
αα = a2 + b2 = |α|2. С другой стороны, состояние |y〉 представляется вектором-столбцом

Поскольку в этом примере вектор-строка – матрица 1×3, а вектор-столбец – матрица 3×1, их можно перемножить. Произведением

348

Глава 18

Квантовые компьютеры

матриц, обозначаемым 〈x|y〉, является матрица 1×1 с единственным
элементом, равным скалярному произведению x•y. Таким образом,
〈x|y〉 – скаляр. (Если что-то не понятно, перечитайте раздел 11.3.)
Поскольку к любым двум состояниям можно применить суперпозицию, а сами состояния могут, в свою очередь, являться суперпозицией других состояний, всякий кубит может являться суперпозицией произвольного числа состояний.
Суперпозиция состояний недолговечна. Малейшие возмущения,
например колебания температуры или механическая вибрация,
могут вывести кубит из состояния суперпозиции и вернуть в одно
из базисных состояний. Это явление называется декогеренцией. Неустойчивость – главное препятствие на пути конструирования больших и надежных квантовых компьютеров. В частности, в процессе
измерения когерентность кубита нарушается, и он оказывается
в наблюдаемом базисном состоянии. По той же причине кубит нельзя скопировать, т. к. для этого необходимо наблюдение.
Если вам трудно воспринять идею коэффициента, являющегося
комплексным числом, то, возможно, поможет следующее объяснение. Представьте точку (a,b) в декартовой системе координат. Отрезок прямой, соединяющий начало координат (0,0) с точкой (a,b), – это
вектор. У него есть модуль и направление. В случае суперпозиции
двух состояний эти векторы складываются по правилам аналитической геометрии, т. е. в точности так, как складываются комплексные
числа. Именно поэтому вероятности и представляются комплексными числами. После сложения векторов коэффициенты необходимо
перенормировать, чтобы было выполнено условие |α|2 + |β|2 = 1. Перенормировку можно устранить, если α и β описываются в терминах
углов с применением тригонометрических формул для суммы и разности углов.
Над кубитами можно производить элементарные логические операции и таким образом строить квантовые схемы. Примером может
служить условная функция НЕ, CNOT, применяемая к двухбитовым
кубитам |xy〉. CNOT определена как |xy〉, если x = 0, и |xy'〉, если x = 1.
Иными словами, первый бит не изменяется, а второй вычисляется
как ИСКЛЮЧАЮЩЕЕ ИЛИ обоих битов.

18.2 Квантовая запутанность
Помимо суперпозиции, у частиц есть еще одно квантово-механическое свойство – запутанность. Группа частиц называется запутанной, если имеется корреляция между каким-то свойством одной
частицы и таким же свойством другой. Например, у электронов есть
свойство спин. Спины нескольких частиц относительно определенной оси, например оси x, могут быть коррелированы. Также запутанной может быть поляризация в группе фотонов. Запутанность может

Исправление ошибок

349

сохраняться, даже когда частицы удалены друг от друга на большое
расстояние. Поэтому запутанность можно использовать для связи.
Процесс начинается созданием запутанной пары частиц. Один
из способов добиться этого – пропустить лазерный луч через крис­
талл специального типа. В результате часть высокоэнергетических
фотонов расщепляется на пару низкоэнергетических фотонов. Некоторые из таких фотонных пар будут запутаны, хотя выход очень
низкий, порядка одного на миллиард. Следующий шаг – доставить
эти запутанные фотоны туда, где Сандра и Рива будут заниматься
передачей и приемом. На большие расстояния фотоны обычно передаются по волоконно-оптическому кабелю, хотя можно переместить
их и физически, используя дефекты кристаллической решетки.
Когда Сандра будет готова отправить сообщение, она организует
взаимодействие своего фотона со специального подготовленными
дополнительными фотонами, которые называются анциллами. В результате взаимодействия ее фотон переходит в желаемое состояние,
которое она хочет передать. Это приводит к тому, что запутанный
фотон, который может быть удален на много километров, переходит в дополнительное состояние. Распространено предположение,
что это происходит мгновенно, но на самом деле изменение распространяется со скоростью света. Информация не может передаваться
мгновенно, что бы ни писали на эту тему поколения фантастов.
Наконец, Рива измеряет свой запутанный фотон и определяет
однобитовое сообщение – или не определяет, поскольку это вероятный процесс. Иногда это называют квантовой телепортацией, но
этот термин употребляется учеными, которые в детстве перечитали слишком много научной фантастики. Предполагается, что такая
связь защищена от прослушивания, потому что если Эмили измерит
фотон, он подвергнется декогеренции, и Сандра с Ривой смогут это
обнаружить.
Но в этом рассуждении есть два изъяна. (1) Эмили может быть все
равно, обнаружили подслушивание или нет. Коль скоро она заполучила информацию, уже не важно, знают ли Сандра и Рива о том, что
она знает. (2) Целью Эмили может быть не сбор информации, а нарушение связи. Эмили, возможно, не узнает планов боя, но их не узна­
ет и Рива. На самом деле если Сандра и Рива обнаружат, что Эмили
подслушивает, то, наверное, станут использовать квантовый канал
связи реже, что Эмили вполне устраивает.

18.3 Исправление ошибок
Поскольку квантовые события имеют вероятностный характер, час­
тота ошибок у квантовых компьютеров гораздо выше, чем у традиционных. Поэтому необходимы средства обнаружения и исправления ошибок. Для классических компьютеров существуют коды,

350

Глава 18

Квантовые компьютеры

обнаруживающие и исправляющие ошибки. В них для обнаружения
ошибок используются дополнительные биты, например к каждому байту можно добавить бит четности, который обычно равен результату применения ИСКЛЮЧАЮЩЕГО ИЛИ ко всем восьми битам
данных. При таком определении результирующий 9-битовый байт
всегда должен быть четным. Если он оказался нечетным, значит,
произошла ошибка, но в каком именно бите, неизвестно.
Для традиционных компьютеров простейший код, исправляющий ошибки, – код «2 из 3». Имеется три копии каждого бита. Если
произошла ошибка в одном бите, то значения двух его копий будут
правильны. Если шанс ошибки в одном бите равен, скажем, 1 к 107, то
такое использование мажоритарного значения снижает вероятность
ошибки до 3 к 1014 – существенное улучшение. Использовать 3 бита
для представления одного дорого, но есть несколько алгоритмов
кодирования, например коды Хэмминга и сверточные коды, требующие меньшего числа дополнительных битов, причем некоторые
коды могут обнаруживать и исправлять ошибки в нескольких битах.
Безошибочность связи – непременное условие в современной криптографии, где изменение даже одного бита может сделать сообщение не поддающимся расшифровке.
Такого типа обнаружение и исправление ошибок в квантовых
компьютерах невозможны. Эти коды предполагают возможность
скопировать значение бита и проверить четность. С кубитами это
не пройдет, потому что измерение его значения приводит к декогеренции. Попытки реализовать проверку квантовых ошибок обычно опираются на использование дополнительных кубитов. Кубиты,
предназначенные для обнаружения и исправления ошибок, расположены вместе с информационными кубитами в плоской решетке.
Все это вместе называется поверхностным кодом.
В настоящее время квантовая коррекция ошибок – всего лишь
теория. Еще никому не удалось построить реальное устройство. Необходимость в дополнительных битах исправления ошибок резко
увеличивает число кубитов в практически полезном квантовом компьютере. Поскольку частота квантовых ошибок велика, до создания
реальных квантовых компьютеров, по-видимому, еще очень далеко.
Помните об этом, читая описания различных квантовых алгоритмов
в последующих разделах.

18.4 Измерение
Измерить поляризацию фотона – дело непростое. Задумайтесь, как
вы стали бы измерять поляризацию светового луча. Вы пропус­тили
бы луч через поляризационный фильтр и наблюдали бы его яркость.
Затем начали бы медленно вращать фильтр, пока яркость прошедшего через него света не достигла бы максимума. В этот момент

Квантовый трехэтапный протокол

351

фильтр совмещен с поляризацией луча, и угол его поворота можно
измерить.
Но у Ривы такой возможности нет. Она имеет дело всего с одним
фотоном. Он проходит через ее фильтр или кристалл, и она либо детектирует вспышку, либо нет. Если ее фильтр ориентирован не так
же, как излучатель Сандры, то шансы получить такое же состояние,
как у Сандры, зависят от относительного угла. Например, если ее детектор повернут на 90º относительно излучателя Сандры, то у нее
ровно 50 % шансов получить такое же значение кубита.
Сандра может решить проблему, отправив сразу пачку фотонов.
Рива может пропустить эти фотоны через различные фильтры и измерить яркость каждого образца с по­мощью фотодетектора и вольт­
метра и точно вычислить угол поляризации. Далее она производит
измерения при таком угле и с очень высокой вероятностью получает
то же базисное состояние, что у Сандры. Возможность использовать
квантовые компьютеры в криптографии в конечном счете зависит
от способности различать мельчайшие градации поляризации.

18.5 Квантовый трехэтапный протокол
Мы подготовили сцену для трехэтапного квантового протокола, который в 2006 году предложил Субхаш Как из Оклахомского университета в Стиллуотере. Трехэтапный протокол Кака основан на той же
схеме с тремя сообщениями, что и другие трехпроходные алгоритмы, рассмотренные в разделах 16.1, 16.2 и 16.4. В квантовой версии
операция шифрования – это поворот поляризации на случайный
угол вокруг выбранной пространственной оси. Сандра и Рива должны согласовать ось, в противном случае повороты не будут коммутировать. (1) Сандра отправляет фотон, повернутый на ее случайный угол φ, (2) Рива поворачивает фотон на свой секретный угол ψ
и отправляет Сандре фотон, повернутый на угол φ + ψ, (3) Сандра
поворачивает фотон в обратном направлении на угол –φ и отправляет Риве фотон, повернутый на ее угол ψ. Рива снимает этот поворот и читает кубит. Попытавшись измерить любой из повернутых
кубитов, Эмили не будет знать, правильный ли угол установлен в ее
детекторе, а значит, не будет знать вероятность получения правильного значения.
Применяя этот метод, Сандра и Рива должны часто изменять
свои углы, желательно для каждого бита. В противном случае Эмили сможет просто выбирать случайный угол и пытаться читать
каждое сообщение. Если выбранный ей угол близок к правильному, то она будет получать правильные значения 80, а то 90 % бит.
Этого может хватить для прочтения сообщения. Если повезет, она
сможет прочитать примерно 25 % сообщений. Отметим, что угол,
отличающийся от истинного на 180º, тоже устроит Эмили, потому

352

Глава 18

Квантовые компьютеры

что так она получит от 80 % до 90 % инвертированных битов – тоже
неплохо.

18.6 Квантовое распределение ключей
Существуют алгоритмы квантового распределения ключей, аналогичные алгоритму Диффи–Хеллмана. Самый известный из них –
BB84, названный по именам авторов, Чарльза Х. Беннета из IBM
Research и Жиля Брассара из Монреальского университета. В алгоритме используется 4 кубита, которые позволяют обнаруживать
и исправлять ошибки из-за шума в канале связи. Возмущения, привносимые Эмили, рассматриваются как дополнительный шум в канале, поэтому не нуждаются ни в обнаружении, ни в исправлении.
Из этой работы вытекает, что несколько слабо запутанных частиц
можно скомбинировать и получить меньшее число сильно запутанных частиц.

18.7 Алгоритм Гровера
Криптографический алгоритм Гровера, предназначенный для вскрытия блочных шифров с секретным ключом, в частности DES и AES, на
квантовых компьютерах, разработал в 1996 году Лов Кумар Гровер
из Bell Labs на основе собственного алгоритма квантового поиска
в файле. В нем каждое вычисление функции шифрования рассмат­
ривается как один доступ для чтения неотсортированной базы данных. Алгоритм уменьшает ожидаемое число вычислений с K до K,
где K – число возможных ключей. По сути дела, размер ключа уменьшается с n до n/2 бит.
Алгоритм Гровера с высокой вероятностью находит ключ k, для
которого E(k,p) = c, где E – функция шифрования, p – открытый текст,
а c – шифртекст. Алгоритм требует один блок известного открытого
текста для каждого такого ключа. Специалист по квантовой физике,
мало что знающий о криптографии, может сделать вывод, что для
защиты от алгоритма Гровера нужно просто удвоить размеры всех
криптографических ключей. Но это было бы неэффективно, потому
что пришлось бы увеличить количество раундов блочного шифра.
Например, в AES со 128-битовым ключом используется 10 раундов,
а в AES с 256-битовым ключом – 14 раундов.
Более дешевая альтернатива – расширить ключи, добавив до
и после основного шифрования какой-нибудь простой и быстрый
шифр, например простую подстановку. Ключи для перемешивания двух простых алфавитов подстановки могут достигать 1684 бит
каждый (см. раздел 5.2), поскольку число перестановок каждого алфавита равно 256!, что близко к 21684. Простая перестановка также

353

Уравнения

может увеличить размер ключа, но не так существенно, потому что
16! приближенно равно всего 244. Если вы решите воспользоваться
перестановкой, то можете переставлять блоки по два за раз, потому
что 32! приближенно равно 2118, т. е. размер ключа увеличивается
намного.
Читатели этой книги наверняка поняли, что алгоритм Гровера
можно обмануть такими элементарными приемами, как использование null-символов, использование разных ключей для каждого
блока, сцепление блоков или сжатие сообщения. Это значит, что если
предпослать блочному шифру сжатие, например перемешанный код
Хаффмана (раздел 4.2.1), то обе цели – увеличение ключа и сжатие –
будут достигнуты одновременно. Недостаток перемешанного кода
Хаффмана в том, что он изменяет размер блока. Пожалуй, лучше
использовать подстановку Хаффмана (раздел 10.4) или Поста (раздел 10.5) до и после блочного шифра.

18.8 Уравнения
Прежде чем обсуждать следующую тему, квантовую имитацию отжига, нужно сказать несколько слов об уравнениях. Многие шифры
можно выразить в виде системы уравнений. Шифр Беласо можно
записать в виде C = P + K, где C – шифртекст, P – открытый текст,
а K – ключ; все целые числа по модулю 26. Шифр Хилла – это система
линейных уравнений. Шифры Плейфера и Two-Square можно выразить как уравнения в пятеричной системе счисления.

18.8.1 Перестановки
Перестановки легко записываются в виде систем равенств. Например, столбцовую перестановку
E X A
M P L
E

Открытый текст:
Шифртекст:

EXAMPLE
EMEXPAL

можно выразить в виде c1 = m1, c2 = m4, c3 = m7, c4 = m2, c5 = m5, c6 =
m3, c7 = m6, где mi – символы открытого текста, а cj – символы шифр­
текста.
Логические функции можно преобразовать в числовые уравнения
следующим образом:
not x → 1–x
x or y → x+y–xy
x and y → xy
x xor y → x+y–2xy

Глава 18

354

Квантовые компьютеры

18.8.2 Подстановки
Подстановки можно привести к форме уравнения с по­мощью трехшагового процесса. Сначала представим каждый бит шифртекста
булевым выражением, содержащим биты ключа и открытого текста.
Например, рассмотрим следующую подстановку, которая принимает однобитовый ключ K и двухбитовый открытый текст AB и порождает двухбитовый шифртекст XY.
K
0
0
0
0
1
1
1
1

AB
00
01
10
11
00
01
10
11

XY
01
11
00
01
10
00
10
11

Булевы входы
– ––
KAB
––
KAB
– –
K AB

K AB
––
KA B

KA B

KAB
KAB

–––
––
Здесь K A B означает K = 0, A = 0 и B = 0, K A B – K = 0, A = 0 и B = 1
––
и т. д. Бит шифртекста X теперь можно записать в виде X = K A B +
––

KA B + KAB + KAB. Аналогичное выражение можно выписать для Y.

18.8.3 Карты Карно
Карты Карно используются для приведения, или упрощения, этих
выражений. Это второй шаг. Идея принадлежит Морису Карно из
Bell Labs, высказавшему ее в 1953 году, и заключается в том, чтобы изобразить множество всех возможных n-битовых входов в виде
n-мерного куба 2×2×2×...×2. Закрасим каждую ячейку, в которой выходной бит равен 1. Ниже показана карта для выходного бита X. Аналогичную карту можно построить для Y.
AB

AB

AB

AB

K
K

Обратите внимание, как обозначены столбцы в этой карте. При
переходе от одной ячейки к другой слева направо на каждом шаге
изменяется только один бит, это относится даже к переходу от столбца 4 к столбцу 1. Такая конфигурация называется кодом Грэя. Коды
Грэя были предложены Фрэнком Грэем из Bell Labs в 1947 году. Код
Грэя легко построить, дописывая по одному биту. Например, чтобы расширить этот 2-битовый код Грэя до 3-битового, мы сначала
–– –

выпишем четыре пары A, B в порядке A B , AB , AB, A B и допишем

Уравнения

355


C в конец каждой пары, а затем выпишем те же пары, но инвертированные, и допишем в конец каждой C. Бит C изменяется всего два
раза, после четвертой и после восьмой группы.
Визуально карты Карно позволяют оптимизировать логику, когда
число битов не превышает 6, три по горизонтали и три по вертикали, для чего строится карта 8×8. Когда число битов больше 6, лучше
написать программу. На каждом шаге добавляется наибольший прямоугольный блок, который умещается в закрашенную область и покрывает хотя бы одну новую ячейку, которая не была покрыта ранее.
Каждое измерение блока должно быть степенью 2, поэтому его объем также будет степенью 2. Если имеется несколько блоков максимального размера, то выбирается тот, который покрывает наибольшее число еще не покрытых ячеек. Так продолжается, пока не будут
закрашены все ячейки.
В примере с K, A, B имеется два блока 1×2 в закрашенной обла–
сти, KA и KB . Каждый покрывает две ячейки. Поскольку вместе они
покрывают 3 ячейки, необходимы оба. Для покрытия остается толь–
ко ячейка KAB . Поэтому приведенное выражение для X имеет вид


KA + KB + KAB .
Третий шаг выражения подстановки в виде системы уравнений
заключается в том, чтобы заменить функции and, or и not в этих
выражениях арифметическими выражениями, следуя сформулированным выше правилам.

18.8.4 Промежуточные переменные
Если мы попытаемся записать каждый бит шифртекста в сложном
блочном шифре типа AES одним выражением, то размер этого выражения будет экспоненциально возрастать с каждым следующим
раундом. Иногда эту проблему называют причиной, по которой невозможно использовать уравнения для вскрытия блочных шифров.
Чушь собачья. Эту проблему можно устранить с по­мощью промежуточных переменных. Будем считать выходы каждого раунда отдельным набором переменных.
Входы первого раунда – ключ, открытый текст и вектор(ы) сцеп­
ления – это независимые переменные. Любой из этих битов может
изменяться независимо от остальных. Выходы каждого раунда или
каждого этапа внутри раунда – зависимые переменные. К ним относятся и векторы сцепления для следующего блока. Их значения
полностью определены значениями независимых переменных. Невозможно изменить один из этих битов, не изменив никакую другую
переменную.

18.8.5 Известный открытый текст
Предположим, что Эмили располагает каким-то объемом открытого текста. Для простоты пусть это будет n-битовый блок сообщения.

356

Глава 18

Квантовые компьютеры

Ее цель – воспользовавшись известным открытым текстом и перехваченным шифртекстом, определить ключ. Допустим, что Эмили
нашла выражение каждого бита шифртекста в терминах открытого
текста, ключа и, возможно, вектора сцепления. Обозначим Ei выражение i-го бита, и пусть ci – i-й бит шифртекста. Для любого ключа K
Эмили может измерить различие между шифртекстом, который получился бы при шифровании известного открытого текста ключом K,
и перехваченным шифртекстом. Для этого она вычисляет функцию
D(K) = (E1–c1)2 + (E2–c2)2 + (E3–c3)2 + ... + (En–cn)2.
Если найден правильный ключ, то D(K) будет равно 0. Здесь D(K)
называется целевой функцией, или просто оценкой.

18.9 Минимизация
Введение целевой функции превращает задачу нахождения правильного ключа в задачу минимизации. Цель – минимизировать
значение функции D(K). Квантовые компьютеры работают, потому
что квантовая система всегда стремится перейти в состояние с наименьшей энергией. Если квантовый компьютер можно сконфигурировать так, что кубиты или группы кубитов представляют значения
переменных, а энергия системы соответствует значению целевой
функции, то состояние с наименьшей энергией будет соответствовать минимуму целевой функции. Если такая конфигурация достижима, то квантовые компьютеры смогут решать широкий спектр
реальных задач, в т. ч. вскрывать шифры.
Начнем с того, что заменим биты ключа вещественными числами.
В конечном итоге они должны принять значения 0 или 1, но удобно
на время поиска допустить и другие значения переменных. Зададим
начальные значения, например положим все биты равными 0.5 или
каким-то случайным значениям в диапазоне от 0 до 1, а затем будем
изменять их, стараясь уменьшить величину D(K) и довести ее до 0.
Для традиционных компьютеров разработано много методов оптимизации, но мы рассмотрим только три. При попытке применить
эти алгоритмы к поиску криптографических ключей потребуется
большой объем известного открытого текста. Как минимум его размер должен в три раза превышать размер ключа.

18.9.1 Восхождение на вершину
Метод восхождения на вершину, называемый также методом наискорейшего спуска или градиентным методом, – один из самых старых методов оптимизации. Идея заключается в том, чтобы, начав
с какой-то точки P1, рассмотреть несколько случайных точек, уда-

357

Минимизация

ленных от нее на одно и то же расстояние. Из них выберем точку P2,
которая дает наибольшее улучшение – в данном случае наименьшее
значение D(K). Затем уточним направление, для чего рассмотрим
случайные точки в окрестности P­. Расстояния от P2 до любой из этих
точек будут значительно меньше, чем от P1 до P2. Назовем следующую точку P3. Прямая, соединяющая P1 и P3, определяет направление
поиска. Наконец, найдем на этой прямой точку P4, доставляющую
минимум D(K). Поиск повторяется с P4 в качестве начальной точки.
В процессе поиска величины шагов при переходе от Pi к Pi+1 увеличиваются всякий раз, как обнаружено улучшение, и уменьшаются, если
улучшения не было.
Такой поиск хорошо работает, если форма пространства поиска
напоминает одиночную гору в n-мерном пространстве или одну высокую гору, окруженную большим числом более низких вершин. Но
может потерпеть полный провал, если топография более сложная,
т. е. изобилует локальными минимумами. На рисунке ниже чем темнее цвет, тем лучше оценка.

P1

P2

P3

P4

18.9.2 Тысяча вершин
Тысяча вершин – идея, которую я использовал, чтобы набрать победные баллы в различных конкурсах головоломок, в которых принимал
участие в 1970-х годах. Позже я принялся было за написание статьи
для компьютерных журналов с подробным описанием этого метода
поиска, но погряз в деталях, пытаясь охарактеризовать типы целевых функций, для которых он оказывается лучше других методов.
В 1990-х годах метод был открыт заново под названием рой частиц.
Изобразим пространство поиска как горную гряду с большим
числом пиков, долин и хребтов. Теперь представим себе эскадрилью самолетов, которые летят над местностью и сбрасывают сотни
альпинистов на парашютах. Иными словами, начальных точек будет
много, все они исследуются одновременно. Альпинисты разглядывают ближайшие точки и оценивают, выше они или ниже. Есть два
варианта действий. (1) Можно брать только лучшую из этих точек

358

Глава 18

Квантовые компьютеры

и двигаться туда. Если лучших точек нет, уменьшаем размер шага
и пробуем снова. Если, скажем, три попытки подряд завершились
неудачно, то сбрасываем нового альпиниста, который начнет со
случайной точки. (2) Сохранять несколько точек, для которых зафиксировано улучшение. Можно считать, что команда альпинистов
разделилась на несколько партий, исследующих разные маршруты.
Лучше не брать все улучшающие оценку решения, потому что тогда
все альпинисты быстро соберутся в немногих районах.

Первоначально я хотел хранить все решения в пирамидальной
структуре, так чтобы на вершине всегда оказывалось худшее решение. Тогда нужно взять его и попытаться улучшить. Но это оказалось
неэффективно, потому что много времени тратилось на улучшение
плохих решений, которые в конечном итоге отбрасывались. Если,
наоборот, всегда выбирать наилучшее решение, то все альпинисты
соберутся на одной вершине. Лучшая стратегия – выбирать следующего альпиниста случайным образом. Аналогично, когда имеется
несколько улучшающих оценку решений, не всегда выгодно выбирать из них наилучшее. Иногда лучше выбрать какое-то из них случайно.

18.9.3 Имитация отжига
Имитация отжига – популярный метод оптимизации, в основном
потому что легко реализуется. Мы начинаем со случайной точки
в пространстве поиска и рассматриваем точку поблизости от нее.
Если это решение оказывается лучше, то мы переходим в новую точку с вероятностью B, а если хуже – то с вероятностью W.
Главная особенность имитации отжига в том, что эти вероятности
изменяются в процессе поиска. Первоначально вероятности отвергнуть хорошее решение или принять плохое задаются довольно высокими, скажем отвергать 40 % лучших решений и принимать 30 %

Минимизация

359

худших, т. е. B = 0.6 и W = 0.3. С течением времени, скажем после
1000 шагов, вероятность отвергнуть хорошее решение уменьшается. Например, на втором этапе можно отвергать 20 % лучших решений и принимать 15 % худших. Спустя еще некоторое время, скажем
пос­ле 2000 шагов, мы будем отвергать только 10 % лучших решений
и принимать 7 % худших.
Этот процесс называется имитацией отжига, потому что напоминает процесс отжига, применяемый в металлургии, когда металл
сначала раскаляется, а затем медленно охлаждается. При этом изменяется кристаллическая структура металла, в результате чего уменьшается твердость, но увеличиваются пластичность и ковкость, так
что он легче поддается обработке. При имитации отжига начальные
высокие вероятности отбрасывания лучших решений и принятия
худших аналогичны начальной высокой температуре металла, а постепенное уменьшение этих вероятностей – его медленному охлаж­
дению. В описаниях метода имитации отжига этапы пошагового
изменения вероятностей часто называют уменьшением температуры. Хочу дать несколько советов, основанных на моем собственном
опыте работы с имитацией отжига.
„„ Не имеет смысла продвигаться слишком медленно. Будет напрасной тратой времени сначала отвергать 40 % лучших решений, затем 39 %, потом 38 % и т. д. На каждом этапе частота
принятия/отбрасывания должна составлять от 1/2 до 2/3 предыдущей частоты. Например, 40 % на первом этапе, затем 20 %,
10 %, 5% и 3%. Или 40 % на первом этапе, потом 25 %, 15 %, 10 %,
6 %, 4 % и, наконец, 2.5%.
„„ Пяти этапов обычно достаточно.
„„ Не стоит начинать с частоты принятия 50 %. Выбирайте начальное значение между 60 % и 75 %.
„„ Не стоит доходить до 0 %. Улучшение будет более значимым,
если на последнем этапе принимается от 2 % до 3 % худших решений.
„„ Останавливайтесь, когда ничего не происходит. Возможно, вы
планировали 1000 попыток на каждом этапе, но если после
100 попыток изменения прекратились, останавливайтесь.
„„ Процент лучше делать зависящим от величины улучшения. Например, на первом этапе можно принимать 60 % изменений,
улучшающих оценку на 1 %, 75 % изменений, улучшающих
оценку на 2%, и 90 % изменений, улучшающих оценку на 3 %
и более.
„„ Экспериментируйте. Все задачи оптимизации различны. Пробуйте варьировать количество этапов, количество попыток
на каждом этапе, темп изменения вероятностей, размер шага
и связь между степенью улучшения и процентной долей принятия лучших решений.
Методы восхождения на вершину, тысячи вершин и имитации отжига можно комбинировать между собой.

360

Глава18

Квантовые компьютеры

18.10 Квантовая имитация отжига
Для квантовых компьютеров предложено несколько методов имитации отжига. В них используются такие квантовые явления, как суперпозиция, чтобы выполнять много операций поиска параллельно.
Однако в каждой попытке требуется вычислять целевую функцию
в выбранной точке. Квантовые компьютеры не предназначены для
вычисления выражений. На данный момент не существует способов
параллельного вычисления этих функций квантовыми средствами.
Квантовый компьютер может обращаться за этим к обычному, но
тогда утрачивается параллелизм. Пока что квантовый поиск не продемонстрировал никакого ускорения по сравнению с поиском на
традиционных компьютерах.

18.11 Квантовая факторизация
Само существование криптосистемы RSA с открытым ключом опирается на трудность факторизации больших целых чисел. Два больших целых числа A и B легко перемножить и найти произведение AB,
но обратить этот процесс и найти множители большого целого числа очень трудно. Трудность факторизации большого числа сравнима с трудностью вычисления дискретного логарифма (раздел 16.3),
и для решения обеих задач используются сходные методы.
Эту безопасность потенциально может поставить под сомнение
алгоритм Шора факторизации больших чисел. Исторически это
первый квантовый алгоритм, он был предложен Питером Шором
из MIT в 1994 году. Если его удастся успешно реализовать, то либо
от RSA придется отказываться, либо значительно увеличивать размер модуля, быть может, до миллионов битов. На данный момент
с по­мощью алгоритма Шора удалось факторизовать число 15 = 3×5
в 2001 го­ду и число 21 = 3×7 в 2012 году. Такими темпами можно
ожидать, что где-то в 2023 году будет разложено на множители число
35 = 5×7. Но юмор в сторону, могут пройти еще десятилетия, прежде
чем алгоритм Шора станет реальной угрозой безопасности RSA.

18.12 Ультракомпьютеры
Квантовые компьютеры не предназначены для вычисления выражений – сегодня. Но давайте предположим, что это всего лишь техническая проблема. Допустим, что со временем появятся гибридные
компьютеры, объединяющие вычислительную мощь суперкомпьютеров с параллелизмом квантовых компьютеров. Будем называть их
ультракомпьютерами.

Ультракомпьютеры

361

Какие действия может предпринять Сандра сегодня, чтобы во всеоружии встретить час, когда у Эмили появится ультракомпьютер?
Кое-какие идеи можно почерпнуть из способа, которым мы обошли
алгоритм Гровера (раздел 18.6). Мы увеличили размер ключа, чтобы
выйти за пределы возможностей этого алгоритма. Это можно повторить и для ультракомпьютеров. Можно увеличить количество неизвестных, так что предполагаемой мощности ультракомпьютера не
хватит для их нахождения. Рассмотрим два аспекта этого подхода:
подстановку и генерирование случайных чисел.
Этим алгоритмам понадобятся очень большие ключи шифрования. Просто примем на веру, что в будущем мире, где существуют
ультракомпьютеры, работать с такими ключами станет возможно.

18.12.1 Подстановка
Если подстановка не определена каким-то математическим правилом, то для ее определения нужна таблица подстановки. Все элементы этой таблицы известны Сандре, но неизвестны Эмили. Каждый
элемент можно рассматривать как математическую переменную.
В начальный момент все переменные могут иметь произвольные
значения. Если Эмили сможет узнать какие-то из них, то множество
возможных значений остальных переменных сужается, но первоначально вместо любого символа можно подставить любой другой.
Цель Сандры – превзойти возможности ультракомпьютера. В многоалфавитном шифре общего вида размер таблицы алфавитов равен
26×26 при ручном использовании и 256×256 для компьютера. Таким
образом, число неизвестных равно 216 = 65 536. Но нет никаких причин ограничиваться таблицей с 256 строками. Если у Эмили имеется ультракомпьютер, то логично предположить, что и у Сандры есть
быст­рый компьютер с большой памятью. Сандра могла бы использовать таблицу алфавитов с 1024 строками с 10-битовыми ключами,
или 4096 строками с 12-битовыми ключами, или даже с 65 536 строками с 16-битовыми ключами. Это потребовало бы 224 = 16 777 216 байт
внутренней памяти для хранения таблицы подстановки, что вполне
доступно современным персональным компьютерам. К тому же использование 16-битового ключа для 8-битовой подстановки дает
весьма желательную избыточность. Назовем таблицу алфавитов
с 224 элементами Tab24. В каждой строке Tab24 хранится отдельный
ключ перемешивания. Если его длина равна 256 битам, то вся таблица занимает 256×65536 = 16 777 216 бит – таков размер ключа шифра.
Сандра также вполне в состоянии использовать полную таблицу биграмм. Для хранения таблицы биграмм 256×256 с 8-битовым
ключом для выбора строки (фактически слоя) потребовалось бы 225 =
33 554 432 байта внутренней памяти. И это практически возможно
даже сегодня. Но если бы таблица имела 65 536 слоев, а длина каждого ключа составляла 16 бит, то понадобился бы гораздо более мощный компьютер.

362

Глава 18

Квантовые компьютеры

Вспомним, однако, что эти таблицы подстановки должны храниться в секрете и быть абсолютно случайными. Даже если они генерируются каким-то алгоритмом, определение начального состоя­
ния и параметров генератора должно выходить далеко за пределы
возможностей ультракомпьютера Эмили. Некоторые подходящие
методы см. в разделе 13.13.

18.12.2 Случайные числа
Методы из раздела 13.13 – неплохое начало, но чтобы создать генератор псевдослучайных чисел, способный противостоять ультракомпьютеру, мы объединим идею генератора выбора из раздела 13.11
с техникой обновления генератора из раздела 13.15.
В ультрагенераторе UG используется три массива, A, B и C. Массивы A и B содержат по 65 536 элементов – 24-битовых целых чисел.
Массив C содержит 224 = 16 777 216 8-битовых целых чисел. Все три
массива можно инициализировать по фотографиям природы, как
описано в разделе 13.14.2. У Сандры и Ривы должны быть одинаковые массивы. Генератор порождает 8-битовый выход в каждом цик­
ле. Цикл n состоит из следующих шагов:
1 вычислить x = (An + An–103 + An–1071) mod 16777216 и заменить An
на x;
2 вычислить x = x mod 65536 и положить y = Bx.
Выходом ультрагенератора UG в этом цикле будет Cy;
3 заменить Bx на (Bx + Bx–573 + Bx–2604) mod 16777216;
4 заменить Cy на (Cy + Cy–249 + Cy–16774) mod 256.
Индексы вычисляются по модулю 65536 или 16777216. В величинах запаздываний 103, 1071, ..., 16774 нет ничего специального. Я не
проверял, порождают ли эти индексы особенно длинные периоды.
Когда начальные массивы так велики, даже вырожденные периоды
будут очень длинными. Можно использовать любые комбинирующие функции из раздела 13.1, например madd, или суммирование
с запаздыванием, описанное в разделе 13.14.1.
Для обновления этих случайных чисел обоих методов из раздела 13.14 по отдельности недостаточно, если у противника имеется
ультракомпьютер, но их можно объединить и таким образом получить стойкую функцию обновления. При каждом обновлении понадобится новый случайный массив R, содержащий 65536 или больше
24-битовых целых. Обозначим LA, LB, LC, LR длины массивов A, B, C, R.
Шаг 1. Объединить R с A, B и C.
Заменить An на (An + Rn) mod 16777216 для n = 1, 2, 3, ..., LA.
Заменить Bn на (Bn + Rn) mod 16777216 для n = 1, 2, 3, ..., LB.
Заменить Can на (Can + Rn) mod 256 для n = 1, 2, 3, ..., LR.

Ультракомпьютеры

363

Здесь a = ⌊LC /LR⌋ – 1. Здесь ⌊LC/LR⌋ (читается «целая часть» или
«пол» LC /LR) обозначает наибольшее целое число, не превосходящее
LC /LR. Например, ⌊8/3⌋ = 2, а ⌊9/3⌋ = 3. Смысл использования Can вместо
Cn – равномерно «размазать» байты R по массиву C.

Шаг 2. Распространить изменения.
Заменить An на (An + An–229 + An–6141) mod 16777216 для n = 1, 2, 3, ..., LA.
Заменить Bn на (Bn + Bn–503 + Bn–3829) mod 16777216 для n = 1, 2, 3, ..., LB.
Заменить Cn на (Cn + Cn–754 + Cn–25887) mod 256 для n = 1, 2, 3, ..., LC.

Эти 2 шага следует повторить 3 или более раз. Как обычно, индексы заворачивают по достижении конца.
Кстати говоря, не требуется, чтобы длина массива C была степенью 2. LC, к примеру, могла бы быть равна 77777777, и тогда массивы A, B и R должны были бы содержать целые по модулю 77777777,
а в вычислениях выше модуль 16777216 следовало бы заменить на
77777777. Единственные ограничения на величину LC – сколько памяти вы готовы выделить и практические проблемы с распределением такого большого ключа.
Оба метода, подстановку и генерирование случайных чисел,
можно объединить и получить тем самым сколько угодно блочных
и потоковых шифров, которые устоят против ультракомпьютеров.
В следующих двух разделах приведено по одному примеру шифра
каждого типа.

18.12.3 Ультраподстановочный шифр US-A
При написании этого раздела я испытывал сильное искушение задать гигантский размер блока, скажем 65 536 или даже 16 777 216. Но
из того, что криптография должна измениться в эру ультракомпьютеров, еще не следует, что изменятся и типы сообщений. Сообщения длиной менее 100 символов по-прежнему будут в ходу, и было
бы крайне неэффективно дополнять их до размера 65 536 или более
байт.
Назовем пример ультраподстановочного шифра US-A. Этот шифр
работает с блоками длиной 32 байта, или 256 бит. Каждый блок можно рассматривать либо как 32 отдельных байта, либо как битовый
массив 16×16. В шифре US-A 15 раундов, состоящих из трех этапов:
подстановка, перестановка строк и транспонирование массива. По
завершении всех раундов выполняется заключительный шаг подстановки.
На всех 16 шагах подстановки используется таблица подстановки
Tab24, в которой должно храниться 16 бит ключа для каждого символа, а всего 16×32 = 512 бит на раунд или 8192 бита для 15 раундов плюс заключительная подстановка. Вторым этапом каждого из

364

Глава 18

Квантовые компьютеры

15 раундов является перестановка каждой строки. Это может быть
простой циклический сдвиг строки, требующий всего 4 бит на строку, т. е. 64 бита на раунд, а всего 960 бит.
Более стойкий вариант перестановки битов – таблица перестановок, содержащая, скажем, 256 различных перестановок, например
перестановок по ключу (раздел 7.6). Каждая строка матрицы 16×16
переставляется отдельно. Каждая перестановка строки определяется 16 шестнадцатеричными цифрами. Например, цифры 5A3F1E940B2D68C7 означают, что первый бит перемещается в позицию 5, второй
бит – в позицию A, т. е. 10, и т. д. Перестановка каждой строки выбирается из таблицы с по­мощью 8-битового ключа, что требует 8×16 =
128 бит на раунд или 1920 бит на все 15 раундов.
Третий этап каждого раунда – транспонирование битового массива, т. е. перестановка бита в позиции (i, j) с битом в позиции (j, i). Это
описано в разделе 11.7, а быстрый метод транспонирования массива – в разделе 11.2.3. На этом этапе ключ не нужен.
Соберем все вместе. Шифр US-A требует 8192 бита для ключей
подстановки и, скажем, 1920 бит для перестановок с ключом – всего
10 112 бит ключа. Это гораздо меньше, чем 65 536 бит, необходимых,
чтобы противостоять ультракомпьютеру. Но не пугайтесь. Не забывайте, что для подстановки у нас есть таблица алфавитов Tab24, использующая 16 777 216 бит ключа для перемешивания своих 65 536
строк, не говоря уже о тех битах, которые использовались для перемешивания таблицы перестановки.
Ну, а чтобы еще укрепить шифр, я рекомендую использовать сцеп­
ление блоков в режиме PP (открытый текст с открытым текстом),
описанном в разделе 11.10.

18.12.4 Ультрапотоковый шифр US-B
Подстановку Tab24, описанную в разделе 18.11.1, и генератор псевдослучайных чисел из раздела 18.11.2 можно объединить, получив
тем самым невероятно стойкий шифр, который мы назовем US-B.
В этом шифре имеется предварительный шаг, который выполняется до шифрования и призван придать открытому тексту случайный
вид. Обозначим само сообщение M, а его длину LM. Предварительный шаг таков:
Mn заменяется на (Mn +19Mn–1 + 7Mn–16) mod 256 для n= 1, 2, 3, ..., LM+16.
Дополнительные 16 итераций с заворачиванием нужны для того,
чтобы перемешать первые 16 символов сообщения. Этот шаг не увеличивает криптостойкость, но мешает Эмили понять, что она нашла
правильный ключ.
Каждый 16-битовый ключ Kn генерируется из двух последовательных выходных байтов генератора случайных чисел, x и y, по формуле
256x + y. (Или можно хранить в массиве C 16-битовые целые, но за

Ультракомпьютеры

365

это придется расплачиваться удвоением объема потребной памяти.)
Ключ Kn используется для шифрования символа сообщения Mn в таб­
лице подстановки Tab24 символом Tab24(Kn,Mn). Иначе говоря, замена Mn берется из строки Kn таблицы алфавитов.
Вы, наверное, распознали в этом шифре многоалфавитный шифр
общего вида с большой таблицей алфавитов и случайным ключом.
Напомню, что по-французски многоалфавитный шифр называется
Le Chiffre Indéchiffrable1. Благодаря ультрагенератору UG многоалфавитный шифр US-B наконец-то стал и вправду недешифрируемым,
даже в эпоху ультракомпьютеров. Мы пришли к Невскрываемой
Криптографии.

1

Шифр, не поддающийся дешифрированию. – Прим. перев.

Развлечения
На рисунке ниже изображены четыре разных шифра, от S1 до S4.
Каждый шифр – простая одноалфавитная подстановка. Ваша задача – определить тип, например код Морзе, и затем вскрыть шифр.
Все открытые тексты написаны на стандартном английском языке,
заглавными буквами, без пробелов и знаков препинания. Длина текстов от 75 до 90 букв. Все тексты начинаются в левом верхнем углу.
Первые три шифра читаются слева направо по строкам. Последний
шифр читается по часовой стрелке вдоль границы.

Развлечения

367

Все методы описаны в этой книге. Отличается только визуальное
представление. Вам предстоит определить, какие факторы важны
в каждом шифре, например: высота, ширина, положение или цвет.
Можете отправлять свои ответы для получения признания, следуя
инструкциям, спрятанным где-то в книге.
Вот еще несколько головоломок, в которых используются шифры,
наиболее популярные среди любителей математических развлечений. Все тексты написаны на стандартном английском языке, встречается несколько имен собственных. По традиции, буквы объединены
в группы по пять, не обращая внимания на точки. Если хотите еще кучу
такого рода шифров, вступайте в Американскую ассоциацию криптограмм по адресу cryptogram.org. Можете отправлять свои ответы для
получения признания, следуя инструкциям, изложенным в открытом
виде, но спрятанным где-то в книге. Дополнительные криптограммы
можно найти по адресу www.contestcen.com/crypt.htm.

F1: Шифр Беласо (раздел 5.8.1)
HZRRJ GHEEM ZZHXU AYNLJ GYXCV LRRDL UMIEE PHMET PIPWA ELZOC
BNPBK SHSLV GQVLP AIVBM LVFLB RLOHX BNZUH MATSM LHVTL ZRH

F2: Шифр Виженера (раздел 5.8.2)
MGGAP AGXCD IFDAZ GZFSH OODAZ HGYBS HZNEB KBQAZ BBCGF ADRDZ
KDVXZ LFTYZ ZGYVW JVXUH MBYBN TLRLZ HGWJZ IJAAI EGUOD ADWAQ
ADAGS ADA

F3: Столбцовая перестановка (раздел 7.2)
DUSEL CQTNT ACNLH HLTME AEOEO RLRES TEHNT TAERW AEGLR EDAEE
TEYEH UBSHE OVAAE HRDCI INHWE SFTEA LYWIR TIIOT BITRD AEBRT
NATTT ENLRU HDHTE AE

F4: Шифр Плейфера (раздел 9.2)
EIWDU WJHYL BHFBK NWVKY TKHDE WVBXF GKTDB XXHIY DHNZT ZHDAR
HAYEG SLHXB CIDPH YEIWP

F5: Шифр Bifid (раздел 9.6)
Размер блока 7, тема – садоводство.
SZSAPNF RBHBKNV OAABCBI LFIOUUD IRFTPNZ SBLANBA GEPNEAX
ONNAMLB GFRMEUV LIMASUT BFUIEZM CBBRHTI LHROSVV ALSEOET
FHWBTXL UWRBIKL TUHTIEI IFIGOKP

F6: Одноразовый блокнот (глава 14)
Для каждой буквы сообщения генерируется случайное число. Если
число четное, то к букве прибавляется X по модулю 26, иначе прибавляется Y по модулю 26.

368

Развлечения
UVTUQ JYRMV GJVSI FTZEL YFIJV JVAVI JZETV YMJKF IGFEA RIZVK
DNRXK ZIJKI TRJXY NHRKV URSFL YWNKK PWNAV YLEUI JIDVF WXFLF

Конечно, одноразовый блокнот – не любительский шифр. Я включил его в главу «Развлечения», дабы показать, что некоторые шифры на основе одноразового блокнота на практике можно вскрыть.
Сумеете ли вы найти значения X и Y, не перебирая все 676 комбинаций?

f7: многоаЛфавитный шифр обЩего виДа (разДеЛ 5.9.3)
Чтобы было повеселее, в следующем примере взяты символы из нескольких языков общим числом больше 26. Однако каждый алфавит
состоит из 26 букв и сообщение написано на стандартном английском языке.

Задачи
Эти криптограммы представлены в виде задач для читателей. Метод
не раскрывается. Вы сами должны определить метод и решить криптограмму. Для решительного, мотивированного и знающего любителя приведенных сведений достаточно. Во всех случаях сообщение
написано на английском языке. Текст не содержит грамматических
и других ошибок. Я не прикладывал никаких специальных усилий,
чтобы исказить стандартные для английского языка частоты букв
и контактов.
Все шифры одношаговые. Методы не комбинируются, в частности
отсутствуют сочетания подстановки с перестановкой. Все эти шифры имеют оценку 3.

C1: задача 1
Этот шифр вскрывается с по­мощью карандаша и бумаги. Открытый текст содержит 250 заглавных букв без пробелов между словами
и знаком препинания.
LIUJE
OOKIP
ENAAC
GUTTO
VNSWE

IETOJ
AHOSA
OGNET
HTTRP
AOHES

TUUIL
GRHJO
JTGUA
HNCOH
TSSEV

PICLO
AHETB
FNMEE
OIEIO
OSAWY

RNETH
AUTTI
EHITR
AHETB
ITDPI

SEVWP
RAHTV
OAHET
ALCOW
CSLAU

GRHJS
NENAH
SHHNW
TJSEV
UIYFS

OIMTO
TTUTG
TJTOE
CMPIC
PMHNI

ETEPI
ICOSI
EGRHJ
SIYOF
OOSCA

CETBE
YHNFN
NETHT
SPMHN
RHTRR

C2: задача 2
Этот шифр можно решить вручную, но для работы с шестнадцатеричными числами проще прибегнуть к помощи компьютера. Открытый текст состоит из 200 символов в разных регистрах с пробелами и знаками препинания.

Задачи

370
4CB1BAB35A
F3C68DD25E
F06829B286
02F9C06553
8975CACF1B
4F55C4FCE4
F110E33D5D
F0C7BF2955

68C7BAA966
4F468653A6
8974E37F12
8879B6CF1C
8968E32D41
6AEA864F0E
6C49BAAB42
8BEBC4CDC2

6947C49FA6
F509C4B144
6F87BDA94F
8969B9B286
8969B6D246
B24696D0ED
6AF886495A
8954E3295B

F509C4B144
4F48864F04
8D3E24DCF1
F529BBAA46
0147CDFF12
0E4691D0ED
4F7424FCE1
4F4FBAB342

4F48864F03
8F6B537F01
F3F8E64D66
F247B014FE
8D35C9A94D
6C99536B01
8D2AE364ED
8879BAE64D

C3: задача 3
Этот шифр допускает ручное шифрование и дешифрирование. Открытый текст состоит из 180 заглавных букв без пробелов и знаков
препинания.
ZNQXI
CGQZI
AUMLP
TACSA

VAKSG
NHIRA
VZIQM
GUPKC

UZONV
NLTSD
XZRMJ
QKIIU

ALQPR
VGRXH
CXJKM
LTJFT

EMYNN
NQVBU
OMONN
QPZFB

WBXXS
EBORK
UXIPL
KVBUU

NPPYB DQPIP KSYEC RXKVE
IWOPK SWZIJ EMJTA YNVWD
JWESX CRMJT QRKBL TQVBL
V

Эпилог
В этой книге представлено примерно 140 разных шифров с бесчисленными вариациями. Некоторым читателям это может не понравиться. Ведь их, возможно, интересует только одно: «Какой шифр
мне больше всего подходит?» Вопрос сложный, потому что книга
рассчитана на широкий круг читателей. Но в этом эпилоге я надеюсь
дать кое-какие полезные ответы.
Дети. Есть несколько шифров, которые может понять и использовать даже ребенок, например простые подстановочные шифры, особенно шифр Цезаря. Детям очень нравятся шифры, в которых буквы
.
заменяются картинками или символами, например
Еще дети любят маршрутные перестановки. Подросткам, возможно,
придутся по вкусу столбцовые перестановки и шифр Беласо.
Любители. Любителям понравится обмениваться шифрами с друзья­
ми, бросая друг другу вызовы. Для этой цели лучше всего подходят
простые подстановки, многоалфавитные подстановки, шифры с автоключом и бегущим ключом, шифр Плейфера, Bifid, диагональный
Bifid, Trifid, Two Square, маршрутная перестановка, шифр Базери
и фракционированный код Морзе.
Я рекомендую любителям вступить в Американскую ассоциацию
криптограмм по адресу cryptogram.org, где они смогут предлагать
свои задачи другим членам и решать криптограммы, предложенные
другими членами. На странице https://www.cryptogram.org/resourcearea/cipher-types/ перечислены принимаемые Ассоциацией типы
шифров.
Разработчики. Те, кто занимается разработкой собственных шифров, найдут в книге десятки методов, которые можно комбинировать
мириадами способов. Буквы можно заменять другими буквами или

372

Эпилог

группами битов фиксированной либо переменной длины, символами кода Морзе, цифрами в любой системе счисления или элементами математического кольца. Все символы можно переставлять
и перегруппировывать. Группы можно снова подставлять, сжимать,
умножать на целые числа или матрицы, преобразовать в другую систему счисления или сцеплять. Части одних групп можно использовать для шифрования частей других групп.
Поставщики криптографических услуг. Компании, предоставляющие услуги зашифрованной связи, обычно применяют собственные алгоритмы. Они могут применять любые методы, рекомендованные выше разработчикам, но должны гарантировать, что шифр
отвечает всем критериям, сформулированным в главе 12. Должны
использоваться большие блоки и длинные ключи. Шифр должен
быть сильно нелинейным, иметь хорошую диффузию и насыщение.
Если поставщик услуг пользуется стандартным алгоритмом, например 3DES или AES, то до и после стандартного шифра должна
применяться секретная подстановка или перестановка с ключом.
Банки. К банкам и финансовым компаниям предъявляется требование использовать AES для любых взаимодействий, чтобы они могли
обмениваться информацией между собой, а также с Федеральной
резервной системой, Комиссией по ценным бумагам и биржам, Налоговым управлением и другими государственными агентствами.
Банки также широко используют криптографию с открытым ключом для выработки ключей шифрования, а также аутентификации
и верификации.
Вооруженные силы и дипломатические службы. Вооруженные
силы США и госдепартамент обязаны следовать рекомендациям
АНБ и использовать 256-битовый AES. Это требование закона. Оно
соблюдается на ПК, ноутбуках и даже смартфонах с по­мощью аппаратной или программной реализации AES. Однако вооруженные
силы и разведка действуют в таких местах и условиях, где компьютеры и сотовые телефоны могут не работать, а телефон, оснащенный AES, может вызывать подозрения или считаться незаконным.
Во многих странах владение любым криптографическим оборудованием, литературой или рабочим продуктом – преступление. Кроме
того, иностранные армии и дипломатические службы могут не доверять никакому оборудованию или программному обеспечению для
AES, потому что они могут исходить только от АНБ или поставщиков,
регулируемых АНБ.
По этим причинам у армии и разведки имеются также резервные
коды и шифры на случай невозможности использовать электронное криптографическое оборудование. Для применения в боевой
обстановке подходят такие ручные шифры, как диагональный Bifid, TwoSquare+1, Two Square с рябью и Playfair TwoSquare. Еще одна
идея – использовать Bifid или Two Square, сопровождаемый кусочной перестановкой.

Эпилог

373

Большие файлы. Для очень больших файлов гораздо эффективнее
использовать потоковый шифр, чем блочный. Нужно генерировать
поток псевдослучайных чисел и объединять его с файлом данных,
имитируя одноразовый блокнот. В качестве ГПСЧ можно использовать Xorshift, FRand или Gen5, а в качестве комбинирующей функции – xors, adds или poly. Или же можно использовать GenX для генерирования и объединения одновременно.

Предметный указатель
Символы

B