Przejdź do treści
Cyberbezpieczeństwo

ECDSA – co to jest i jak działa podpis cyfrowy na krzywych eliptycznych

ECDSA to algorytm podpisu cyfrowego na krzywych eliptycznych używany w TLS, SSH, Bitcoinie i FIDO2. Zobacz, jak działa, czym różni się od RSA i Ed25519.

CZCzarek ZawolskiAktualizacja: 8 min czytania
Ilustracja krzywej eliptycznej i podpisu cyfrowego zabezpieczającego dokument

W skrócie

  • ECDSA (Elliptic Curve Digital Signature Algorithm) to algorytm podpisu cyfrowego oparty na krzywych eliptycznych — służy do podpisywania i weryfikacji, a nie do szyfrowania danych.
  • Klucz ECDSA 256-bit daje bezpieczeństwo porównywalne z RSA 3072-bit przy dużo krótszych kluczach i podpisach.
  • ECDSA działa m.in. w certyfikatach TLS, kluczach SSH, Bitcoinie i Ethereum (krzywa secp256k1), FIDO2/passkeys (ES256) i DNSSEC.
  • Największe ryzyko to zła liczba losowa (nonce): jej powtórzenie lub przewidywalność pozwala odzyskać klucz prywatny, co skompromitowało m.in. PlayStation 3.
  • Do nowych zastosowań często poleca się Ed25519, a w perspektywie komputerów kwantowych — algorytmy postkwantowe, np. ML-DSA (FIPS 204).
Spis treści

ECDSA (Elliptic Curve Digital Signature Algorithm) to algorytm podpisu cyfrowego oparty na kryptografii krzywych eliptycznych. Pozwala właścicielowi klucza prywatnego podpisać dane, a każdemu, kto zna klucz publiczny, sprawdzić, że podpis jest autentyczny i dane nie zostały zmienione. ECDSA nie szyfruje danych — służy wyłącznie do podpisywania i weryfikacji.

Korzystasz z niego codziennie, nawet o tym nie wiedząc: podpisuje certyfikaty wielu stron HTTPS, klucze SSH, transakcje Bitcoina i Ethereum, a także logowanie kluczem bezpieczeństwa lub passkey. Poniżej wyjaśniam, jak działa, czym różni się od RSA i Ed25519 oraz gdzie kryją się jego pułapki.

ECDSA w skrócie: do czego służy podpis cyfrowy

Podpis cyfrowy daje trzy gwarancje:

  • autentyczność — podpis mógł złożyć tylko posiadacz klucza prywatnego,
  • integralność — zmiana choćby jednego bitu danych unieważnia podpis,
  • niezaprzeczalność — podpisujący nie może później twierdzić, że to nie on (o ile klucz prywatny nie wyciekł).

ECDSA realizuje to w schemacie klucza publicznego: klucz prywatny trzymasz w tajemnicy i nim podpisujesz, klucz publiczny rozdajesz i nim każdy weryfikuje. Podpisuje się nie cały dokument, ale jego skrót wyliczony funkcją haszującą, najczęściej SHA-256. Jeśli chcesz odświeżyć, jak działają takie skróty, zajrzyj do artykułu o funkcji skrótu kryptograficznego.

ECDSA jest wariantem starszego algorytmu DSA, przeniesionym z arytmetyki modularnej na krzywe eliptyczne. Opisuje go standard NIST FIPS 186 (aktualna wersja 186-5 z 2023 r., w której klasyczny DSA nie jest już zatwierdzony do tworzenia nowych podpisów) oraz ANSI X9.62.

Krzywe eliptyczne bez ciężkiej matematyki

Krzywa eliptyczna w kryptografii to zbiór punktów spełniających równanie y² = x³ + ax + b, liczonych nie na liczbach rzeczywistych, ale modulo duża liczba pierwsza. Na takich punktach można zdefiniować „dodawanie”, a więc też mnożenie punktu przez liczbę: Q = d · G to punkt G dodany do siebie d razy.

Cała siła ECDSA wynika z asymetrii:

  • policzenie Q = d · G przy znanym d jest szybkie,
  • odtworzenie d z Q i G (problem logarytmu dyskretnego na krzywej eliptycznej) jest dla dobrze dobranych krzywych praktycznie niewykonalne na klasycznych komputerach.

W ECDSA G to publicznie znany punkt bazowy krzywej, d to klucz prywatny (losowa liczba), a Q — klucz publiczny.

Najpopularniejsze krzywe

KrzywaInne nazwyGdzie się spotyka
P-256secp256r1, prime256v1, nistp256TLS, FIDO2/WebAuthn (ES256), JWT, DNSSEC, karty i tokeny
P-384secp384r1, nistp384certyfikaty o wyższym poziomie bezpieczeństwa, administracja
P-521secp521r1, nistp521rzadziej, gdy polityka wymaga maksimum
secp256k1—Bitcoin, Ethereum i wiele innych kryptowalut

Krzywa secp256k1 ma bardzo prostą postać y² = x³ + 7 i nie należy do zestawu zalecanego przez NIST. Satoshi Nakamoto nigdy nie wyjaśnił tego wyboru; często wskazuje się, że jej parametry są „przejrzyste” i trudno podejrzewać w nich ukrytą furtkę.

Jak działa podpis ECDSA krok po kroku

Oznaczenia: G — punkt bazowy, n — rząd punktu G, d — klucz prywatny, Q = d · G — klucz publiczny, H — funkcja skrótu.

Podpisywanie

  1. Policz skrót wiadomości: e = H(m) (obcięty do długości n).
  2. Wybierz tajną, jednorazową liczbę k z zakresu 1…n−1 (nonce).
  3. Policz punkt R = k · G i weź jego współrzędną x: r = x_R mod n. Jeśli r = 0, wróć do kroku 2.
  4. Policz s = k⁻¹ · (e + r · d) mod n. Jeśli s = 0, wróć do kroku 2.
  5. Podpisem jest para liczb (r, s).

Weryfikacja

  1. Sprawdź, czy r i s są w zakresie 1…n−1.
  2. Policz e = H(m) oraz w = s⁻¹ mod n.
  3. Policz u1 = e · w mod n i u2 = r · w mod n.
  4. Policz punkt X = u1 · G + u2 · Q.
  5. Podpis jest poprawny, jeśli x_X mod n = r.

Weryfikujący nie zna ani d, ani k, a mimo to — dzięki własnościom arytmetyki na krzywej — trafia dokładnie w ten sam punkt R, jeśli podpis złożył właściciel klucza i dane się nie zmieniły.

Dla krzywej P-256 podpis to dwie liczby po 32 bajty, czyli 64 bajty (w kodowaniu DER zwykle 70–72 bajty). Podpis RSA o porównywalnym bezpieczeństwie (3072 bity) ma 384 bajty.

Największa pułapka: liczba k (nonce)

Bezpieczeństwo ECDSA w ogromnym stopniu zależy od liczby k. Musi być tajna, nieprzewidywalna i nigdy niepowtórzona. Jeśli dwa podpisy różnych wiadomości użyją tego samego k, z prostego układu równań można wyliczyć klucz prywatny. Nawet częściowo przewidywalne k (np. kilka znanych bitów) wystarcza w atakach kratowych.

To nie teoria:

  • PlayStation 3 (2010) — Sony podpisywało oprogramowanie ECDSA, używając stałej wartości k. Grupa fail0verflow odzyskała klucz prywatny, co pozwoliło podpisywać dowolny kod na konsolę.
  • Portfele Bitcoin na Androidzie (2013) — błąd w generatorze liczb losowych powodował powtarzanie k, co umożliwiło kradzież środków z części portfeli.

Dlatego współczesne biblioteki generują k deterministycznie z klucza prywatnego i skrótu wiadomości według RFC 6979 albo łączą tę metodę z losowością. Wniosek praktyczny: nigdy nie implementuj ECDSA samodzielnie — korzystaj z dojrzałych bibliotek (OpenSSL, BoringSSL, libsodium dla Ed25519, cryptography w Pythonie).

Uwaga: Kryptografia „pisana od zera” do celów produkcyjnych to prosty przepis na wyciek kluczy. Błędy w generowaniu k, porównywaniu podpisów czy walidacji punktów nie są widoczne w testach — wychodzą dopiero przy ataku.

Plastyczność podpisu

Dla poprawnego podpisu (r, s) para (r, n − s) też jest poprawna. Nie pozwala to podrobić podpisu, ale zmienia jego bajty. W Bitcoinie prowadziło to do problemu z modyfikacją identyfikatorów transakcji, dlatego sieć wymusza tzw. low-S, czyli wybór mniejszej z dwóch wartości.

ECDSA vs RSA vs Ed25519

CechaRSAECDSAEd25519 (EdDSA)
Klucz dla ~128 bitów bezpieczeństwa3072 bity256 bitów256 bitów
Rozmiar podpisu384 B (RSA-3072)64 B (P-256, surowy)64 B
Szybkość podpisywaniawolneszybkiebardzo szybkie
Szybkość weryfikacjibardzo szybkawolniejsza niż RSAszybka
Losowość przy podpisiezależnie od schematupotrzebny bezpieczny nonce (lub RFC 6979)deterministyczne z natury
Typowe zastosowaniastarsze PKI, podpisy dokumentów, zgodnośćTLS, FIDO2, kryptowaluty, karty, DNSSECSSH, Signal, nowe protokoły, podpisy pakietów

ECDSA zastąpiło RSA tam, gdzie liczy się rozmiar i wydajność: urządzenia IoT, karty kryptograficzne, telefony, certyfikaty TLS. Ed25519 jest prostszy w bezpiecznej implementacji, ale nie wszędzie jest dostępny (np. w części sprzętowych modułów HSM i starszych systemów), dlatego ECDSA na krzywej P-256 pozostaje bardzo popularnym wyborem.

Pamiętaj też, że w TLS ECDSA odpowiada tylko za uwierzytelnienie serwera. Klucz sesji uzgadnia ECDHE — więcej o samej idei uzgadniania kluczy w artykule o algorytmie Diffiego-Hellmana, a dane szyfruje już algorytm symetryczny, najczęściej AES lub ChaCha20.

Gdzie spotkasz ECDSA w praktyce

  • HTTPS — certyfikaty z kluczem EC (np. P-256) wydaje m.in. Let’s Encrypt; wiele serwerów ma jednocześnie certyfikat RSA i ECDSA.
  • SSH — klucze typu ecdsa-sha2-nistp256, choć do nowych kluczy częściej poleca się Ed25519.
  • Kryptowaluty — Bitcoin podpisuje transakcje ECDSA na secp256k1 (od aktualizacji Taproot w 2021 r. dostępne są też podpisy Schnorra), Ethereum używa ECDSA na tej samej krzywej.
  • FIDO2, WebAuthn i passkeys — najczęściej używany algorytm to ES256, czyli ECDSA P-256 z SHA-256. Szczegóły w tekście FIDO2 – jak działa.
  • JWT i API — algorytmy ES256, ES384 w tokenach.
  • DNSSEC — algorytm 13 (ECDSAP256SHA256) jest jednym z zalecanych do podpisywania stref.

Historia blockchaina i kryptowalut, w których transakcje podpisuje ECDSA

Jak wygenerować klucz i podpisać plik ECDSA w OpenSSL

Generowanie pary kluczy na krzywej P-256:

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out prywatny.pem
openssl pkey -in prywatny.pem -pubout -out publiczny.pem

Podpisanie i weryfikacja pliku (SHA-256):

openssl dgst -sha256 -sign prywatny.pem -out podpis.bin umowa.pdf
openssl dgst -sha256 -verify publiczny.pem -signature podpis.bin umowa.pdf
# Verified OK

Klucz SSH na krzywej eliptycznej:

ssh-keygen -t ecdsa -b 256 -C "jan@laptop"
# alternatywa zalecana do nowych kluczy:
ssh-keygen -t ed25519 -C "jan@laptop"

To samo w Pythonie z biblioteką cryptography:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec

klucz = ec.generate_private_key(ec.SECP256R1())
podpis = klucz.sign(b"przelew 100 PLN", ec.ECDSA(hashes.SHA256()))

# rzuca InvalidSignature, jeśli dane lub podpis zostały zmienione
klucz.public_key().verify(podpis, b"przelew 100 PLN", ec.ECDSA(hashes.SHA256()))

Czy ECDSA jest nadal bezpieczne

Przy poprawnej implementacji i standardowych krzywych (P-256, P-384, secp256k1) ECDSA jest dziś uznawane za bezpieczne wobec klasycznych komputerów. Realne incydenty wynikały z błędów implementacji — złego k, wycieków przez kanały boczne (czas wykonania, pobór prądu) — a nie ze złamania samej matematyki.

Długoterminowym zagrożeniem są komputery kwantowe. Algorytm Shora na odpowiednio dużej maszynie rozwiązałby problem logarytmu dyskretnego na krzywej i odtworzył klucz prywatny z publicznego. W 2024 r. NIST opublikował pierwsze standardy podpisów postkwantowych — FIPS 204 (ML-DSA) i FIPS 205 (SLH-DSA) — i zapowiada stopniowe wycofywanie ECDSA oraz RSA w perspektywie lat 2030–2035. Dla systemów, które mają działać kilkanaście lat (PKI, firmware urządzeń, archiwalne podpisy), planowanie migracji warto zacząć już teraz.

Jeśli dobierasz algorytm do nowego projektu: do SSH i własnych protokołów wybierz Ed25519, do TLS i WebAuthn — ECDSA P-256 (to domyślny, najlepiej wspierany wybór), a tam, gdzie wymagana jest zgodność ze starszymi systemami, zostaw RSA 3072 lub dłuższe. W każdym przypadku najważniejsze jest bezpieczne przechowywanie klucza prywatnego — najlepiej w module sprzętowym lub kluczu bezpieczeństwa.

Najczęściej zadawane pytania

Co to jest ECDSA?

ECDSA to Elliptic Curve Digital Signature Algorithm, czyli algorytm podpisu cyfrowego wykorzystujący kryptografię krzywych eliptycznych. Właściciel klucza prywatnego podpisuje dane, a każdy z kluczem publicznym może sprawdzić, że podpis jest prawdziwy i dane nie zostały zmienione.

Czy ECDSA szyfruje dane?

Nie. ECDSA służy wyłącznie do podpisów cyfrowych. Do uzgadniania kluczy na krzywych eliptycznych używa się ECDH, a samo szyfrowanie danych wykonują algorytmy symetryczne, takie jak AES.

Co jest lepsze: RSA czy ECDSA?

Przy porównywalnym bezpieczeństwie ECDSA ma znacznie krótsze klucze i podpisy oraz szybciej podpisuje, dlatego jest dziś standardem w nowych certyfikatach TLS i urządzeniach. RSA szybciej weryfikuje podpisy i bywa potrzebne dla zgodności ze starszymi systemami.

ECDSA czy Ed25519 do kluczy SSH?

Do nowych kluczy SSH zwykle wybiera się Ed25519: jest szybki, ma deterministyczne podpisy i mniej pułapek implementacyjnych. ECDSA (np. nistp256) ma sens, gdy wymaga tego polityka zgodności z NIST lub sprzęt, który nie obsługuje Ed25519.

Czy komputery kwantowe złamią ECDSA?

Wystarczająco duży komputer kwantowy z algorytmem Shora mógłby odtworzyć klucz prywatny z publicznego. Takiego komputera jeszcze nie ma, ale NIST opublikował już standardy podpisów postkwantowych (ML-DSA, SLH-DSA) i planuje stopniowe wycofywanie ECDSA i RSA w perspektywie 2030–2035.

CZ

Autor

Czarek Zawolski

Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.