Схема подписи Эль-Гамаля: формулы и проверка подписи

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

Генерация ключей
Подготовка ключевой пары состоит из нескольких шагов:
- Выбирается большое простое число и первообразный корень (генератор) по модулю , где .
- Выбирается секретный ключ - случайное число из диапазона .
- Вычисляется открытый ключ:
Открытыми (публикуемыми) параметрами становятся тройка . Секретным остаётся только показатель . Восстановить из - это и есть задача дискретного логарифма, поэтому раскрытие открытого ключа не компрометирует секретный.
В учебных задачах p обычно маленькое (например 23 или 467), чтобы вычисления можно было сделать вручную. В реальной криптографии длина p - не меньше 2048 бит.
Формирование подписи
Чтобы подписать сообщение , подписывающий сначала вычисляет его хэш - короткое числовое представление сообщения. Затем выполняются шаги:
- Выбирается случайное сессионное число , взаимно простое с , то есть .
- Вычисляется первая часть подписи:
- Вычисляется вторая часть подписи через обратный элемент по модулю :
Подписью сообщения становится пара . Если на каком-то шаге , число выбирают заново. Обратите внимание: показатели считаются по модулю , а не - это следствие малой теоремы Ферма, по которой порядок группы равен .

Проверка подписи
Получатель знает открытые параметры , само сообщение и подпись . Сначала он проверяет, что и - иначе подпись сразу отвергается. Затем вычисляет хэш и сравнивает два значения:
Если равенство выполняется - подпись подлинна. Корректность проверки следует из подстановки: поскольку , то
Равенство показателей по модулю гарантирует равенство самих степеней по модулю - на этом и строится вся проверка.
Роль случайного числа k
Сессионное число - самое уязвимое место схемы. Оно должно быть:
- случайным - выбираться заново для каждой подписи;
- секретным - никогда не раскрываться;
- уникальным - не повторяться на разных сообщениях.
Нарушение любого из этих условий ведёт к катастрофе. Если становится известно злоумышленнику, секретный ключ восстанавливается напрямую из формулы:
Ещё опаснее повтор: если одно и то же использовано для двух разных сообщений, значение у обеих подписей совпадёт, и из системы двух уравнений противник вычислит сначала , а затем и . Именно из-за этой проблемы в современных реализациях генерируют детерминированно по RFC 6979, исключая ошибки генератора случайных чисел. Та же уязвимость есть и в подписи ECDSA, унаследовавшей конструкцию от Эль-Гамаля.
Разбор на учебном примере
Чтобы формулы стали наглядными, проследим короткий расчёт с маленькими числами. Пусть , генератор , секретный ключ . Тогда открытый ключ . Публикуется тройка .
Подписываем сообщение с хэшем . Выбираем - оно взаимно просто с . Считаем первую часть: . Находим обратное (так как ). Тогда вторая часть:
Получили - такой случай запрещён, поэтому нужно перевыбрать. Возьмём : тогда , , и . Этот пример показывает, почему проверка и перевыбор - обязательные шаги алгоритма, а не формальность.
Чем схема отличается от RSA
И RSA, и Эль-Гамаль - асимметричные схемы, но их математическая основа и поведение различаются:
- Основа стойкости. RSA опирается на сложность факторизации больших чисел; Эль-Гамаль - на задачу дискретного логарифма.
- Детерминированность. Подпись RSA для одного сообщения всегда одна и та же. Подпись Эль-Гамаля вероятностная: из-за случайного одно сообщение даёт разные подписи при каждом подписании.
- Размер подписи. Подпись Эль-Гамаля состоит из двух чисел , каждое порядка , поэтому она примерно вдвое длиннее модуля. У RSA подпись - одно число.
- Связь с хэшем. Без хэш-функции схема Эль-Гамаля уязвима к экзистенциальной подделке, поэтому подписывают всегда , а не сам текст. Требования к хэшу разобраны в материале про хэш-функции.
Прямой потомок схемы - алгоритм DSA, где конструкция Эль-Гамаля оптимизирована: подпись считается в подгруппе меньшего порядка, что сокращает её длину. А переход на эллиптические кривые дал ту же стойкость при ещё меньших ключах - на этом строится постквантовая дискуссия о будущем подписей.
Частые ошибки
- Считать показатели по модулю вместо . Значение и обратный элемент берутся по модулю - порядка группы, а не самого модуля.
- Брать , не взаимно простое с . Тогда обратного не существует и подпись посчитать нельзя; нужно перевыбрать.
- Подписывать сам текст вместо хэша. Без схема допускает подделку; в формулах участвует именно хэш сообщения.
- Повторно использовать одно . Это раскрывает секретный ключ - самая известная практическая атака на схему.
- Путать и при проверке. В равенстве показателем при стоит , а возводится в степень - перестановка ломает проверку.
FAQ
Чем подпись Эль-Гамаля отличается от шифрования Эль-Гамаля? Это две разные схемы одного автора на общей математической основе. Шифрование скрывает сообщение и использует открытый ключ получателя; подпись подтверждает авторство и использует секретный ключ отправителя. Формулы и роли ключей у них разные.
Почему подпись каждый раз получается другой? Из-за случайного сессионного числа : оно входит в обе части подписи , и при новом обе части меняются. Это свойство вероятностных схем - в отличие от детерминированной RSA.
Как связаны схема Эль-Гамаля и DSA? DSA - это оптимизированный вариант схемы Эль-Гамаля. Подпись вычисляется в подгруппе простого порядка , делящего , что заметно сокращает длину подписи при той же стойкости относительно дискретного логарифма.
Коротко
Схема подписи Эль-Гамаля строит цифровую подпись как пару на основе случайного сессионного числа , секретного ключа и хэша сообщения; проверка сводится к сравнению с по модулю . Стойкость обеспечивает задача дискретного логарифма, а главная практическая опасность - повтор или утечка , раскрывающие секретный ключ. Из этой конструкции выросли DSA и подписи на эллиптических кривых.
Читайте также

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

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

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