鍵は、1…n−1 の範囲の秘密スカラー d と公開点 Q = d·G です。ここで G は曲線のベースポイント、n はその素数位数です。ハッシュ値 z に署名するとき、署名者は秘密の nonce k を選び、k·G の x 座標を n で割った余りを r とし、s = k⁻¹·(z + r·d) mod n を計算します。検証者は u₁ = z·s⁻¹ と u₂ = r·s⁻¹ を計算し、u₁·G + u₂·Q の x 座標が r に等しいことを確認します(FIPS 186-5 §6.4)。ハッシュ値は n のビット長に切り詰められるため、P-256 で SHA-512 を使うと、その左端の 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 です。
同じ署名が 2 つのエンコーディングでやり取りされます。固定長の生の r‖s(P-256 では 64 バイト。JOSE、WebCrypto、COSE)と、2 つの INTEGER からなる ASN.1 DER の SEQUENCE(P-256 では 70〜72 バイト。X.509、TLS、OpenSSL、Java)です。有効な (r, s) に対しては組 (r, n − s) も検証に通るため、ブロックチェーンでは low-S 署名が必須とされています。
nonce が弱点です。k が重複したり、わずかに偏っていたりすると秘密鍵が明らかになるため、最近のライブラリは nonce を決定的に導出する(RFC 6979。FIPS 186-5 §6.3.2 で承認)か、乱数を組み合わせてヘッジします。Apple M4 Max の 1 コアで、OpenSSL 3.6.5 は 1 秒あたり約 87,000 回の P-256 署名と約 29,000 回の検証を行います。NIST IR 8547(初期公開ドラフト)は、Shor のアルゴリズムで破られることを理由に、2035年以降はすべての強度で ECDSA を禁止することを提案しています。