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

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

25 мая 2026Время чтения: 8 минут
#криптография#ecdsa#цифровая подпись#эллиптические кривые#secp256k1
Цифровая подпись ECDSA: как устроена и как проверяется

Цифровая подпись ECDSA (Elliptic Curve Digital Signature Algorithm) - это алгоритм электронной подписи, перенесённый из классической схемы DSA в группу точек эллиптической кривой. Он позволяет владельцу приватного ключа подписать сообщение так, что любой обладатель публичного ключа сможет убедиться в авторстве и целостности данных, но не сможет подделать подпись. ECDSA даёт ту же стойкость, что и RSA, при кратно меньшей длине ключа, поэтому он лежит в основе TLS-сертификатов, протокола Bitcoin (кривая secp256k1) и SSH-ключей. В этой статье разберём математику эллиптических кривых под подписью, пошаговую генерацию и проверку пары (r,s)(r, s), критическую роль случайного nonce kk, выбор кривой и характерные ошибки, на которых студенты теряют баллы на экзамене по криптографии.

Что такое цифровая подпись ECDSA

Цифровая подпись решает три задачи сразу: подтверждает авторство (аутентификация), гарантирует, что сообщение не изменили (целостность), и не даёт автору отказаться от подписанного (неотказуемость). В отличие от обмена ключами, где стороны вырабатывают общий секрет, подпись асимметрична по ролям: приватным ключом подписывают, а публичным - проверяют.

ECDSA строится на эллиптической кривой над конечным полем. Приватный ключ - это случайное целое число dd, публичный ключ - точка Q=dGQ = dG, где GG - заранее фиксированная базовая точка (генератор) группы. Перейти от dd к QQ легко, а восстановить dd по QQ - это задача дискретного логарифма на эллиптической кривой (ECDLP), для которой не известно эффективного алгоритма. Именно на этой односторонности и держится стойкость подписи.

Чтобы увидеть, как из приватного ключа и хэша сообщения рождается конкретная пара чисел (r,s)(r, s) и как проверяющая сторона подтверждает её, удобно прогнать алгоритм пошагово. Воспользуйтесь конструктором ниже.

Математическая основа: эллиптические кривые

Под подписью лежит эллиптическая кривая в форме Вейерштрасса над конечным полем Fp\mathbb{F}_p: y2=x3+ax+b(modp),y^2 = x^3 + ax + b \pmod p, где коэффициенты aa, bb и простой модуль pp заданы стандартом. Точки кривой вместе с «бесконечно удалённой» точкой O\mathcal{O} образуют конечную абелеву группу относительно операции сложения точек. Сложение определяется геометрически (через секущую и касательную), но в поле Fp\mathbb{F}_p вычисляется по явным формулам с модульной арифметикой.

Ключевая операция - скалярное умножение точки: kG=G+G++GkG = G + G + \dots + G (kk слагаемых). Его считают быстро методом удвоения-сложения за O(logk)O(\log k) операций. Обратная задача - найти kk по известным GG и kGkG - это и есть ECDLP. Порядок базовой точки обозначают nn: это наименьшее число, для которого nG=OnG = \mathcal{O}. Все вычисления показателей в подписи идут по модулю nn.

Генерация подписи: пара (r, s)

Пусть нужно подписать сообщение mm приватным ключом dd. Алгоритм генерации цифровой подписи ECDSA укладывается в несколько шагов.

  1. Вычислить хэш сообщения e=HASH(m)e = \text{HASH}(m) (например, SHA-256) и взять его как целое число (при необходимости усечь до длины nn).
  2. Сгенерировать криптографически случайный nonce kk из диапазона [1,n1][1, n-1] - свежий для каждой подписи.
  3. Вычислить точку kG=(x1,y1)kG = (x_1, y_1) и положить r=x1modnr = x_1 \bmod n. Если r=0r = 0 - выбрать другой kk.
  4. Вычислить s=k1(e+rd)modns = k^{-1}(e + r d) \bmod n. Если s=0s = 0 - выбрать другой kk.
  5. Подпись - пара (r,s)(r, s).

Здесь k1k^{-1} - это обратный элемент к kk по модулю nn. Приватный ключ dd входит в формулу для ss, поэтому без него вычислить корректную ss нельзя, а сам dd из подписи извлечь не получается - он «спрятан» под умножением на rr и сложением с ee.

Nonce $k$ должен быть уникальным и непредсказуемым для каждой подписи. Повтор одного $k$ на двух разных сообщениях позволяет вычислить приватный ключ из двух подписей за пару строк арифметики - именно так в 2010 году был взломан ключ подписи PlayStation 3.

Проверка подписи публичным ключом

Проверяющий знает публичный ключ QQ, параметры кривой, сообщение mm и подпись (r,s)(r, s). Алгоритм проверки:

  1. Убедиться, что rr и ss лежат в диапазоне [1,n1][1, n-1] - иначе подпись недействительна.
  2. Вычислить хэш e=HASH(m)e = \text{HASH}(m).
  3. Вычислить w=s1modnw = s^{-1} \bmod n.
  4. Вычислить два коэффициента: u1=ewmodnu_1 = e\,w \bmod n и u2=rwmodnu_2 = r\,w \bmod n.
  5. Вычислить точку (x1,y1)=u1G+u2Q(x_1, y_1) = u_1 G + u_2 Q.
  6. Подпись верна тогда и только тогда, когда x1modn=rx_1 \bmod n = r.

Почему это работает? Подставим Q=dGQ = dG и распишем точку через скаляр при GG: u1G+u2Q=(u1+u2d)G=(ew+rwd)G=w(e+rd)G.u_1 G + u_2 Q = (u_1 + u_2 d) G = (e w + r w d) G = w(e + r d) G. Так как s=k1(e+rd)s = k^{-1}(e + rd), то w=s1=k(e+rd)1w = s^{-1} = k(e + rd)^{-1}, и выражение схлопывается: w(e+rd)G=kG.w(e + rd) G = k G. А координата xx точки kGkG как раз и есть rr по построению. Совпадение x1modn=rx_1 \bmod n = r доказывает, что подпись сделана владельцем dd, причём проверяющему сам dd не нужен.

Выбор эллиптической кривой

Стойкость ECDSA напрямую зависит от параметров кривой - их не придумывают, а берут из стандартов.

  • secp256k1 - кривая y2=x3+7y^2 = x^3 + 7 над Fp\mathbb{F}_p с особым простым pp. Используется в Bitcoin и Ethereum; даёт 128-битный уровень стойкости при 256-битном ключе.
  • secp256r1 (P-256, NIST) - самая распространённая в TLS и сертификатах кривая, тоже 256 бит и ~128 бит стойкости.
  • Ed25519 - формально это EdDSA (схема Эдвардса), не ECDSA, но решает ту же задачу подписи; её часто выбирают за детерминированность и устойчивость к ошибкам реализации.

Общее правило: 256-битная кривая ECDSA по стойкости соответствует примерно 3072-битному ключу RSA. Эта компактность - главное преимущество эллиптической криптографии. Сама идея переноса в группу точек кривой роднит ECDSA с протоколом обмена ключами Диффи-Хеллмана, у которого есть эллиптический вариант ECDH на тех же кривых.

Стойкость и квантовая угроза

Безопасность ECDSA опирается на сложность ECDLP: восстановить приватный dd по публичному Q=dGQ = dG классическими методами (например, ρ\rho-методом Полларда) требует порядка n\sqrt{n} операций - для 256-битной кривой это около 21282^{128}, что недостижимо. Однако алгоритм Шора на достаточно большом квантовом компьютере решает ECDLP за полиномиальное время, поэтому ECDSA, как и RSA, считается квантово-уязвимым. На смену ему готовят постквантовые схемы подписи - об этом подробнее в материале про квантово-устойчивую криптографию.

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

  • Повтор или предсказуемый nonce kk. Самая опасная ошибка: два сообщения с одним kk раскрывают приватный ключ. Решение - использовать детерминированный kk по RFC 6979 или криптографически стойкий генератор.
  • Путают приватный и публичный ключ. Подписывают приватным dd, проверяют публичным Q=dGQ = dG. Передавать наружу можно только QQ.
  • Не проверяют диапазон rr и ss. Значения вне [1,n1][1, n-1] должны отвергаться; иначе возможны атаки на реализацию.
  • Подписывают само сообщение вместо его хэша. В формулу для ss входит хэш e=HASH(m)e = \text{HASH}(m), а не сырой текст; длина сообщения произвольна, а ee фиксированной длины.
  • Берут модуль nn и модуль поля pp за одно и то же. Координаты точек считаются по модулю pp, а показатели kk, ss, dd - по модулю порядка группы nn; это разные числа.

FAQ

Чем ECDSA отличается от RSA-подписи? RSA-подпись строится на сложности факторизации больших чисел, ECDSA - на сложности дискретного логарифма на эллиптической кривой. При одинаковой стойкости ECDSA использует кратно более короткие ключи (256 бит против 3072 у RSA), поэтому подписи и ключи компактнее, а операции на современных устройствах часто быстрее.

Зачем подпись состоит из двух чисел (r,s)(r, s)? rr - это координата xx случайной точки kGkG, она «привязывает» подпись к конкретному nonce kk. ss связывает хэш сообщения ee, приватный ключ dd и тот же kk в одно соотношение. Проверка восстанавливает точку kGkG из (r,s)(r, s), публичного ключа и хэша и сверяет её координату xx с rr.

Можно ли подделать подпись, зная только публичный ключ? Нет. Для корректной ss нужен приватный ключ dd, а вычислить его из публичного Q=dGQ = dG - это ECDLP, неразрешимая за разумное время для стандартных кривых. Поэтому публичный ключ безопасно распространять открыто.

Коротко

Цифровая подпись ECDSA подписывает хэш сообщения приватным ключом dd, выдавая пару (r,s)(r, s), где r=(kG)xmodnr = (kG)_x \bmod n, а s=k1(e+rd)modns = k^{-1}(e + rd) \bmod n. Проверка восстанавливает точку u1G+u2Q=kGu_1 G + u_2 Q = kG из публичного ключа и сверяет её xx-координату с rr. Стойкость держится на сложности дискретного логарифма на эллиптической кривой, безопасность реализации - на уникальном непредсказуемом nonce kk и правильно выбранной стандартной кривой вроде secp256k1.

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

Открыть EssayAI

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

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