Bitcoin Erzeugung eigener Schlüssel und Adressen

In diesem Artikel stelle ich Euch ein kleines Programm vor, welches Euch detailliert die drei Schritte für eine Bitcoin-Adress-Erzeugung erläutert.

In Schritt 1 wird ein Elliptisches Kurvenpaar („Elliptic curve keypair“) oder kurz ECKey erzeugt.

Die Umwandlung des privaten Schlüssels in das Base58- oder auf Wallet Import Format („WIF) zeige ich im Schritt 2.

Der letzte Schritt 3 zeigt Euch, wie aus dem öffentlichen Schlüssel die öffentlich nutzbare Adresse wird. Das Programm kann die drei Schritte sowohl für das „richtige“ Main Netzwerk als auch für das Test Netzwerk durchführen, die Umschaltung erfolgt durch die Boolean-Variable „testnetwork“. Steht hier ein „true“ werden die Werte für das Test Netzwerk errechnet, ein „false“ erzeugt Daten für das Main Netzwerk.

Zum Programm selber: neben der Main-Klasse nutze ich drei Java-Klassen, die aber nicht von mir stammen:

Base58NotBitcoinJ.java: dient der Erzeugung von Base58-String, die Klasse stammt von https://gist.github.com/vrotaru/1753908.

Ripemd160.java: erzeugt RipeMd160-Hashwerte, die Klasse stammt von https://github.com/nayuki/Bitcoin-Cryptography-Library

TeePrintStream.java: die Routine ermöglicht es, die Ausgabe auf die Konsole zusätzlich in eine Textdatei zu schreiben. Da Ihr später die erzeugten Schlüssel in anderen Programmen oder Webservices nutzen wollt ist es extrem nützlich, diese Werte in einer kopierbaren Textdatei vorzuhalten. Die Klasse stammt von https://github.com/oreillymedia/java_cookbook_3e/blob/master/javacooksrc/javacooksrc/main/java/io/TeePrintStream.java.

Damit Ihr die Schritte und insbesondere die Unterschritte versteht, gibt das Programm auch jeden Zwischenschritt aus. Das Programm folgt hinsichtlich der Umwandlung des Private Keys (im Byte Array-Format) in das WIF-Format (Schritt 2) der Anleitung unter https://en.bitcoin.it/wiki/Wallet_import_format. Die Umwandlung des öffentlichen Schlüssels (ebenfalls im Byte Array Format) in das WIF-Format (Schritt 3) folgt den Schritten in https://www.novixys.com/blog/generate-bitcoin-addresses-java. Bitte beachtet dazu auch die Hinweise in den Kommentaren zu diesem Artikel, ansonsten klappt das Programm nicht mit dem Sourcecode auf der Webseite (mein Code funktioniert !).

Bevor wir uns die Quellcodes und Konsolenausgaben anschauen: Ihr könnt die Richtigkeit der Berechnungen für das Mainnet über 2 Webservices überprüfen (http://gobittest.appspot.com/PrivateKey und http://gobittest.appspot.com/Address). In meinem Artikel http://java-crypto.bplaced.net/bitcoin-erzeugung-eigener-schluessel-und-adressen-ueberpruefung/ zeige ich Euch detailliert die Überprüfung für das Testnetz.

Falls Ihr Euch fragen solltet „warum wird wieder eine neue Kodierung namens Base58 benutzt ?“ zeige ich Euch das klassische Oo0Ii1lL-Beispiel. Die Zeichenkette besteht aus diesen Buchstaben und Ziffern [buchstabiert]: grosses Otto, kleines Otto, Null, grosses Ida, kleines Ida, Eins, kleines Ludwig, grosses Ludwig. Konntet Ihr das so auch lesen? Ich vermute mal nein und damit sollte klar sein, das bestimmte Buchstaben und Zahlen je nach Zeichensatz kaum unterscheidbar sind. Wenn nun z.B. auf einem Papierbasierten Wallet die obige Kombination (rein zufällig) auftaucht werdet Ihr später große Schwierigkeiten haben, Euren privaten Schlüssel richtig einzugeben. Die Base58-Kodierung vermeidet solche kritischen Buchstaben und Zahlen komplett und macht damit die Kryptographie wieder ein bischen besser und sicherer.

Hier nun die Quellcodes:

Hier die Ausgabe auf der Konsole (Eure Werte werden unterschiedlich sein, da das jeweilige Schlüsselpaar bei jedem Lauf neu erzeugt wird):

 

Alle Quellcodes zum Bitcoin findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/Bitcoin. Alle Programme sind unter Java 11 lauffähig (vermutlich auch unter Java 8) und wurden mit intelliJ IDEA entwickelt, welches für dieses Programm aber nicht notwendig ist.

Letzte Bearbeitung: 28.02.2020