Ключи — закрытый скаляр d в диапазоне 1…n−1 и открытая точка Q = d·G, где G — базовая точка кривой, а n — её простой порядок. Чтобы подписать хеш z, подписант выбирает секретный nonce k, принимает за r координату x точки k·G по модулю n и вычисляет s = k⁻¹·(z + r·d) mod n; проверяющая сторона вычисляет u₁ = z·s⁻¹ и u₂ = r·s⁻¹ и проверяет, что координата x точки u₁·G + u₂·Q равна r (FIPS 186-5, § 6.4). Хеш усекается до битовой длины n, поэтому при SHA-512 с P-256 используются только его левые 256 бит.
Распространённые идентификаторы: в X.509 ecdsa-with-SHA256 — это 1.2.840.10045.4.3.2 (SHA-384: …4.3.3, SHA-512: …4.3.4); в JOSE — ES256, ES384, ES512 и ES256K; в COSE — −7, −35, −36 и −47; в TLS 1.3 — ecdsa_secp256r1_sha256 (0x0403). Обычные кривые — P-256, P-384, P-521 и, для блокчейнов, secp256k1.
Одна и та же подпись встречается в двух кодировках: формат raw r‖s фиксированной длины (64 байта для P-256; JOSE, WebCrypto, COSE) и ASN.1 DER SEQUENCE из двух INTEGER (70–72 байта для P-256; X.509, TLS, OpenSSL, Java). Для любой верной пары (r, s) проверку проходит и пара (r, n − s), поэтому блокчейны требуют подписей low-S.
Слабое место — nonce: повторный или слегка смещённый k раскрывает закрытый ключ, поэтому современные библиотеки выводят его детерминированно (RFC 6979, одобренный в FIPS 186-5, § 6.3.2) или дополняют случайностью (hedging). На одном ядре Apple M4 Max OpenSSL 3.6.5 создаёт около 87 000 подписей P-256 и выполняет около 29 000 проверок в секунду. NIST IR 8547 (первый публичный черновик) предлагает запретить ECDSA при любом уровне стойкости после 2035 года, потому что алгоритм Шора его взламывает.