- •Предисловие
- •Глава 1. Введение
- •Некоторые аспекты безопасности связи
- •Шифр Юлия Цезаря
- •Несколько основных определений
- •Коды и шифры
- •Оценка стойкости системы шифрования
- •Коды, обнаруживающие и исправляющие ошибки
- •Другие методы сокрытия содержания сообщений
- •Модульная арифметика
- •Модульное сложение и вычитание букв
- •Заключение
- •Глава 2. От Юлия Цезаря до простой замены
- •Шифры Юлия Цезаря и их вскрытие
- •Шифры простой замены
- •Вскрытие шифра простой замены
- •Частоты встречаемости букв в других языках, кроме английского
- •Сколько знаков необходимо для дешифрования простой замены?
- •Глава 3. Многоалфавитные системы
- •Усиление системы Юлия Цезаря: шифры Вижанэра
- •Вскрытие шифра Вижанэра
- •Индикаторы
- •Одноключевые сообщения
- •Распознавание одноключевых сообщений
- •Какой объем текста необходим для дешифрования шифра Вижанэра?
- •Цилиндр Джефферсона
- •Глава 4. Шифры-головоломки
- •Перестановки
- •Простая перестановка
- •Двойная перестановка
- •Другие виды перестановок
- •Регулярные перестановочные таблицы
- •Нерегулярные перестановочные таблицы
- •Оценка стойкости шифров перестановки
- •Общая концепция двойного шифрования
- •Глава 5. Двухбуквенные шифры
- •Замена "монограф-диграф"
- •МДПМ-шифры
- •Система "диграф-диграф"
- •Шифр Плейфера*)
- •Расшифрование в системе Плейфера
- •Криптоаналитические аспекты системы Плейфера
- •Двойной шифр Плейфера
- •Глава 6. Коды
- •Характеристики кодов
- •Одночастевые и двухчастевые коды
- •Код плюс аддитивное шифрование
- •Глава 7. Шифры для шпионов
- •Шифры-решетки
- •Книжные шифры
- •Использование книжного шифра
- •Частоты встречаемости букв в книжных шифрах
- •Вскрытие книжного шифра
- •Индикаторы
- •Катастрофические ошибки при использовании книжного шифра
- •Шифры "агента Гарбо"
- •Первый шифр "агента Гарбо"
- •Второй шифр "агента Гарбо"
- •Одноразовый блокнот
- •Глава 8. Получение случайных чисел и букв
- •Случайные последовательности
- •Получение случайных последовательностей
- •Бросание монеты
- •Бросание костей
- •Извлечение из урны (по типу лотереи)
- •Космические лучи
- •Шум от усилителей
- •Псевдослучайные последовательности
- •Линейные рекурренты
- •Использование последовательности двоичных знаков гаммы для шифрования
- •Двоичные линейные последовательности как генераторы гаммы
- •Криптоанализ линейной рекурренты
- •Повышение стойкости двоичной гаммы
- •Генераторы псевдослучайных чисел
- •Метод срединных квадратов
- •Линейные конгруэнтные генераторы
- •Глава 9. Шифрмашина "Энигма"
- •Историческая справка
- •Первая "Энигма"
- •Шифрование с использованием контактных колес
- •Шифрование в "Энигме"
- •Коммутатор "Энигмы"
- •Ахиллесова пята "Энигмы"
- •Цепочки индикаторов в "Энигме"
- •Выравнивание цепочек
- •Идентификация колеса R1 и его угловой установки
- •Двойное шифрование в "Энигме"
- •"Энигма" Абвера
- •Глава 10. Шифрмашина "Хагелин"
- •Историческая справка
- •Конструкция шифрмашины «Хагелин»
- •Шифрование при помощи шифрмашины "Хагелин"
- •Выбор установок барабана в шифрмашине "Хагелин"
- •Теоретический объем перебора для шифрмашины "Хагелин"
- •Вскрытие установок "Хагелина" по отрезку гаммы
- •Дополнительные возможности шифрмашины "Хагелин"
- •Смещение
- •Определение смещения по шифрованному тексту
- •Перекрытия
- •Вскрытие шифрмашины "Хагелин" только по шифрованному тексту
- •Глава 11. После "Энигмы"
- •SZ42 - предтеча электронных машин
- •Описание шифрмашины SZ42
- •Шифрование в машине SZ42
- •Вскрытие шифрмашины SZ42 и определение ее угловых установок
- •Модификации шифрмашины SZ42
- •Глава 12. Криптография с открытым ключом
- •Историческая справка
- •Вопросы безопасности
- •Защита программ и данных
- •Шифрование программ, данных и сообщений
- •Задача распределения ключей
- •Система ключевого обмена Диффи-Хеллмана
- •Стойкость системы Диффи-Хеллмана
- •Глава 13. Шифрование и Интернет
- •Обобщение шифра простой замены
- •Факторизация больших целых чисел
- •Стандартный метод факторизации
- •Малая теорема Ферма
- •Теорема Ферма-Эйлера (для случая системы RSA)
- •Ключи зашифрования и расшифрования в системе RSA
- •Процессы зашифрования и расшифрования в системе RSA
- •Каким образом хозяин ключей отвечает корреспондентам?
- •Американский Стандарт Шифрования Данных (DES)*)
- •Общие сведения
- •Процедура зашифрования
- •Процедура расшифрования
- •Стойкость DES-алгоритма
- •Зацепление
- •Реализации DES-алгоритма
- •Совместное использование алгоритмов RSA и DES
- •Полезное замечание
- •После DES-алгоритма
- •Проверка подлинности сообщения и удостоверение подлинности подписи
- •Криптография эллиптической кривой
- •Приложение. Математические вопросы
- •Глава 2
- •М1. Совпадения знаков в алфавитах замены
- •М2. Снижение стойкости при использовании взаимно-обратных алфавитов
- •M3. Парадокс дней рождения
- •Глава 3
- •М4. Евклидово доказательство бесконечности множества простых чисел
- •Глава 6
- •М5. Последовательность чисел Фибоначчи
- •Глава 7
- •М6. Частота встречаемости букв для книжного шифра
- •М7. Одноразовый блокнот дешифровать невозможно
- •Глава 8
- •М8. Частота появления случайных чисел на странице
- •М9. Комбинирование двух последовательностей двоичных знаков гаммы, имеющих отклонения
- •М10. Последовательность типа Фибоначчи
- •М11. Двоичные линейные рекурренты
- •M12. Восстановление двоичной линейной рекурренты по отрезку гаммы
- •М13. Получение псевдослучайных чисел
- •Глава 9
- •М14. Распайка колёс шифрмашины "Энигма"
- •М15. Число возможных отражателей шифрмашины "Энигма"
- •М16. Вероятность одноключевых сообщений для "Энигмы"
- •М17. Среднее число индикаторов, необходимое для построения полных цепочек
- •Глава 10
- •М18. Число возможных барабанов шифрмашины "Хагелин"
- •М19. Максимальная кратность значения зацепления, которая может встретиться при вычислении разности гаммы шифрмашины "Хагелин"
- •M20. Определение смещения шифрмашины "Хагелин" с помощью коэффициента корреляции
- •Глава 13
- •M21. (Порядок роста количества простых чисел)
- •M22. Вычисление остатка с использованием модульной арифметики
- •М23. Доказательство теоремы Ферма-Эйлера
- •М24. Нахождение чисел, "предположительно" являющихся простыми
- •M25. Алгоритм Евклида
- •М26. Эффективность возведения в степень методом последовательного возведения в квадрат
- •М27. Число ложных ответов при дешифровании DES-алгоритма методом "встречного поиска "
- •М28. Криптография эллиптической кривой
- •Решения задач
- •Глава 2
- •Глава 3
- •Глава 4
- •Глава 5
- •Глава 6
- •Глава 7
- •Глава 8
- •Глава 9
- •Глава 10
- •Глава 11
- •Глава 13
- •Литература
185
Шифрование программ, данных и сообщений
К началу 70-х годов большинство крупных компаний, правительственных учреждений и научно-исследовательских институтов уже использовали компьютеры; распространялись и компьютерные сети. Обычно
вучреждении была одна или несколько больших ЭВМ, так называемых "мэйнфрэймов" с многочисленными телетайпами, а впоследствии с графическими терминалами, подключенными к ним с помощью телефонных линий. Многие из этих организаций использовали компьютеры, размещенные как в "головном офисе", так и в отдаленных местах. И чтобы различные пользователи могли безопасно связаться друг с другом, требовалась некоторая общая форма шифрования. Алгоритм шифрования пришлось бы сделать общедоступным, поскольку всем пользователям необходимо было знать, как именно должно производиться шифрование, а индивидуальным пользователям необходимо было бы иметь свои собственные секретные ключи, без которых невозможно было бы расшифровать их послания. В свою очередь, отсюда следовало, что метод шифрования должен быть исключительно стойким.
Споявлением компьютерных сетей , в дополнение к уже упомянутым проблемам возникли новые аспекты безопасности. Вот два примера:
(1) "Проблема проверки подлинности документа". Допустим, что пользователь X получает по электронной почте письмо, которое, судя по всему, прислал ему Y. Как может X проверить, что письмо действительно послал Y, и (даже если это так), что оно не подвергнуто изменениям? То, что
вписьме есть электронный адрес Y, ничего не гарантирует, поскольку некто мог воспользоваться компьютером Y в отсутствие хозяина. Даже если Y пользуется паролем, вполне возможно, что после входа в связь он, оставив компьютер включенным, вышел на несколько минут из комнаты - такая вредная привычка провоцирует несанкционированный доступ. Это могло позволить третьему лицу, Z, воспользоваться компьютером Y в его отсутствие, чтобы послать сообщение для X. Если X - это банк, а Y - его клиент, а сообщение уполномочивает X перевести большую сумму денег со счета Y на заокеанский счет, то банк нуждается в способе проверки подлинности сообщения, иначе совершить мошенничество будет очень легко. Кроме того, возможно ли, что Y действительно послал X сообщение, а Z каким-то образом перехватил его и частично изменил ради собственной выгоды?
(2) "Проблема удостоверения подлинности подписи". Допустим, пользователь X послал пользователю Y сообщение, в котором уполномочил его на какие-либо действия. Впоследствии X отрицает, что он посылал сообщение для Y. Спорящие обращаются к третьему лицу (возможно, к судье), которому необходимо решить, посылал ли в действительности X это
186
сообщение, или нет. Существует ли способ, при котором X, подписав сообщение, не мог бы впоследствии отрицать, что оно было им послано, и наоборот, Y не мог бы утверждать, что получил сообщение иного содержания?
Таковы проблемы, поставленные практикой. С самого начала возникновения компьютерных сетей они были предметом широкомасштабных исследований и широкого обсуждения; к ним мы вернемся в следующей главе. Предлагались различные способы решения этих задач, но обязательным условием для каждого из них является существование метода, посредством которого два лица, желающие связаться друг с другом, могут сделать это с помощью общей системы шифрования, подразумевающей использование не менее одного ключа, известного только им одним. Трудность состоит в следующем: "Как им сообщить друг другу свой секретный ключ (ключи), чтобы их не узнали также и посторонние?"
Задача распределения ключей
Ситуация такова: X и Y хотят связываться друг с другом с помощью оговоренной системы шифрования. Третьему лицу, Z, известна эта их оговоренная система шифрования, он в состоянии перехватывать сообщения и желает иметь возможность читать их. X и Y могут знать, а могут и не знать о существовании Z, но они хотят быть уверены в том, что их сообщения должны быть непонятны всем, кроме них самих. Они обязаны допускать, что данная система шифрования известна как Z, так и всем окружающим. Система требует использования одного или более ключей, которые необходимо держать в секрете, и которые могут меняться время от времени (возможно, для каждого сообщения, а возможно, и реже). Каждый, кто получит доступ к ключам, и кто знает метод шифрования, сможет расшифровать их сообщения, поэтому необходимо сохранение этих ключей втайне. Каким образом X и Y могут сообщить друг другу свои ключи, не опасаясь того, что Z их перехватит и сможет воспользоваться ими?
Система ключевого обмена Диффи-Хеллмана
Изящное решение задачи ключевого обмена было предложено Диффи и Хеллманом в 1976 году (см. [12.6]). Чтобы воспользоваться этим методом, пользователям X и Y необходимо выполнить следующее:
(1)X и Y договариваются об использовании двух целых чисел (например, p и m), где p - большое простое число, а m заключено между 1 и (p-1). Значения p и m не нужно держать в секрете.
(2) Пользователь X случайно выбирает секретное число x, а
187
пользователь Y случайно выбирает секретное число y. Числа x и y лежат в диапазоне от 1 до (p-1), и ни одно их них не должно иметь общих делителей с (p-1). В частности, поскольку (p-1) четно, то ни x, ни y не могут быть четными. Ни X, ни Y не сообщают свои секретные числа ни друг другу, ни кому-либо еще.
(3)Пользователь X вычисляет выражение kx = mx(mod p)
и посылает его пользователю Y, который возводит его в степень y, при этом получается число (kx)y.
Пользователь Y вычисляет выражение
ky = my(mod p)
и посылает его пользователю X, который возводит его в степень x, при этом получается число (ky)x.
(4) Поскольку (kx)y = (ky)x mxy(mod p), то получившееся число K = mxy(mod p) может быть использовано как пользователем X, так и пользователем Y в качестве общего ключа, хотя ни один из них не знает секретного ключа другого.
Чтобы использовать систему Диффи-Хеллмана, сначала необходимо уметь найти очень большое простое число, а это задача нетривиальная. С такой же задачей мы снова встретимся при рассмотрении системы шифрования RSA (там требуются два больших простых числа), там же можно найти ссылки на литературу, в которой описан интересный подход к решению этой задачи.
В реальных условиях простое число p должно быть очень большим, но суть метода можно проиллюстрировать с помощью простого числа средней величины.
Пример 12.1
Пусть для системы Диффи-Хеллмана p=59, m=3, x=7 и y=11. Каковы будут значения kx, ky и K?
Решение
(1)Во-первых, заметим, что (p-1)=58=2 29, и это число не имеет общих делителей ни с x, ни с y.
(2)Пользователь X вычисляет значение 37(mod 59), а пользователь Y вычисляет значение 311(mod 59). Эти вычисления можно производить по-разному, некоторые способы эффективнее других (см. приложение М22). В нашем случае числа достаточно маленькие, и возведение в
188
степень можно произвести на карманном калькуляторе. Итак, 37=2187=37 59+4, 311=177147=59 3002+29,
поэтому kx=4, а ky=29.
(3)Значение общего ключа K получится, если вычислить либо выражение 411(mod 59), либо 297(mod 59). Оба выражения должны дать один и тот же результат; если это не так, то мы сделали ошибку. Поэтому для проверки вычислим оба значения. Теперь числа получаются довольно большие, поэтому вычислим их, приводя по модулю 59 после каждого возведения в степень:
(i) 45=1024=17 59+21 21(mod 59),
поэтому
410 441=7 59+28 28(mod 59),
и следовательно, 411 4 28=112=1 59+53 53(mod 59).
Приходим к выводу, что общий ключ K равен 53.
(ii) Производим проверку, вычисляя значение 297(mod 59). 292=841=14 59+15 15(mod 59),
поэтому
293 29 15=435=7 59+22 22(mod 59).
Возводим в квадрат: 296 484=8 59+12 12(mod 59).
Окончательно, 297 29 12=348=5 59+53 53(mod 59),
и мы получаем подтверждение, что в данном случае K=53.
Причина ограничения на отсутствие у чисел x и y общих делителей с (p-1) заключается в том, что, если например, x имеет такой общий делитель, то значение kx, а следовательно, и значение общего ключа K, может оказаться равным 1 вне зависимости от значения y, что неприемлемо с криптографической точки зрения. Например, если p=31 и m=2, то ни x, ни y не должны иметь общих делителей с числом 30. Если бы X выбрал, например, число x=5, то
kx=25=32 1(mod 31),
и следовательно, kx=1, а с ним и K=1 независимо от того, какое значение y выберет пользователь Y.
Стойкость системы Диффи-Хеллмана
Насколько система Диффи-Хеллмана стойкая? Мы предполагаем, что
189
заинтересованное третье лицо, Z, может узнать значения m, p, kx и ky, но не знает чисел x и y. Стойкость, таким образом, зависит от того, насколько сложно для него, скажем, вычислить x по значению kx(=mx(mod p)). Известно, что это крайне трудная задача (она называется задачей дискретного логарифмирования), если только простое число p не принадлежит некоторому специальному классу. В общем случае эта задача считается невыполнимой для значений p, больших 10200. Как мы увидим далее, схожая задача возникает для метода шифрования RSA.
Однако существует и альтернативный способ атаки, который Z может применить, если он в состоянии перехватывать сообщения в пути между X и Y и слегка задерживать их. Поскольку ему известны значения m и p, то он может, запомнив значения kx и ky, заменить их на свое собственное значение kz=mz, которое он посылает как абоненту X, так и абоненту Y. Ничего не подозревающие X и Y начинают использовать значение kz для шифрования, а Z получает возможность читать их сообщения. Затем он перешифровывает их, используя исходный ключ (соответственно, kx или ky), так что ни X, ни Y не догадаются о том, что их сообщения читают.
Способы предотвращения атак, подобных этой, представляют значительный интерес (см., например, [12.7]).
Несмотря на эту потенциальную слабость, система Диффи-Хеллмана представляет собой метод ключевого обмена, способный устоять против любого, кроме самого целеустремленного и хорошо оснащенного противника. В частности, она может быть применена в качестве начального этапа при использовании таких систем шифрования, как DES-алгоритм, который мы рассмотрим ниже.