Zum Inhalt springen

Secp256k1

Aus BitcoinWiki

secp256k1 ist eine standardisierte elliptische Kurve, die Bitcoin für Public-Key-Kryptografie verwendet. Sie gehört zu den in SEC 2 veröffentlichten Domänenparametersätzen der Standards for Efficient Cryptography Group.[1]

Die Kurve ist über dem Primkörper mit p = 2^256 − 2^32 − 977 durch y^2 = x^3 + 7 definiert. SEC 2 bestimmt außerdem den Generatorpunkt G, seine Primordnung n und den Kofaktor 1. Der Name bezeichnet diese Parameter, nicht ein Signaturformat oder eine Kodierung.

Domänenparameter

In der SEC-Namenskonvention steht sec für die Standards, p für eine Primkörperkurve, 256 für die Feldgröße, k für eine Koblitz-assoziierte Kurve und 1 für die laufende Nummer. SEC 2 ordnet ihr ein geschätztes Sicherheitsniveau von 128 Bit zu und nennt diese exakten Werte:[1]

Parameter Wert
p FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a, b 0, 7
komprimiertes G 0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
n FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
h 1

Die Koblitz-assoziierte Struktur erlaubt spezialisierte Arithmetik einschließlich eines effizient berechenbaren Endomorphismus. libsecp256k1 verbindet solche Verfahren mit vorberechneten Tabellen und weiteren Optimierungen. Die Leistung hängt von der Implementierung ab; ein allgemeiner Prozentwert folgt daraus nicht.[2]

Schlüssel und Signaturen

Ein Bitcoin-Privatschlüssel ist ein Skalar im durch die Kurvenordnung bestimmten gültigen Bereich. Der öffentliche Schlüssel ist ein Kurvenpunkt, der durch Skalarmultiplikation des Generators entsteht. Als Sicherheitsannahme gilt, dass der private Skalar aus dem öffentlichen Punkt praktisch nicht berechnet werden kann.

Bitcoin verwendete historisch ECDSA über secp256k1. Taproot führte BIP-340-Schnorr-Signaturen über derselben Kurve ein. BIP 340 legt Kodierungen fest, verwendet nur die x-Koordinate öffentlicher Schlüssel und definiert Anforderungen an deterministische Nonces.[3]

SEC 1 stellt einen öffentlichen Punkt komprimiert mit Präfix 02 oder 03 und x-Koordinate dar, unkomprimiert mit 04 und beiden Koordinaten.[4] Die 32 Byte langen öffentlichen Schlüssel nur mit x-Koordinate aus BIP 340 sind eine eigene Bitcoin-Konvention und nicht mit diesen SEC-1-Darstellungen gleichzusetzen.

BIP-32-Wallets leiten ebenfalls private und öffentliche Kindschlüssel mit secp256k1 ab. Erweiterte Schlüssel enthalten Chain-Code und Metadaten und werden häufig mit Base58Check serialisiert; diese Textkodierung ist von den Kurvenoperationen getrennt.[5]

Implementierung

Eine korrekte Implementierung erfordert die Validierung von Skalaren und Punkten, sichere Nonces, Schutz vor Seitenkanälen und sorgfältiges Parsen. Bitcoin Core verwendet die Bibliothek libsecp256k1 mit ECDSA und BIP-340-kompatiblen Schnorr-Signaturen sowie zeitkonstantem Code für geheimnisabhängige Operationen.[2]

secp256k1 verschlüsselt keine Wallet-Dateien, speichert keine Schlüssel und erzeugt allein keine Adresse. Hashing, Skripte, Netzwerkkennungen und Kodierung sind weitere Schichten.

Siehe auch

Einzelnachweise