EssayAI
Блог
Блог
Математика и алгоритмы

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

19 июня 2026Время чтения: 8 минут
#схема подписи эль-гамаля#цифровая подпись#дискретный логарифм#криптография#проверка подписи
Схема подписи Эль-Гамаля: формулы и проверка подписи

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

Ниже - интерактивный разбор: задайте параметры учебной группы, секретный ключ и хэш сообщения, и получите пошаговый вывод подписи и её проверки.

Что лежит в основе схемы

Схема Эль-Гамаля работает в мультипликативной группе вычетов по модулю простого числа pp. Все вычисления идут по модулю pp (для самой подписи) и по модулю p1p-1 (для показателей). Безопасность держится на том, что операция возведения в степень по модулю легко вычисляется в одну сторону, но обратная задача - найти показатель по результату - вычислительно неподъёмна для больших pp.

Эта обратная задача и называется задачей дискретного логарифма: по известным gg, pp и значению y=gxmodpy = g^x \bmod p найти xx. Для простого числа из нескольких сотен десятичных цифр такая задача не решается за разумное время. На том же фундаменте стоит алгоритм Диффи-Хеллмана обмена ключами, поэтому схему Эль-Гамаля часто изучают сразу после него.

Схема подписи Эль-Гамаля: открытый ключ, секретный ключ и пара значений r и s как составляющие цифровой подписи
Схема подписи Эль-Гамаля: открытый ключ, секретный ключ и пара значений r и s как составляющие цифровой подписи

Генерация ключей

Подготовка ключевой пары состоит из нескольких шагов:

  1. Выбирается большое простое число pp и первообразный корень (генератор) gg по модулю pp, где 1<g<p1 < g < p.
  2. Выбирается секретный ключ xx - случайное число из диапазона 1<x<p11 < x < p-1.
  3. Вычисляется открытый ключ:
y=gxmodpy = g^x \bmod p

Открытыми (публикуемыми) параметрами становятся тройка (p,g,y)(p, g, y). Секретным остаётся только показатель xx. Восстановить xx из yy - это и есть задача дискретного логарифма, поэтому раскрытие открытого ключа не компрометирует секретный.

В учебных задачах p обычно маленькое (например 23 или 467), чтобы вычисления можно было сделать вручную. В реальной криптографии длина p - не меньше 2048 бит.

Формирование подписи

Чтобы подписать сообщение mm, подписывающий сначала вычисляет его хэш H(m)H(m) - короткое числовое представление сообщения. Затем выполняются шаги:

  1. Выбирается случайное сессионное число kk, взаимно простое с p1p-1, то есть gcd(k,p1)=1\gcd(k, p-1) = 1.
  2. Вычисляется первая часть подписи:
r=gkmodpr = g^k \bmod p
  1. Вычисляется вторая часть подписи через обратный элемент k1k^{-1} по модулю p1p-1:
s=(H(m)xr)k1mod(p1)s = (H(m) - x \cdot r) \cdot k^{-1} \bmod (p-1)

Подписью сообщения становится пара (r,s)(r, s). Если на каком-то шаге s=0s = 0, число kk выбирают заново. Обратите внимание: показатели считаются по модулю p1p-1, а не pp - это следствие малой теоремы Ферма, по которой порядок группы равен p1p-1.

Этапы формирования подписи Эль-Гамаля: выбор случайного числа k, вычисление r и s, итоговая пара значений
Этапы формирования подписи Эль-Гамаля: выбор случайного числа k, вычисление r и s, итоговая пара значений

Проверка подписи

Получатель знает открытые параметры (p,g,y)(p, g, y), само сообщение mm и подпись (r,s)(r, s). Сначала он проверяет, что 0<r<p0 < r < p и 0<s<p10 < s < p-1 - иначе подпись сразу отвергается. Затем вычисляет хэш H(m)H(m) и сравнивает два значения:

gH(m)modp=?yrrsmodpg^{H(m)} \bmod p \quad \overset{?}{=} \quad y^{r} \cdot r^{s} \bmod p

Если равенство выполняется - подпись подлинна. Корректность проверки следует из подстановки: поскольку H(m)=xr+ks(modp1)H(m) = x \cdot r + k \cdot s \pmod{p-1}, то

yrrs=gxrgks=gxr+ks=gH(m)(modp)y^{r} \cdot r^{s} = g^{x r} \cdot g^{k s} = g^{x r + k s} = g^{H(m)} \pmod{p}

Равенство показателей по модулю p1p-1 гарантирует равенство самих степеней по модулю pp - на этом и строится вся проверка.

Роль случайного числа k

Сессионное число kk - самое уязвимое место схемы. Оно должно быть:

  • случайным - выбираться заново для каждой подписи;
  • секретным - никогда не раскрываться;
  • уникальным - не повторяться на разных сообщениях.

Нарушение любого из этих условий ведёт к катастрофе. Если kk становится известно злоумышленнику, секретный ключ восстанавливается напрямую из формулы:

x=(H(m)ks)r1mod(p1)x = (H(m) - k \cdot s) \cdot r^{-1} \bmod (p-1)

Ещё опаснее повтор: если одно и то же kk использовано для двух разных сообщений, значение rr у обеих подписей совпадёт, и из системы двух уравнений противник вычислит сначала kk, а затем и xx. Именно из-за этой проблемы в современных реализациях kk генерируют детерминированно по RFC 6979, исключая ошибки генератора случайных чисел. Та же уязвимость есть и в подписи ECDSA, унаследовавшей конструкцию от Эль-Гамаля.

Разбор на учебном примере

Чтобы формулы стали наглядными, проследим короткий расчёт с маленькими числами. Пусть p=23p = 23, генератор g=5g = 5, секретный ключ x=6x = 6. Тогда открытый ключ y=56mod23=8y = 5^6 \bmod 23 = 8. Публикуется тройка (23,5,8)(23, 5, 8).

Подписываем сообщение с хэшем H(m)=10H(m) = 10. Выбираем k=3k = 3 - оно взаимно просто с p1=22p-1 = 22. Считаем первую часть: r=53mod23=10r = 5^3 \bmod 23 = 10. Находим обратное k1=31mod22=15k^{-1} = 3^{-1} \bmod 22 = 15 (так как 315=45=222+13 \cdot 15 = 45 = 2 \cdot 22 + 1). Тогда вторая часть:

s=(10610)15mod22=(50)15mod22=0s = (10 - 6 \cdot 10) \cdot 15 \bmod 22 = (-50) \cdot 15 \bmod 22 = 0

Получили s=0s = 0 - такой случай запрещён, поэтому kk нужно перевыбрать. Возьмём k=5k = 5: тогда r=55mod23=20r = 5^5 \bmod 23 = 20, k1=51mod22=9k^{-1} = 5^{-1} \bmod 22 = 9, и s=(10620)9mod22=(110)9mod22s = (10 - 6 \cdot 20) \cdot 9 \bmod 22 = (-110) \cdot 9 \bmod 22. Этот пример показывает, почему проверка s0s \ne 0 и перевыбор kk - обязательные шаги алгоритма, а не формальность.

Чем схема отличается от RSA

И RSA, и Эль-Гамаль - асимметричные схемы, но их математическая основа и поведение различаются:

  • Основа стойкости. RSA опирается на сложность факторизации больших чисел; Эль-Гамаль - на задачу дискретного логарифма.
  • Детерминированность. Подпись RSA для одного сообщения всегда одна и та же. Подпись Эль-Гамаля вероятностная: из-за случайного kk одно сообщение даёт разные подписи при каждом подписании.
  • Размер подписи. Подпись Эль-Гамаля состоит из двух чисел (r,s)(r, s), каждое порядка pp, поэтому она примерно вдвое длиннее модуля. У RSA подпись - одно число.
  • Связь с хэшем. Без хэш-функции схема Эль-Гамаля уязвима к экзистенциальной подделке, поэтому подписывают всегда H(m)H(m), а не сам текст. Требования к хэшу разобраны в материале про хэш-функции.

Прямой потомок схемы - алгоритм DSA, где конструкция Эль-Гамаля оптимизирована: подпись считается в подгруппе меньшего порядка, что сокращает её длину. А переход на эллиптические кривые дал ту же стойкость при ещё меньших ключах - на этом строится постквантовая дискуссия о будущем подписей.

Частые ошибки

  • Считать показатели по модулю pp вместо p1p-1. Значение ss и обратный элемент k1k^{-1} берутся по модулю p1p-1 - порядка группы, а не самого модуля.
  • Брать kk, не взаимно простое с p1p-1. Тогда обратного k1k^{-1} не существует и подпись посчитать нельзя; kk нужно перевыбрать.
  • Подписывать сам текст вместо хэша. Без H(m)H(m) схема допускает подделку; в формулах участвует именно хэш сообщения.
  • Повторно использовать одно kk. Это раскрывает секретный ключ - самая известная практическая атака на схему.
  • Путать rr и ss при проверке. В равенстве yrrsy^{r} \cdot r^{s} показателем при yy стоит rr, а rr возводится в степень ss - перестановка ломает проверку.

FAQ

Чем подпись Эль-Гамаля отличается от шифрования Эль-Гамаля? Это две разные схемы одного автора на общей математической основе. Шифрование скрывает сообщение и использует открытый ключ получателя; подпись подтверждает авторство и использует секретный ключ отправителя. Формулы и роли ключей у них разные.

Почему подпись каждый раз получается другой? Из-за случайного сессионного числа kk: оно входит в обе части подписи (r,s)(r, s), и при новом kk обе части меняются. Это свойство вероятностных схем - в отличие от детерминированной RSA.

Как связаны схема Эль-Гамаля и DSA? DSA - это оптимизированный вариант схемы Эль-Гамаля. Подпись вычисляется в подгруппе простого порядка qq, делящего p1p-1, что заметно сокращает длину подписи при той же стойкости относительно дискретного логарифма.

Коротко

Схема подписи Эль-Гамаля строит цифровую подпись как пару (r,s)(r, s) на основе случайного сессионного числа kk, секретного ключа xx и хэша сообщения; проверка сводится к сравнению gH(m)g^{H(m)} с yrrsy^{r} r^{s} по модулю pp. Стойкость обеспечивает задача дискретного логарифма, а главная практическая опасность - повтор или утечка kk, раскрывающие секретный ключ. Из этой конструкции выросли DSA и подписи на эллиптических кривых.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также