Чёрный кабинет EN

Урок №11 1976–1977 25 мин

Открытый ключ: Диффи — Хеллман и RSA

Как договориться о секрете с незнакомцем, если вас подслушивают с первого же слова? Три тысячи лет это считалось невозможным. В 1976 году оказалось, что можно.

В этом уроке

  • в чём проблема распределения ключей
  • как Диффи — Хеллман договариваются о секрете при свидетелях
  • как устроен RSA: p, q, n, φ, e, d на маленьких числах
  • почему умножить легко, а разложить на множители трудно
  • что такое цифровая подпись

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

Все шифры, которые мы разбирали до сих пор, — от Цезаря до одноразового блокнота и AES — устроены одинаково: у отправителя и получателя должен быть один и тот же ключ. Его называют симметричным. И у всех них одна беда: прежде чем шифровать, ключ нужно как-то передать. Тайно. А чтобы передать тайно, нужен… шифр с ключом.

Замкнутый круг

Это называется проблемой распределения ключей. Для двух людей она решается одной встречей. Но представьте сеть, где каждый должен говорить с каждым по секрету. Для десяти человек нужно 45 разных ключей, для тысячи — 499 500, для миллиарда пользователей интернета — около полуквинтиллиона. И каждый ключ кто-то должен доставить лично.

А теперь представьте, что вы впервые заходите на сайт банка. Вы никогда не встречались с банком, курьер к вам не приезжал, а весь ваш разговор с первого байта идёт через чужие провода — вай-фай в кафе, провайдера, десяток узлов интернета. Как договориться о секретном ключе, если каждое слово слышат посторонние?

Вот мысленный эксперимент, который подсказывает, что это не безнадёжно. Алиса кладёт письмо в ящик, вешает свой замок и отправляет Бобу. Боб не может открыть, но вешает рядом свой замок и отправляет обратно. Алиса снимает свой замок и снова отправляет. Теперь на ящике только замок Боба — он открывает и читает. Ящик трижды прошёл через руки почтальона, и ни разу не был открыт. Ключами никто не обменивался!

С настоящими шифрами этот трюк работает не всегда. Если «замок» — это XOR с ключом, почтальон, сложив три перехваченных ящика по XOR, получит письмо: ключи сократятся, как в двойном блокноте из урока об XOR. Нужна операция похитрее.

Диффи — Хеллман: смешиваем краски

В 1976 году Уитфилд Диффи и Мартин Хеллман из Стэнфорда опубликовали статью «Новые направления в криптографии». В ней был способ, которым двое могут договориться об общем секрете, разговаривая только при свидетелях. Важную часть идей придумал их коллега Ральф Меркл.

Проще всего понять его на красках. У смешивания красок есть нужное свойство: смешать легко, а разделить смесь обратно на исходные краски — практически невозможно.

  1. Алиса и Боб открыто договариваются об общей краске, скажем жёлтой. Её видят все.
  2. Каждый выбирает свою секретную краску и никому её не показывает.
  3. Каждый смешивает общую краску со своей секретной и отправляет смесь другому — открыто.
  4. Каждый добавляет к полученной смеси свою секретную краску.

Теперь у обоих одинаковый цвет: общая + секрет Алисы + секрет Боба, просто смешанные в разном порядке. А подслушивающая Ева видела жёлтую краску и две смеси. Смешать их между собой — получится не то: в её банке две порции жёлтой. А отделить из смеси секрет она не может.

Двигайте секреты Алисы и Боба. Под каждой банкой — то же самое на числах: вместо смешивания — возведение в степень по модулю. Последние банки Алисы и Боба совпадают всегда, банка Евы — нет.

На самом деле Диффи и Хеллман смешивали не краски, а числа. Общая «краска» — это два открытых числа: большое простое p и число g. Секрет Алисы — число a. «Смешать» — значит вычислить A = ga mod p: возвести g в степень a и взять остаток от деления на p. Остаток мы уже встречали в шифре Цезаря: это тот же счёт «по кругу», как на циферблате.

Боб получает A и возводит его в свою степень b: Ab = gab. Алиса делает то же с B = gb: Ba = gba. Это одно и то же число — общий секрет. А Еве, чтобы его получить, нужно по A = ga mod p найти a. Эту задачу называют дискретным логарифмом, и для простых чисел из сотен цифр никто не знает, как решить её быстрее, чем за астрономическое время.

Другие Алиса и Боб договорились открыто о тех же p = 23 и g = 5. Алиса отправила число 10, Боб — 20. Вы всё слышали. Каков их общий секрет?

Найдите секрет Алисы a: какую степень пятёрки нужно взять, чтобы остаток от деления на 23 был 10? Числа маленькие, перебирайте: 5, 25 mod 23 = 2, 2 · 5 = 10, …

a = 3. Теперь сделайте то, что сделала бы Алиса: возведите число Боба 20 в третью степень по модулю 23. Удобно шаг за шагом: умножайте на 20 и берите остаток.

Степени пятёрки по модулю 23: 5, 2, 10 — третья. Значит, a = 3. Дальше 203 mod 23: 20 · 20 = 400 → 400 mod 23 = 9 → 9 · 20 = 180 → 180 mod 23 = 19. Общий секрет — 19. Проверьте с другой стороны: секрет Боба b = 5 (5, 2, 10, 4, 20 — пятая степень), и 105 mod 23 тоже даёт 19.

При p = 23 Ева справляется перебором за минуту. В настоящих системах p занимает 2048 битов — больше 600 цифр, — и перебор степеней превращается в безнадёжное дело.

Почтовый ящик с прорезью: RSA

Диффи и Хеллман описали ещё одну идею, но не нашли, как её устроить. Пусть у каждого будет два ключа: один открытый, другой закрытый. Открытым шифруют, закрытым расшифровывают. Как почтовый ящик с прорезью: бросить письмо может любой прохожий, а достать — только хозяин ключа. Открытый ключ можно печатать в газете: всё равно им ничего не прочитать.

Через год, в 1977-м, такой ящик построили трое учёных из MIT — Рон Ривест, Ади Шамир и Леонард Адлеман. Шифр назвали по первым буквам фамилий: RSA. Вот рецепт:

  1. Выберите два больших простых числа p и q. Это главный секрет.
  2. Перемножьте: n = p · q. Это число открытое.
  3. Посчитайте φ(n) = (p − 1)(q − 1) — функцию Эйлера. Это снова секрет: без p и q её не узнать.
  4. Выберите e — число без общих делителей с φ(n). Пара (n, e) — открытый ключ.
  5. Найдите d такое, что e · d при делении на φ(n) даёт остаток 1. Это закрытый ключ.

Шифровать: сообщение — число m (меньше n), шифр c = me mod n. Расшифровывать: m = cd mod n. Возведение в e и в d — два поворота ключа, которые гасят друг друга.

Меняйте p, q и e кнопками, впишите любую букву. Буква сначала становится числом (А = 1, … Я = 33), потом шифруется. Шаги 6–7 — шифрование и расшифровка, шаг 8 — подпись.
Почему cd возвращает m

Раз e · d = 1 + k · φ(n), то cd = me·d = m · (mφ(n))k. По теореме Эйлера, если m не имеет общих делителей с n, то mφ(n) даёт остаток 1 при делении на n. Значит, (mφ(n))k тоже даёт 1, и остаётся m. (Для m, кратных p или q, равенство тоже верно — это доказывают через китайскую теорему об остатках.)

Где здесь защита? Чтобы найти d, нужно знать φ(n), а для этого — p и q. Ева знает n. Значит, ей нужно разложить n на множители. Для n = 143 это минута: 143 = 11 · 13. Для n из 600 цифр — неизвестно, как это сделать за время жизни Вселенной.

Открытый ключ сейфа: n = 187, e = 3. Каждая буква пароля (А = 1, Б = 2, … Я = 33, с Ё) зашифрована отдельно:

45 140 43 104

Что за пароль? Можно считать в мастерской выше или в утилите RSA.

Разложите 187 на два простых множителя. Попробуйте делить на 7, 11, 13…

187 = 11 · 17, φ = 10 · 16 = 160. Нужно d, при котором 3 · d даёт остаток 1 при делении на 160. Проверьте 107.

187 = 11 · 17, значит φ(n) = 10 · 16 = 160. Ищем d: 3 · 107 = 321 = 2 · 160 + 1, так что d = 107. Теперь каждое число возводим в 107-ю степень по модулю 187: 45 → 12, 140 → 13, 43 → 32, 104 → 25. Номера 12, 13, 32, 25 — это К, Л, Ю, Ч. Пароль — ключ.

Заметьте, что шифровать по одной букве — плохая идея: одинаковые буквы дали бы одинаковые числа, и шифр превратился бы в простую замену. Настоящий RSA шифрует большие числа со случайной набивкой.

Умножить легко, разложить трудно

Перемножить два числа по сто цифр — работа на несколько минут с карандашом и на микросекунду для компьютера. Обратная задача — по произведению найти множители — совсем другое дело. Можно перебирать делители, можно применять хитрые методы, но для больших чисел все известные способы работают невообразимо долго. Такую задачу, лёгкую в одну сторону и трудную в обратную, называют односторонней функцией; у RSA есть ещё и «лазейка» — знание p и q, которое делает обратный путь лёгким.

Время честно меряет ваш браузер. Для больших n — оценка: на каждые две цифры время растёт примерно в √10 ≈ 3,2 раза. Шкала логарифмическая: каждое деление — в десятки раз больше.

В августе 1977 года Мартин Гарднер рассказал об RSA в журнале Scientific American и напечатал шифровку с числом из 129 цифр, пообещав сто долларов за разгадку. Авторы прикидывали, что ждать придётся невообразимо долго. Ответ нашли в 1994 году: около 600 добровольцев по всему миру поделили работу между своими компьютерами. Шифровка гласила: «The Magic Words are Squeamish Ossifrage» — «Волшебные слова — брезгливый орёл-ягнятник».

С тех пор и компьютеры, и алгоритмы стали сильнее. В 2020 году разложили RSA-250 — число из 250 цифр; это заняло около 2700 лет процессорного времени. Поэтому сегодня в ключах RSA берут n из 2048 битов (617 цифр) и больше. Единственная известная угроза такой длине — большой квантовый компьютер: в 1994 году Питер Шор придумал для него быстрый алгоритм разложения. Таких машин пока нет, но к ним уже готовятся: в 2024 году в США утвердили первые стандарты постквантовой криптографии.

Подпись

У пары ключей есть второе применение, не менее важное. Если «зашифровать» сообщение закрытым ключом, s = md mod n, то «расшифровать» его открытым, se mod n, сможет любой. Секретности это не даёт, зато доказывает авторство: получить такое s мог только владелец d. Это и есть цифровая подпись. На практике подписывают не само сообщение, а его хеш из прошлого урока — поэтому так важно, чтобы хеш был без коллизий.

Вы хотите, чтобы вам могли присылать секретные письма. Что вы публикуете на своём сайте?

Открытый ключ (n, e) позволяет только зашифровать. Расшифровать может лишь тот, кто знает d, а d вычисляется из p и q, которые вы держите при себе.

В жизни оба изобретения работают вместе. Когда браузер открывает сайт по HTTPS, он с помощью обмена Диффи — Хеллмана (обычно в варианте на эллиптических кривых) договаривается с сервером о секретном ключе, а подпись сервера доказывает, что это действительно банк, а не самозванец. Дальше данные шифруются быстрым симметричным шифром вроде AES. Всё это — за долю секунды, при свидетелях и без единого курьера.

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

Оказалось, что первыми были не американцы. В британской спецслужбе GCHQ Джеймс Эллис ещё в 1970 году придумал «несекретное шифрование», в 1973-м Клиффорд Кокс нашёл схему, по сути совпадающую с RSA, а в 1974-м Малкольм Уильямсон — аналог Диффи — Хеллмана. Работы были засекречены и стали известны только в 1997 году.

Почему Ева, слышавшая весь обмен Диффи — Хеллмана, не может просто смешать две открытые смеси?

Общий секрет — это общая краска плюс оба секрета, по одной порции. Ева может получить только общая + секрет Алисы + общая + секрет Боба. А убрать лишнюю порцию — то есть найти секрет по смеси — и есть трудная задача.

Что взять с собой

  • Симметричным шифрам нужен общий ключ, и его надо как-то тайно доставить. Это проблема распределения ключей.
  • Диффи — Хеллман (1976): двое договариваются о секрете открыто. Смешивать (возводить в степень по модулю) легко, разделять (дискретный логарифм) — трудно.
  • RSA (1977): n = p · q, φ = (p − 1)(q − 1), e открыт, d — такое, что e · d даёт остаток 1 по модулю φ. Шифр c = me mod n, расшифровка m = cd mod n.
  • RSA стоит, пока n нельзя разложить на множители. Для 617 цифр это не под силу ни одному существующему компьютеру.
  • Подпись — то же самое наоборот: подписывают закрытым ключом, проверяют открытым.

Теперь у вас есть все инструменты дешифровщика: от счёта букв до разложения на множители. Осталось посмотреть, как ими пользовались в настоящих делах — от заговора против королевы до шифровок серийного убийцы. Дальше: знаменитые шифры →

Утилиты урока

Всё из урока — в рабочем виде: вставьте свой текст.