/ Buch

Von privaten Schlüsseln, Unterschriften und Adressen

TL:DR Während Kevin sein Geld verzockt, erkläre ich Rosi die Funktionsweise von Wallets. Da ist ein private key aufgetaucht, den man sicher speichern muss. Bei der Verwendung von Wallet-Software hantiert man wiederum mit sogenannten Adressen, an die Bitcoins transferiert werden. Heute zeige ich Schritt für Schritt wie man von einem private key zur Adresse kommt und was das alles bedeutet.

separator

Lass doch mal bitte diesen Scheiß mit Kevin und Rosi. Nimmt deinen Artikeln die ganze Ernsthaftigkeit.

Ich versuche halt das Thema aufzulockern. Das ist ganz schön trocken Brot sonst.

Man kann auch ernsthaft schreiben, ohne dass es trocken ist.

Wer bist du überhaupt?

Nenn mich Dirk. Ich will wissen, wie das wirklich funktioniert bei Bitcoin. Umgang mit der Konsole darfst du bei mir voraussetzen.

OK, Dirk. Ich hoffe, wir werden die Konsole nicht brauchen. Aber warum eigentlich nicht. Wer möchte, kann ein paar Schritte in der Konsole nachvollziehen, mit IPython und pybitcointools.

Da mag wohl jemand keine Windows-Nutzer. Was kommt als nächstes?

Dirk, sag eine Zahl zwischen 1 und 15792089237316195423570985008687907852
837564279074904382605163141518161494336.

Fünf

Also wir brauchen vereinfacht gesagt eine 77-stellige Dezimalzahl. Das ist übrigens eine 256-stellige Binärzahl und belegt also 256 / 8 = 32 Bytes im Speicher. Aber fünf ist schon in Ordnung. Diese Zahl ist ab sofort unser Geheimschlüssel, engl. private key.

Wörter wie private key bitte nicht einfach ohne Erklärung verwenden!

Sicher es handelt sich dabei um einen Begriff aus der

Asymmetrischen Verschlüsselung

Bei weiterem Interesse hilft Wikipedia. lch erkläre hier nur die Aspekte, die für Bitcoin wichtig sind. Bitcoin benutzt ein Verfahren namens ECDSA. Wir werden mit dem private key allerdings nichts verschlüsseln, sondern nur Dinge signieren. Aber ich greife vorweg. Zuerst erzeugen wir uns aus dem privaten Schlüssel einen öffentlichen Schlüssel, engl. public key.

Wer genau hinschaut, sieht, dass das zwei Zahlen sind, und zwar eine x- und eine Y-Koordinate auf einer elliptischen Kurve. Die hat uns der ECDSA-Algorithmus ausgespuckt. Wichtig für uns ist aber nur: zu jedem private key existiert genau ein public key und dieses Schlüsselpaar hat zwei Eigenschaften: Die "Falltür" und das Signieren.

Falltür, klingt ja sehr technisch

Damit ist gemeint, dass man zwar aus einem private key einen public key erzeugen kann, aber nicht umgekehrt. Das ist sehr wichtig, denn den private key halte ich geheim, während ich den public key öffentlich machen will. "Falltür" heißt: Ich kann nur in eine Richtung und niemand erfährt je meinen private key.

Schon falsch: ich kann einfach für alle Zahlen von 1 bis 10^77 den öffentlichen Schlüssel berechnen und dann kann ich den privaten Schlüssel nachschlagen

Das nennt sich Brute-Force-Attacke und du darfst die Größe der Zahl 10^77 nicht unterschätzen. Wenn du eine Methode angeben kannst, um aus einem public key einen private key zu berechnen, die nicht so lange dauert, wie unserer Sonne alt ist, dann hast du ECDSA geknackt. Das hat noch niemand geschafft und deshalb gilt ECDSA (mit den richtigen Parametern) zur Zeit als sicher. Mit immer besseren Computern wird
möglicherweise eine Anpassung der Parameter notwendig, oder sogar ein ganz anderer Algorithmus.

lch sag nur Quantencomputer. Und was ist jetzt dieses "Signieren"?

lch kann mit dem private key Nachrichten signieren. Das dient genau dem gleichen Zweck wie die Unterschrift unter einem Vertrag im realen Leben. Die Unterschrift bezeugt, dass ich dem Vertrag zustimme und wichtig ist dabei natürlich, dass niemand anderes meine Unterschrift erzeugen kann.

Um eine digitale Signatur zu erzeugen, nehmen wir unseren private key und eine Nachricht, die also signiert wird, und stecken beides in die entsprechende ECDSA-Funktion. Das Ergebnis ist die Signatur.

Ich sehe da nur Kauderwelsch

Ja, anschaulich ist so eine Signatur nicht. Das ist aber egal, denn jetzt kommt der Witz: Jeder kann jetzt nachprüfen, ob die Signatur wirklich von mir kommt, weil man zum Verifizieren nur den public key benötigt. Das geht dann so: Wir stecken die Nachricht, die Signatur und meinen public key in eine ECDSA-Funktion zum Verifizieren und finden heraus, ob die Signatur gültig ist.

Und weil’s so schön ist, können wir auch mal schauen, was passiert, wenn wir eine falsche Signatur verwenden, oder die Nachricht abändern:

Wo ist der Bezug zu Bitcoin?

Bei Bitcoin ist die Nachricht, die wir signieren wollen, eine Transaktion. Das heißt: Bitcoins gehen von Gustave zu Rosi. Damit die Transaktion gültig ist, muss sie von Gustave signiert werden. Das bedeutet, dass nur Gustave, der Besitzer des richtigen private keys, eine gültige Transaktion erzeugen kann. Nur er kann die Bitcoins ausgeben. In diesem Sinne ist der Besitzer des private keys der Besitzer der zugehörigen Bitcoins.

Bitcoins ausgeben? Wo gehen die denn hin? Das wirkt auf mich sehr unpräzise!

Eins nach dem Anderen, Dirk. Wir brauchen noch einen weiteren Schritt. Denn Bitcoin verwendet neben private und public key noch die sogenannte Adresse.

separator

Bitcoin-Adressen

Prinzipiell würde schon alles funktionieren, auch ohne Adressen. Diese existieren als zusätzliche Sicherheitsebene. Die Idee ist, dass ich aus einem public key eine eindeutige Adresse erzeugen kann, ganz analog dazu, wie wir den public key aus dem private key erzeugt haben. An dieser Adresse kann ich dann Bitcoins empfangen.

Auf Blockchain.info können wir die Adresse eingeben (oder den Link klicken) und die Geschichte sehen. Da wir ja außerdem den zugehörigen private key haben, können wir über die Bitcoins dieser Adresse verfügen.

Da sind ja schon Bitcoins drauf!

Da waren mal Bitcoins drauf. Das hängt damit zusammen, dass wir bei der Wahl des private key am Anfang etwas unvorsichtig waren. Wenn wir eine zufällige Zahl zwischen 1 und 10^77 genommen hätten, hätten wir auch eine frische Adresse bekommen.

Ich lass das mal unkommentiert stehen.

Danke. Vielleicht ist das Erzeugen von private keys ein Thema für später. Wir schauen mal an, wie man aus einem public key die Adresse bekommt. Dafür stecken wir den public key in eine sogenannte Hash-Funktion.

Was so eine Hash-Funktion macht, lässt sich am einfachsten an Beispielen zeigen. In der ersten Spalte stehen ein paar Zahlen, in der zweiten Spalte das Ergebnis der Hash-Funktion, auch genannt: der Hash der ersten Zahl. Wer es ganz genau wissen will: Wir sehen die ersten 8 Ziffern vom SHA256-Hash im Hexadezimalformat ¯\_(ツ)_/¯.

x Hash(x)
0 5feceb66...
1 6b86b273...
2 d4735e3a...
3 4e074085...

Das sind zufällige Zahlen.

Es sind pseudozufällige Zahlen! Sie sind zufällig in dem Sinne, dass das Ergebnis - der Hash - scheinbar nichts mit der ursprünglichen Zahl zu tun. Sie sind pseudozufällig, weil für die gleiche Zahl immer ein und der gleiche Hash rauskommt. Das bedeutet, ich kann den Hash eindeutig bestimmen, aber nicht vom Hash auf die ursprüngliche Zahl schließen.

... was du oben mal die “Falltür”-Eigenschaft getauft hattest.

Bitcoin-Adressen bestehen neben dem Hash noch aus einer Versionsnummer und einer Prüfsumme und werden dann für bessere Lesbarkeit Base58-kodiert. Dieser letzte Schritt ist nicht weiter tiefsinnig. Man kann Zahlen eben unterschiedlich darstellen und Bitcoins Wahl fällt auf Base58, um doppeldeutige Zeichen wie o, O und 0 in Adressen zu vermeiden. Hier sehen wir beispielhaft ein paar altvertraute Dezimalzahlen und daneben die Darstellung als Hexadezimalzahl (Basis 16) und als Basis-58-kodierte Zahl.

Dezimal Hexadezimal Basis-58
0 0 1
1 1 2
2 2 3
9 9 A
10 A B
16 10 H
58 3A 21
1984 7C0 bD

Wer möchte, kann ja noch einmal unsere Adresse von oben anschauen und gucken, welche Zeichen da drin vorkommen und welche nicht. Damit sind wir fertig: Wir sind den kompletten Weg vom private key zur Adresse gegangen.

Wir können jetzt auch grob eine Transaktion zusammenbauen. Im einfachsten Fall ist das eine Adresse, wo die Bitcoins herkommen, und eine zweite, wo die Bitcoins hingehen. Das nennt sich dann erst einmal raw transaction.

Immer diese englischen Begriffe. Früher hätten wir einfach Rohtransaktion gesagt.

Schön. Der Besitzer der ersten Adresse benutzt jetzt seinen private key, um eine Signatur der raw transaction zu erzeugen. Die Signatur und seinen public key schreibt er dann dazu und aus der raw transaction wird eine signed transaction. Die wird dann im Bitcoin-Netzwerk verbreitet und damit ist der neue Besitzer der Bitcoins offiziell.

Das ist die Person, die den privaten Schlüssel zur zweiten Adresse hat.

Richtig! Nun soll es auch reichen. Hast du noch Fragen, Dirk?

Ich muss mir das mal in Ruhe anschauen. Einige Aspekte wirken auf mich wenig durchdacht!

separator

Liebe Leser

Dies ist der erste Schritt, um mal etwas fundierter die Technologie zu verstehen, die hinter Bitcoin steckt. Ich hab das Thema Blockchain noch nicht einmal angerührt und es gibt schon diverse weitere Fragen und Aspekte, auf die ich direkt noch weiter eingehen möchte. Ist der private key wirklich einfach eine zufällige Zahl? Was wenn zwei den gleichen bekommen? Und: Wo sind da jetzt eigentlich meine Bitcoins genau?

Um weiterzuschreiben, bin ich auf Rückmeldung angewiesen: Zu technisch? Nicht technisch genug? Sind noch Dinge unklar? Ich freue mich auf Deinen Kommentar.

Weiterlesen Kevin macht Krypto-Trading

Du bist hier Von privaten Schlüsseln, Unterschriften und Adressen

Voriger Artikel Bitcoins sicher aufbewahren

Zurück zur Inhaltsübersicht