Przejdź do treści

~/cyberbezpieczenstwo cat ecdsa.md

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 Zawolski--aktualizacja=--czas=8 min--dział=Cyberbezpieczeństwo
Ilustracja krzywej eliptycznej i podpisu cyfrowego zabezpieczającego dokument
tldr.txt — W skrócie

~ xad tldr ecdsa

  • 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).
$ tree --spis-tresci

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.

~ man faq

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.

Ten artykuł jest częścią tematu

CZ

$ whoami

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ń.

~ ls ../podobne