Шрифт:
Интервал:
Закладка:
42 Federal Information Processing Standard — Федеральный стандарт обработки информации.
8.6. Алгоритмы с открытым ключом
Исторически процесс передачи ключа всегда был слабым звеном почти во всех системах шифрования. Независимо от того, насколько прочна была сама криптосистема, если взломщик мог украсть ключ, система становилась бесполезной. До 1976 года все криптологи исходили из того, что ключ дешифрования должен быть идентичен ключу шифрования (или один можно легко получить из другого). При этом ключи должны быть у всех пользователей системы. Казалось, что проблема неустранима: необходимо защищать ключи от кражи и в то же время нужно распространять их среди пользователей, поэтому они не могут быть заперты в банковском сейфе.
В 1976 году два исследователя из Стэнфордского университета, Диффи (Diffie) и Хеллман (Hellman), предложили радикально новую криптосистему, в которой ключ дешифрования нельзя было получить из ключа шифрования — настолько они различались. Разработанные Диффи и Хеллманом алгоритмы шифрования E и дешифрования D (оба параметризованные ключом) должны были соответствовать следующим требованиям:
1. D(E(P)) = P.
2. Вывести D из E крайне сложно.
3. E нельзя взломать при помощи произвольного открытого текста.
Первое требование состоит в том, что применив алгоритм дешифрования D к зашифрованному сообщению E(P), мы должны снова получить открытый текст P. Без этого авторизованный получатель просто не сможет расшифровать сообщение. Второй пункт говорит сам за себя. Третье требование необходимо, поскольку, как мы скоро увидим, взломщики могут экспериментировать с алгоритмом столько, сколько пожелают. В этих условиях нет никаких причин, по которым ключ шифрования нельзя было бы обнародовать.
Этот метод работает следующим образом. Допустим, Алиса, желая получать секретные сообщения, разрабатывает два алгоритма, удовлетворяющие перечисленным выше требованиям. Затем алгоритм шифрования и его ключ открыто публикуются; поэтому данный подход и называется шифрованием с открытым ключом (public-key cryptography). Алиса может разместить открытый ключ, к примеру, на своей домашней страничке. Алгоритм шифрования, параметризованный этим ключом, мы обозначим как EA. По аналогии алгоритм дешифрования (секретный), параметризованный персональным ключом Алисы, мы будем обозначать как DA. Боб делает то же самое: обнародует EB, но сохраняет в тайне DB.
Теперь мы попробуем решить проблему установки надежного канала между Алисой и Бобом, которые ранее никогда не встречались. Оба ключа шифрования, EA и EB, являются открытыми. Алиса берет свое первое сообщение P, вычисляет EB(P) и отправляет результат Бобу. Боб расшифровывает его с помощью своего секретного ключа DB, то есть вычисляет DB(EB(P)) = P. Никто другой не может прочитать зашифрованное сообщение EB(P), так как предполагается, что система шифрования надежна, а получить ключ DB на основании известного ключа EB очень трудно. Отсылая ответ R, Боб передает EA(R). Таким образом, Алиса и Боб получают надежный секретный канал связи.
Обратите внимание на используемую здесь терминологию. Шифрование с открытым ключом предполагает наличие у каждого пользователя двух ключей — открытого (все используют его для шифрования сообщений для этого пользователя) и закрытого (он нужен пользователю для дешифрования входящих сообщений). Мы будем и далее называть эти ключи открытым (public) и закрытым (private), чтобы отличать их от секретных (secret) ключей, которые применяются для шифрования и дешифрования в обычной криптографии с симметричным ключом.
8.6.1. Алгоритм RSA
Единственная загвоздка состоит в том, чтобы найти алгоритмы, отвечающие всем трем требованиям. Преимущества шифрования с открытым ключом очевидны, поэтому многие исследователи неустанно работали над созданием таких алгоритмов (некоторые из них уже опубликованы). Группой исследователей Массачусетского технологического института был разработан один надежный метод (Ривест и др.; Rivest et al., 1978). Он получил название RSA, по начальным буквам фамилий трех авторов: Рона Ривеста, Ади Шамира и Леонарда Адлемана (Ron Rivest, Adi Shamir, Leonard Adleman). Вот уже четверть века этот метод выдерживает попытки взлома и считается очень надежным. На его основе построены многие практические системы безопасности. По этой причине Ривест, Шамир и Адлеман в 2002 году получили награду ACM — Премию Тьюринга (Turing Award). Главный недостаток RSA в том, что для обеспечения достаточного уровня защиты нужен ключ длиной по крайней мере 2048 бит (против 256 бит в алгоритмах с симметричными ключами). Из-за этого алгоритм работает довольно медленно.
В основе метода RSA лежат некоторые принципы теории чисел. Опишем в общих чертах, как пользоваться этим методом. Подробности можно найти в соответствующих источниках.
1. Выберем два больших простых числа p и q (скажем, длиной 1024 бита).
2. Вычислим n = p × q и z = (p – 1) × (q – 1).
3. Выберем число d, которое является взаимно простым с числом z.
4. Найдем такое число e, для которого справедливо равенство e × d = 1 mod z.
Заранее вычислив эти параметры, можно начинать шифрование. Сначала разобьем весь открытый текст (рассматриваемый в качестве битовой строки) на блоки так, чтобы каждое сообщение P попадало в интервал 0 ≤ P < n. Это несложно сделать, если разбить открытый текст на блоки по k бит, где k — максимальное целое число, для которого справедливо неравенство 2k < n.
Чтобы зашифровать сообщение P, вычислим C = P e (mod n). Чтобы дешифровать C, вычислим P = Cd (mod n). Можно доказать, что для всех значений P в указанном диапазоне функции шифрования и дешифрования являются взаимно обратными. Чтобы выполнить шифрование, нужны e и n. Для дешифрования требуются d и n. Таким образом, открытый ключ состоит из пары (e, n), а закрытый ключ — из пары (d, n).
Надежность метода обеспечивается сложностью факторизации больших чисел. Если бы криптоаналитик мог разложить на множители публично известное число n, он бы нашел значения p и q, а следовательно, и число z. После этого e и d можно найти с помощью алгоритма Евклида. К счастью, математики пытаются решить проблему факторизации больших чисел уже по меньшей мере 300 лет, и накопленный опыт говорит о том, что это очень трудная задача.
В свое время Ривест вместе с коллегами пришел к заключению, что разложение на множители числа из 500 цифр займет 1025 лет, если действовать методом простого перебора. Предполагалось использование наиболее известного алгоритма и компьютера, выполняющего одну инструкцию за 1 мкс. Если миллион чипов будет работать одновременно и выполнять одну инструкцию за 1 нс, все равно потребуется 1016 лет. Даже при