~/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.

~ 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 · Gprzy znanymdjest szybkie, - odtworzenie
dzQiG(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
| Krzywa | Inne nazwy | Gdzie się spotyka |
|---|---|---|
| P-256 | secp256r1, prime256v1, nistp256 | TLS, FIDO2/WebAuthn (ES256), JWT, DNSSEC, karty i tokeny |
| P-384 | secp384r1, nistp384 | certyfikaty o wyższym poziomie bezpieczeństwa, administracja |
| P-521 | secp521r1, nistp521 | rzadziej, 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
- Policz skrót wiadomości:
e = H(m)(obcięty do długościn). - Wybierz tajną, jednorazową liczbę
kz zakresu 1…n−1 (nonce). - Policz punkt
R = k · Gi weź jego współrzędną x:r = x_R mod n. Jeślir = 0, wróć do kroku 2. - Policz
s = k⁻¹ · (e + r · d) mod n. Jeślis = 0, wróć do kroku 2. - Podpisem jest para liczb
(r, s).
Weryfikacja
- Sprawdź, czy
rissą w zakresie 1…n−1. - Policz
e = H(m)orazw = s⁻¹ mod n. - Policz
u1 = e · w mod niu2 = r · w mod n. - Policz punkt
X = u1 · G + u2 · Q. - 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
| Cecha | RSA | ECDSA | Ed25519 (EdDSA) |
|---|---|---|---|
| Klucz dla ~128 bitów bezpieczeństwa | 3072 bity | 256 bitów | 256 bitów |
| Rozmiar podpisu | 384 B (RSA-3072) | 64 B (P-256, surowy) | 64 B |
| Szybkość podpisywania | wolne | szybkie | bardzo szybkie |
| Szybkość weryfikacji | bardzo szybka | wolniejsza niż RSA | szybka |
| Losowość przy podpisie | zależnie od schematu | potrzebny bezpieczny nonce (lub RFC 6979) | deterministyczne z natury |
| Typowe zastosowania | starsze PKI, podpisy dokumentów, zgodność | TLS, FIDO2, kryptowaluty, karty, DNSSEC | SSH, 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,ES384w tokenach. - DNSSEC — algorytm 13 (ECDSAP256SHA256) jest jednym z zalecanych do podpisywania stref.

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


