Схема Эль-Гамаля: шифрование на дискретном логарифме

Схема Эль-Гамаля - это асимметричный криптоалгоритм, стойкость которого опирается на сложность задачи дискретного логарифмирования в конечном поле. Предложенная Тахером Эль-Гамалем в 1985 году, она лежит в основе DSA, части стандарта PGP и многих учебных задач по криптографии. В отличие от RSA, где безопасность держится на трудности факторизации, здесь злоумышленнику пришлось бы вычислять степенной показатель по известному результату возведения в степень по модулю простого числа. Разберём генерацию ключей, шифрование, расшифровку и подпись на конкретных числах - а собрать готовую задачу с вашими параметрами можно прямо в калькуляторе ниже.
Зачем нужна схема Эль-Гамаля
Симметричный шифр требует, чтобы обе стороны заранее имели один и тот же секретный ключ. Но как передать этот ключ по открытому каналу, не дав перехватить его? Эту проблему решают асимметричные схемы: у каждого участника есть пара ключей - открытый (его можно публиковать) и закрытый (хранится в тайне).
Схема Эль-Гамаля строится поверх протокола Диффи - Хеллмана и добавляет к нему полноценное шифрование сообщения. Её ключевое свойство - вероятностность: одно и то же сообщение при повторном шифровании даёт разный шифртекст, потому что на каждом шаге выбирается новое случайное число. Это сильно затрудняет атаки на основе анализа повторяющихся блоков.
Математическая основа: дискретный логарифм
Вся стойкость держится на одной задаче. Пусть дано простое число , первообразный корень (генератор) по модулю и значение . Зная , и , найти показатель - это и есть задача дискретного логарифмирования.
Возвести в степень по модулю легко даже для огромных чисел (быстрое возведение в степень работает за умножений). А вот обратное действие - восстановить - для больших вычислительно неподъёмно: лучшие известные алгоритмы работают субэкспоненциально. Именно эта асимметрия «легко в одну сторону, тяжело в обратную» делает схему рабочей.

Генерация ключей
Получатель сообщения (назовём его Боб) готовит свою пару ключей один раз:
- Выбирает большое простое число .
- Выбирает первообразный корень по модулю (генератор мультипликативной группы).
- Случайно выбирает закрытый ключ , где .
- Вычисляет открытую часть: .
Открытый ключ - это тройка , её можно публиковать. Закрытый ключ - число , его Боб никому не сообщает. Восстановить из означало бы решить задачу дискретного логарифма - на то и расчёт.
Генератор $g$ должен быть именно первообразным корнем по модулю $p$, иначе степени $g$ не пробегут всю группу и пространство шифртекстов сузится. На практике берут безопасные простые $p = 2q + 1$ и подбирают $g$ так, чтобы его порядок равнялся $q$.
Шифрование сообщения
Отправитель (Алиса) хочет передать сообщение , где . Она берёт открытый ключ Боба и действует так:
- Выбирает случайный сеансовый ключ , где , взаимно простой с .
- Вычисляет первую компоненту: .
- Вычисляет вторую компоненту: .
Шифртекст - это пара . Заметьте: длина шифртекста вдвое больше длины открытого текста, это плата за вероятностность. Число Алиса после отправки уничтожает и больше нигде не использует.
Расшифровка
Боб получает пару и применяет свой закрытый ключ :
Здесь - мультипликативный обратный элемент к по модулю , его находят расширенным алгоритмом Евклида (или как по малой теореме Ферма, то есть ).
Почему это работает? Подставим и :
Показатели взаимно сокращаются, и остаётся исходное сообщение. Ключевой момент: Боб никогда не узнаёт , но ему это и не нужно - секрет позволяет восстановить общий маскирующий множитель .

Пример с маленькими числами
Возьмём учебные параметры. Пусть , , закрытый ключ Боба . Тогда открытая часть:
Открытый ключ Боба - . Алиса шифрует сообщение , выбрав случайный :
Шифртекст - пара . Боб расшифровывает, вычислив , затем обратный к нему по модулю 23 - это 6 (так как ). Итог: . Исходное сообщение восстановлено.
Цифровая подпись Эль-Гамаля
Ту же математику можно повернуть наоборот - для подписи. Здесь секрет принадлежит подписывающему, а проверяет любой по открытому ключу. Чтобы подписать сообщение , выбирают случайный , взаимно простой с , и считают:
Подпись - пара . Проверка считает и сравнивает его с : при верной подписи они равны. Именно из этой конструкции вырос алгоритм DSA, входящий в государственные стандарты. О базовом протоколе, поверх которого надстроена схема, - в разборе про обмен ключами Диффи - Хеллмана.
Сеансовый ключ $k$ нельзя использовать дважды и нельзя выбирать предсказуемо. Если два сообщения подписаны с одним $k$, закрытый ключ $x$ вычисляется из подписей напрямую - именно так в своё время вскрывали прошивки игровых консолей.
Стойкость и сравнение с RSA
Безопасность Эль-Гамаля эквивалентна сложности задачи Диффи - Хеллмана, которая не сложнее дискретного логарифма. На практике это значит:
- Длина ключа. Для сопоставимой с RSA стойкости нужен модуль примерно той же битности (2048+ бит для серьёзных применений).
- Расширение шифртекста. Шифртекст вдвое длиннее открытого текста - у RSA такого удвоения нет.
- Вероятностность из коробки. RSA в «учебном» виде детерминирован и требует отдельного дополнения (OAEP); Эль-Гамаль рандомизирован самой схемой.
- Скорость. Шифрование медленнее RSA из-за двух возведений в степень, зато подпись и проверка хорошо ложатся на эллиптические кривые (ECElGamal, EdDSA).
Частые ошибки
- Повторное использование . Самая опасная ошибка: один и тот же сеансовый ключ для разных сообщений раскрывает закрытый ключ. должен быть свежим и случайным каждый раз.
- Сообщение . Открытый текст обязан помещаться в группу, . Длинные данные шифруют поблочно или гибридно (Эль-Гамалем шифруют только симметричный ключ).
- не первообразный корень. Если генератор имеет малый порядок, пространство шифртекстов схлопывается и схема становится уязвимой.
- Забыли про обратный по модулю в подписи. В подписи деление идёт по модулю , а не - путаница модулей ломает проверку.
- Смешивание шифрования и подписи на одном ключе. Использовать одну пару и для конфиденциальности, и для подписи без разделения доменов небезопасно.
FAQ
Чем схема Эль-Гамаля отличается от протокола Диффи - Хеллмана? Диффи - Хеллман - это протокол выработки общего секрета, он сам по себе ничего не шифрует. Эль-Гамаль надстраивает над ним шаг маскирования сообщения множителем , превращая обмен ключами в полноценное асимметричное шифрование.
Почему шифртекст в два раза длиннее сообщения? Потому что он состоит из пары чисел : первое переносит «открытую часть» сеансового ключа , второе - замаскированное сообщение. Это структурная плата за вероятностность и невозможность повтора.
Используется ли схема Эль-Гамаля на практике сегодня? В исходном виде над редко, но её идея живёт в DSA, в шифровании PGP/GnuPG и особенно в варианте на эллиптических кривых, где она компактна и быстра.
Коротко
Схема Эль-Гамаля - асимметричный алгоритм на основе сложности дискретного логарифма. Получатель публикует открытый ключ с и хранит секрет . Отправитель выбирает случайный и шлёт пару ; получатель снимает маску через . Та же конструкция в обратную сторону даёт цифровую подпись (основу DSA). Главные подводные камни - повторное использование сеансового ключа и удвоение длины шифртекста.
Читайте также

Протокол Шнорра: схема доказательства знания и подпись
Разбираем протокол Шнорра: интерактивное доказательство знания дискретного логарифма, тройку обязательство-вызов-ответ, проверку и переход к подписи через Фиата-Шамира.

Схема подписи Эль-Гамаля: формулы и проверка подписи
Схема подписи Эль-Гамаля простыми словами: генерация ключей, формулы подписи и проверки, роль секретного k, связь с задачей дискретного логарифма и отличие от RSA и DSA.

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