Die elliptische Kurve hinter Bitcoin-Schlüsseln, ECDSA und Schnorr.
Block 958.922Live
Was ist secp256k1?
secp256k1 ist eine standardisierte elliptische Kurve über einem endlichen
Primkörper.
Sie definiert eine Menge gültiger Punkte und Rechenregeln für diese Punkte. Bitcoin verwendet diese mathematische
Struktur, um aus Private Keys Public Keys abzuleiten und ECDSA- sowie
Schnorr-Signaturen zu erzeugen und zu prüfen.
Der Name setzt sich aus mehreren Teilen zusammen:
sec: Standards for Efficient Cryptography
p: Kurve über einem endlichen Primkörper
256: Feldgröße in Bit
k1: Koblitz-Kurvenparameter
secp256k1 ist damit kein Signaturalgorithmus und keine Hash-Funktion. Sie beschreibt die mathematische Struktur,
auf der Verfahren wie ECDSA und Schnorr arbeiten.
ECC
Elliptic Curve Cryptography
▼
secp256k1
Kurve
elliptische Kurve
Mathematische Basis für Schlüsselraum und Punkte
Public-Key-Ableitung
d × G
Private Key → Punkt auf der Kurve
Signaturalgorithmen
auf derselben Kurve
ECDSASchnorr
Die Parameter von secp256k1
secp256k1 besteht nicht nur aus einer elliptischen Kurve, sondern aus mehreren mathematischen Parametern. Gemeinsam
legen sie fest, auf welchen Zahlen gerechnet wird, welche Punkte gültig sind und welche Punktmenge für kryptographische
Berechnungen verwendet wird.
Primkörper Fₚ
p
▼
Welche Zahlen sind erlaubt?
Kurvengleichung
E
▼
Welche Punkte sind gültig?
Gruppenordnung n
n
▼
Wie viele Punkte besitzt die erzeugte Gruppe?
Der Primkörper
Der Primkörper legt den Zahlenraum fest, in dem secp256k1 arbeitet.
Für Bitcoin gilt
p=2256−232−977
Dadurch können Koordinaten ausschließlich Werte zwischen
0
und
p−1
annehmen.
Alle Rechnungen innerhalb von secp256k1 erfolgen modulo p. Dadurch bleiben sämtliche Ergebnisse stets innerhalb dieses
endlichen Zahlenraums.
Die Primzahl
p=2256−232−977
wurde bewusst gewählt. Sie liegt nur wenig unter 2256 und ermöglicht besonders effiziente Berechnungen auf moderner
Computerhardware.
Der Primkörperp legt den Zahlenraum der Koordinaten fest.
Die Gruppenordnung n legt den Zahlenraum der Skalare fest, also der Private Keys und vieler kryptographischer
Berechnungen.
Punkte auf secp256k1
Ein Punkt auf secp256k1 besteht aus zwei Koordinaten:
P=(x,y)
Beide Koordinaten sind Elemente des endlichen PrimkörpersFp.
Sämtliche Berechnungen werden daher modulo der Primzahl p durchgeführt.
Ein Koordinatenpaar ist nur dann ein gültiger Kurvenpunkt, wenn es die
Kurvengleichung erfüllt:
y2≡x3+7(modp)
Nicht jedes beliebige Koordinatenpaar gehört somit zur Kurve.
Neben den Punkten mit konkreten x- und y-Koordinaten existiert ein weiterer besonderer Punkt: der
Punkt im Unendlichen.
Punktnegation
Zu jedem Kurvenpunkt
P=(x,y)
existiert ein negierter Punkt:
−P=(x,−ymodp)
Da die Berechnungen im endlichen Körper Fp stattfinden, wird auch die negative y-Koordinate modulo p
dargestellt.
Für y=0 gilt:
−ymodp=p−y
Damit lautet der negierte Punkt:
−P=(x,p−y)
Der ursprüngliche Punkt und sein negierter Punkt besitzen dieselbe x-Koordinate. Ihre y-Koordinaten ergänzen sich
modulo p zu 0:
y+(p−y)≡0(modp)
Beide Punkte erfüllen die Kurvengleichung, da durch das Quadrieren das Vorzeichen verschwindet:
(−y)2=y2
Für eine gültige x-Koordinate existieren daher normalerweise zwei mögliche Kurvenpunkte:
P=(x,y)
und
−P=(x,p−y)
Werden diese beiden Punkte addiert, heben sie sich gegenseitig auf:
P+(−P)=O
Die Punktnegation ist später auch für
komprimierte öffentliche Schlüssel relevant.
Da zu einer x-Koordinate zwei mögliche y-Koordinaten gehören können, muss zusätzlich angegeben werden, welcher der
beiden Punkte gemeint ist.
Punkt im Unendlichen
Der Punkt im Unendlichen wird üblicherweise mit
O
bezeichnet.
Der Name „Punkt im Unendlichen“ ist historisch bedingt und kann etwas irreführend sein. Tatsächlich handelt es sich
nicht um einen besonders weit entfernten Punkt, sondern um das neutrale Element der
Punktaddition.
Er besitzt keine gewöhnlichen x- und y-Koordinaten und kann nicht direkt in die
Kurvengleichung eingesetzt werden.
Stattdessen wird er als zusätzliches Element definiert, damit die Punkte auf der Kurve zusammen mit der
Punktaddition eine mathematische Gruppe bilden.
Der Punkt im Unendlichen ist das neutrale Element dieser Gruppe.
Für jeden Kurvenpunkt P gilt:
P+O=P
und
O+P=P
Seine Funktion entspricht damit der Rolle der Zahl 0 bei der gewöhnlichen Addition:
a+0=a
Der Punkt im Unendlichen entsteht außerdem, wenn ein Punkt zu seinem
negierten Punkt addiert wird:
P+(−P)=O
Geometrisch verläuft die Gerade durch einen Punkt und seinen negierten Punkt vertikal. Sie schneidet die Kurve an keinem
weiteren endlichen Punkt.
Das Ergebnis dieser Punktaddition wird daher als Punkt im Unendlichen
definiert.
Punktoperationen
Auf den Punkten einer elliptischen Kurve werden keine gewöhnlichen Zahlenoperationen ausgeführt.
Stattdessen existieren eigene Operationen, mit denen aus einem oder mehreren Kurvenpunkten neue Kurvenpunkte berechnet
werden.
Die wichtigsten Operationen sind:
Punktaddition
+
P + Q = R
▼
Zwei verschiedene Kurvenpunkte ergeben einen neuen Punkt.
Punktverdopplung
2·
2P = P + P
▼
Sonderfall der Addition: ein Punkt wird mit sich selbst addiert.
Skalarmultiplikation
k·
kP
▼
Wiederholte Addition, typisch per Double-and-Add. Grundlage für Q = dG.
Alle Berechnungen erfolgen im endlichen PrimkörperFp und damit
modulo p.
Punktaddition
Bei der Punktaddition werden zwei Kurvenpunkte
P=(x1,y1)
und
Q=(x2,y2)
zu einem neuen Kurvenpunkt
R=P+Q
addiert.
Für zwei unterschiedliche Punkte mit
x1=x2
wird zunächst die Steigung λ berechnet:
λ=x2−x1y2−y1(modp)
Da Division im endlichen Körper nicht unmittelbar möglich ist, wird durch das multiplikative Inverse des Nenners
multipliziert:
λ=(y2−y1)(x2−x1)−1(modp)
Anschließend werden die Koordinaten des Ergebnispunkts berechnet:
x3=λ2−x1−x2(modp)y3=λ(x1−x3)−y1(modp)
Damit lautet der neue Punkt:
R=(x3,y3)
Das Ergebnis einer gültigen Punktaddition liegt erneut auf der elliptischen Kurve.
Ein Sonderfall tritt ein, wenn Q=−P gilt (siehe Punktnegation). Dann heben
sich beide Punkte gegenseitig auf:
P+(−P)=O
Das Ergebnis ist der Punkt im UnendlichenO.
Punktverdopplung
Bei der Punktverdopplung wird ein Punkt mit sich selbst addiert:
R=P+P
oder verkürzt:
R=2P
Da beide Ausgangspunkte identisch sind, kann für die Berechnung der Steigung nicht die gewöhnliche Formel der
Punktaddition verwendet werden.
Für eine Kurve der Form
y2=x3+ax+b
lautet die Steigung bei der Punktverdopplung:
λ=2y13x12+a(modp)
Bei secp256k1 gilt:
a=0
Daher vereinfacht sich die Formel zu:
λ=2y13x12(modp)
Im endlichen Körper wird erneut mit dem modularen Inversen gerechnet:
λ=3x12(2y1)−1(modp)
Die Koordinaten des Ergebnispunkts werden anschließend wie bei der
Punktaddition berechnet:
x3=λ2−2x1(modp)y3=λ(x1−x3)−y1(modp)
Damit gilt:
2P=(x3,y3)
Die Punktverdopplung ist somit kein grundsätzlich anderer Vorgang, sondern ein Sonderfall der
Punktaddition.
Skalarmultiplikation
Bei der Skalarmultiplikation wird ein Kurvenpunkt wiederholt mit sich selbst addiert.
Für eine ganze Zahl k und einen Punkt P gilt:
kP=k-malP+P+⋯+P
Beispielsweise:
3P=P+P+P5P=P+P+P+P+P
Die Skalarmultiplikation ist keine gewöhnliche Multiplikation der Koordinaten.
Es gilt daher nicht:
kP=(kx,ky)
Stattdessen wird die Punktaddition wiederholt angewendet.
Eine direkte Berechnung durch k einzelne Additionen wäre bei großen Zahlen jedoch zu langsam. Deshalb wird die
Skalarmultiplikation mit einem effizienteren Verfahren ausgeführt, das
Punktverdopplungen und
Punktadditionen kombiniert.
Ein häufig verwendetes Verfahren ist Double-and-Add.
Dabei wird der Skalar k binär dargestellt. Für jedes Bit wird der aktuelle Punkt verdoppelt. Ist das jeweilige Bit
gesetzt, wird zusätzlich der Ausgangspunkt addiert.
Für
k=13
gilt beispielsweise:
13=8+4+1
und damit:
13P=8P+4P+P
Die Skalarmultiplikation ist die zentrale Operation der Kryptografie mit secp256k1.
Aus einem privaten Schlüssel d und dem GeneratorpunktG wird der
öffentliche Schlüssel berechnet:
Q=dG
Die Berechnung von Q aus d und G ist effizient.
Die umgekehrte Berechnung des privaten Schlüssels d aus Q und G gilt dagegen bei ausreichend großen Parametern als
praktisch nicht durchführbar. Dieses Problem wird als
elliptisches Kurven-Diskreter-Logarithmus-Problem
bezeichnet.
Generatorpunkt G
Der Generatorpunkt G ist ein fest definierter Punkt auf der elliptischen Kurve secp256k1.
Alle Bitcoin-Implementierungen verwenden denselben Generatorpunkt. Er ist Bestandteil der Spezifikation der Kurve und
kein geheimer Wert.
Da diese Zahlen jeweils 256 Bit lang sind, werden sie üblicherweise in hexadezimaler Schreibweise dargestellt.
Der Generatorpunkt bildet den Ausgangspunkt für die Berechnung jedes öffentlichen Schlüssels.
Aus einem privaten Schlüssel d wird durch Skalarmultiplikation der
öffentliche Schlüssel berechnet:
Q=dG
Dabei bedeutet
dG
nicht die gewöhnliche Multiplikation zweier Zahlen.
Stattdessen wird der Generatorpunkt G mithilfe der zuvor erklärten
Punktoperationen wiederholt mit sich selbst kombiniert.
Intern besteht die Berechnung ausschließlich aus Punktverdopplungen und
Punktadditionen.
Beispielsweise gilt:
5G=G+G+G+G+G
oder effizienter:
5G=4G+G
Für große Werte von d kommt das Double-and-Add-Verfahren zum Einsatz. Dabei werden zunächst durch
Punktverdopplungen die Zweierpotenzen des Generatorpunkts erzeugt:
G,2G,4G,8G,16G,…
Anschließend werden entsprechend der Binärdarstellung des privaten Schlüssels nur die benötigten Punkte addiert.
Die Berechnung des öffentlichen Schlüssels aus d und G ist sehr effizient.
Die umgekehrte Aufgabe, den privaten Schlüssel d allein aus dem öffentlichen Schlüssel Q und dem bekannten
Generatorpunkt G zu bestimmen, gilt dagegen als praktisch nicht durchführbar.
Dieses mathematische Problem wird als
Elliptic Curve Discrete Logarithm Problem (ECDLP)
bezeichnet und bildet die Sicherheitsgrundlage von Bitcoin.
Vom Private Key zum Public Key
Ein Bitcoin-Schlüsselpaar besteht aus einem privaten und einem öffentlichen Schlüssel.
Der Private Key muss geheim bleiben und dient zum Erzeugen digitaler Signaturen.
Der Public Key wird aus dem Private Key berechnet und kann ohne Sicherheitsrisiko veröffentlicht werden.
Die Berechnung erfolgt mithilfe der zuvor vorgestellten
Skalarmultiplikation auf der elliptischen Kurve secp256k1.
Der Private Key d
Der Private Key ist eine zufällig gewählte ganze Zahl.
Er muss im Bereich
1≤d<n
liegen.
Dabei bezeichnet n die Gruppenordnung des
GeneratorpunktsG:
134× Bit = 1→ addiere 2^i·G122× Bit = 0→ überspringen
gesetzte Bits → Summanden▼
Double-and-Add
≈ 255 Verdopplungen · 134 Additionen
Für jede Binärstelle mit Wert 1 entsteht ein eigener Vielfachen-Term. Die Zweierpotenzen von G entstehen durch wiederholte Punktverdopplung.
2^252·G2^251·G2^250·G2^249·G…2^6·G2^1·G
Q = Σ 2^i·Güber 134 gesetzte Bits i
Ergebnis▼
Public Key Q = d·G
Kurvenpunkt
x = 5BB211C482237F713A1457710D9FE38E1F15FFDB1E17257897FCE67DAD579F59
y = 4EBF74C48AE39E27D29938B2563CDF4043DE3940CB284FEE4369F20EF6244DF7
Das Ergebnis der Berechnung ist wiederum ein Punkt auf der elliptischen Kurve:
Q=(x,y)
Komprimierte Public Keys
Ein Public Key besteht ursprünglich aus den beiden Koordinaten
(x,y)
und benötigt daher 65 Byte.
Da zu jeder gültigen x-Koordinate nur zwei mögliche y-Koordinaten existieren (siehe
Punktnegation), muss nicht der vollständige Wert von y gespeichert werden.
Stattdessen genügt ein Präfix, das angibt, welche der beiden Möglichkeiten verwendet wird:
02 für eine gerade y-Koordinate
03 für eine ungerade y-Koordinate
Ein komprimierter Public Key besitzt daher die Form:
02 || x
oder
03 || x
Er benötigt nur noch 33 Byte.
x = 89 / 222
X-only Public Keys
Mit Taproot (BIP340) wurde eine weitere Darstellung eingeführt.
Dabei wird ausschließlich die x-Koordinate gespeichert:
x
Die Parität der y-Koordinate wird dabei nicht mehr übertragen.
Stattdessen wird immer die Variante mit gerader y-Koordinate verwendet.
Dadurch besteht ein X-only Public Key nur noch aus 32 Byte.
Intern existiert weiterhin ein vollständiger Kurvenpunkt
(x,y),
gespeichert wird jedoch ausschließlich die x-Koordinate.
x = 89 / 222
Diese Darstellung wird ausschließlich für Schnorr-Signaturen und
Taproot verwendet.
Was ist das Elliptic Curve Discrete Logarithm Problem?
Aus einem Private Key lässt sich der
Public Key effizient berechnen:
Q=dG
Die umgekehrte Richtung ist jedoch das eigentliche Sicherheitsprinzip von Bitcoin. Gegeben sind lediglich der Public Key
Q
und der Generatorpunkt
G.
Gesucht ist der Private Key
d.
Diese Aufgabe wird als Elliptic Curve Discrete Logarithm Problem (ECDLP) bezeichnet.
Bis heute ist kein effizienter Algorithmus bekannt, der den Private Key aus einem Public Key berechnen kann.
Die einzige bekannte allgemeine Vorgehensweise besteht darin, mögliche Werte für d auszuprobieren:
Beide Verfahren nutzen dieselben Private und Public Keys sowie dieselbe elliptische Kurve secp256k1. Sie unterscheiden
sich jedoch darin, wie digitale Signaturen erzeugt und überprüft werden.