Цифровая подпись ECDSA: как устроена и как проверяется

Цифровая подпись ECDSA (Elliptic Curve Digital Signature Algorithm) - это алгоритм электронной подписи, перенесённый из классической схемы DSA в группу точек эллиптической кривой. Он позволяет владельцу приватного ключа подписать сообщение так, что любой обладатель публичного ключа сможет убедиться в авторстве и целостности данных, но не сможет подделать подпись. ECDSA даёт ту же стойкость, что и RSA, при кратно меньшей длине ключа, поэтому он лежит в основе TLS-сертификатов, протокола Bitcoin (кривая secp256k1) и SSH-ключей. В этой статье разберём математику эллиптических кривых под подписью, пошаговую генерацию и проверку пары , критическую роль случайного nonce , выбор кривой и характерные ошибки, на которых студенты теряют баллы на экзамене по криптографии.
Что такое цифровая подпись ECDSA
Цифровая подпись решает три задачи сразу: подтверждает авторство (аутентификация), гарантирует, что сообщение не изменили (целостность), и не даёт автору отказаться от подписанного (неотказуемость). В отличие от обмена ключами, где стороны вырабатывают общий секрет, подпись асимметрична по ролям: приватным ключом подписывают, а публичным - проверяют.
ECDSA строится на эллиптической кривой над конечным полем. Приватный ключ - это случайное целое число , публичный ключ - точка , где - заранее фиксированная базовая точка (генератор) группы. Перейти от к легко, а восстановить по - это задача дискретного логарифма на эллиптической кривой (ECDLP), для которой не известно эффективного алгоритма. Именно на этой односторонности и держится стойкость подписи.
Чтобы увидеть, как из приватного ключа и хэша сообщения рождается конкретная пара чисел и как проверяющая сторона подтверждает её, удобно прогнать алгоритм пошагово. Воспользуйтесь конструктором ниже.
Математическая основа: эллиптические кривые
Под подписью лежит эллиптическая кривая в форме Вейерштрасса над конечным полем : где коэффициенты , и простой модуль заданы стандартом. Точки кривой вместе с «бесконечно удалённой» точкой образуют конечную абелеву группу относительно операции сложения точек. Сложение определяется геометрически (через секущую и касательную), но в поле вычисляется по явным формулам с модульной арифметикой.
Ключевая операция - скалярное умножение точки: ( слагаемых). Его считают быстро методом удвоения-сложения за операций. Обратная задача - найти по известным и - это и есть ECDLP. Порядок базовой точки обозначают : это наименьшее число, для которого . Все вычисления показателей в подписи идут по модулю .
Генерация подписи: пара (r, s)
Пусть нужно подписать сообщение приватным ключом . Алгоритм генерации цифровой подписи ECDSA укладывается в несколько шагов.
- Вычислить хэш сообщения (например, SHA-256) и взять его как целое число (при необходимости усечь до длины ).
- Сгенерировать криптографически случайный nonce из диапазона - свежий для каждой подписи.
- Вычислить точку и положить . Если - выбрать другой .
- Вычислить . Если - выбрать другой .
- Подпись - пара .
Здесь - это обратный элемент к по модулю . Приватный ключ входит в формулу для , поэтому без него вычислить корректную нельзя, а сам из подписи извлечь не получается - он «спрятан» под умножением на и сложением с .
Nonce $k$ должен быть уникальным и непредсказуемым для каждой подписи. Повтор одного $k$ на двух разных сообщениях позволяет вычислить приватный ключ из двух подписей за пару строк арифметики - именно так в 2010 году был взломан ключ подписи PlayStation 3.
Проверка подписи публичным ключом
Проверяющий знает публичный ключ , параметры кривой, сообщение и подпись . Алгоритм проверки:
- Убедиться, что и лежат в диапазоне - иначе подпись недействительна.
- Вычислить хэш .
- Вычислить .
- Вычислить два коэффициента: и .
- Вычислить точку .
- Подпись верна тогда и только тогда, когда .
Почему это работает? Подставим и распишем точку через скаляр при : Так как , то , и выражение схлопывается: А координата точки как раз и есть по построению. Совпадение доказывает, что подпись сделана владельцем , причём проверяющему сам не нужен.
Выбор эллиптической кривой
Стойкость ECDSA напрямую зависит от параметров кривой - их не придумывают, а берут из стандартов.
- secp256k1 - кривая над с особым простым . Используется в Bitcoin и Ethereum; даёт 128-битный уровень стойкости при 256-битном ключе.
- secp256r1 (P-256, NIST) - самая распространённая в TLS и сертификатах кривая, тоже 256 бит и ~128 бит стойкости.
- Ed25519 - формально это EdDSA (схема Эдвардса), не ECDSA, но решает ту же задачу подписи; её часто выбирают за детерминированность и устойчивость к ошибкам реализации.
Общее правило: 256-битная кривая ECDSA по стойкости соответствует примерно 3072-битному ключу RSA. Эта компактность - главное преимущество эллиптической криптографии. Сама идея переноса в группу точек кривой роднит ECDSA с протоколом обмена ключами Диффи-Хеллмана, у которого есть эллиптический вариант ECDH на тех же кривых.
Стойкость и квантовая угроза
Безопасность ECDSA опирается на сложность ECDLP: восстановить приватный по публичному классическими методами (например, -методом Полларда) требует порядка операций - для 256-битной кривой это около , что недостижимо. Однако алгоритм Шора на достаточно большом квантовом компьютере решает ECDLP за полиномиальное время, поэтому ECDSA, как и RSA, считается квантово-уязвимым. На смену ему готовят постквантовые схемы подписи - об этом подробнее в материале про квантово-устойчивую криптографию.
Частые ошибки
- Повтор или предсказуемый nonce . Самая опасная ошибка: два сообщения с одним раскрывают приватный ключ. Решение - использовать детерминированный по RFC 6979 или криптографически стойкий генератор.
- Путают приватный и публичный ключ. Подписывают приватным , проверяют публичным . Передавать наружу можно только .
- Не проверяют диапазон и . Значения вне должны отвергаться; иначе возможны атаки на реализацию.
- Подписывают само сообщение вместо его хэша. В формулу для входит хэш , а не сырой текст; длина сообщения произвольна, а фиксированной длины.
- Берут модуль и модуль поля за одно и то же. Координаты точек считаются по модулю , а показатели , , - по модулю порядка группы ; это разные числа.
FAQ
Чем ECDSA отличается от RSA-подписи? RSA-подпись строится на сложности факторизации больших чисел, ECDSA - на сложности дискретного логарифма на эллиптической кривой. При одинаковой стойкости ECDSA использует кратно более короткие ключи (256 бит против 3072 у RSA), поэтому подписи и ключи компактнее, а операции на современных устройствах часто быстрее.
Зачем подпись состоит из двух чисел ? - это координата случайной точки , она «привязывает» подпись к конкретному nonce . связывает хэш сообщения , приватный ключ и тот же в одно соотношение. Проверка восстанавливает точку из , публичного ключа и хэша и сверяет её координату с .
Можно ли подделать подпись, зная только публичный ключ? Нет. Для корректной нужен приватный ключ , а вычислить его из публичного - это ECDLP, неразрешимая за разумное время для стандартных кривых. Поэтому публичный ключ безопасно распространять открыто.
Коротко
Цифровая подпись ECDSA подписывает хэш сообщения приватным ключом , выдавая пару , где , а . Проверка восстанавливает точку из публичного ключа и сверяет её -координату с . Стойкость держится на сложности дискретного логарифма на эллиптической кривой, безопасность реализации - на уникальном непредсказуемом nonce и правильно выбранной стандартной кривой вроде secp256k1.
Читайте также

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

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

Алгоритм Рабина-Карпа: поиск подстроки за O(n+m)
Разбираем алгоритм Рабина-Карпа: как полиномиальный хеш и скользящее окно ускоряют поиск подстроки до O(n+m) в среднем, почему бывают ложные совпадения и при чём тут плагиат.