BIP-39 basics. From randomness to mnemonic words

BIP-39 Grundlagen. Von der Zufälligkeit zu mnemonischen Wörtern

Haben Sie sich jemals gefragt, wie Ihre Bitcoin-Wallet-Seed-Wörter (mnemonische Wörter) den Zugriff auf die Gelder in Ihrer Wallet schützen und was ein solches Setup sicher macht? In diesem Artikel werden wir uns mit den Grundlagen von BIP-39 befassen, die beschreiben, was Seed-Wörter sind und wie wir sie verwenden können, um unsere Wallet-Schlüssel auf eine wiederherstellbare Weise zu sichern. Los!

In den frühen Tagen von Bitcoin gab es keine mnemonischen Wörter oder einfachen Möglichkeiten, Ihre Wallet-Schlüssel zu sichern. Die Standard-Wallet-Implementierung erzeugte zufällig private Schlüssel, die in einer Wallet-Datei gespeichert wurden, und Sie waren dafür verantwortlich, diese Datei regelmäßig zu sichern (standardmäßig alle 100 Transaktionen). Das war von der Benutzerfreundlichkeit her alles andere als ideal. Die Leute haben oft vergessen, ihre Wallet-Datei zu sichern, oder sie haben sie gesichert, aber dann ging das Backup verloren, weil es auf elektronischen Geräten gespeichert war, die früher oder später ausfallen würden. Dies führte dazu, dass viele Bitcoins für immer verloren gingen.

Mit der Zeit kamen Bitcoin-Entwickler auf bessere Möglichkeiten, private Schlüssel zu sichern. Eine der von Pieter Wuille im Jahr 2012 in BIP-32 vorgeschlagenen und später weitgehend übernommenen Ideen hieß "Hierarchical Deterministic Wallets". Es beschrieb eine Möglichkeit, eine unbegrenzte Anzahl von privaten und öffentlichen Schlüsseln auf deterministische Weise zu generieren, sodass bei demselben Seed (eine zufällige Liste von Bytes einer bestimmten Länge) dieselbe Liste von Schlüsseln generiert wird. Dies löste das Problem, alle 100 Transaktionen eine Liste von privaten Schlüsseln sichern zu müssen. Ein Backup eines einzigen Seeds reichte aus, um das Backup aller privaten/öffentlichen Schlüssel zu gewährleisten, die man jemals benötigen würde.

Eine weitere Idee, die das Backup des Wallet-Seeds weiter vereinfachte, wurde in BIP-39 von Marek Palatinus, Pavol Rusnak, Aaron Voisine und Sean Bowe vorgeschlagen. BIP-39 beschrieb eine Methode, eine zufällige Liste von Bytes (einen Seed) als eine leicht zu merken/aufzuschreibende Liste von Wörtern zu kodieren. Im Vergleich zu rohen binären oder hexadezimalen Darstellungen des Seeds (die immer noch elektronische Geräte zur Speicherung erforderten) ermöglichte eine menschenlesbare Darstellung eine viel bessere Handhabung des Seeds durch Menschen. Von diesem Zeitpunkt an konnte der Seed auf Papier geschrieben oder am Telefon diktiert werden, und dies eröffnete neue, physische Möglichkeiten, den Seed zu sichern (mehrere Papierkopien an verschiedenen Orten, dauerhafte Kopien auf Metallplatten mit zusätzlichem Schutz vor Feuer/Überschwemmung usw.).

In diesem Artikel werden wir uns Schritt für Schritt mit dem Prozess befassen, eine zufällige Liste von Bytes (Entropie) gemäß der BIP-39-Spezifikation in eine mnemonische Wortfolge umzuwandeln.

Schritt 1 - Entropie

Zuerst brauchen wir eine gute Zufallsquelle. Wir können eine Münze werfen oder einen Würfel werfen. Wenn wir einen Computer (oder eine Hardware-Wallet) verwenden, verfügt dieser über einen eingebauten Zufallszahlengenerator, der als Zufallsquelle dienen kann. Um die Dinge einfach zu halten, werden wir eine Münze werfen. BIP-32 legt fest, dass die Entropielänge zwischen 128 und 256 Bits liegen und ein Vielfaches von 32 Bits sein muss. Jeder Münzwurf ist 1 Bit Entropie. Wir wollen einen 24-Wörter-Seed haben, also werfen wir die Münze 256 Mal und schreiben Kopf als "0" und Zahl als "1".

00110010100001010111110100001011111111111010000010010000010010101101
00010101111001001011000100111100011110001001111011110111011010010100
11001100111011100110001011101101001010110101001111010010011010111111
0001100101011001000110100010000110110001100101110001

Die folgende Tabelle beschreibt den Zusammenhang zwischen der ursprünglichen Entropielänge (ENT), der Prüfsummenlänge (CS) und der Länge des generierten mnemonischen Satzes (MS) in Wörtern. Wenn wir also einen 12-Wörter-Seed haben wollten, würden wir eine 128-Bit-Entropie generieren.

CS = ENT / 32
MS = (ENT + CS) / 11

|  ENT  | CS | ENT+CS |  MS  |
+-------+----+--------+------+
|  128  |  4 |   132  |  12  |
|  160  |  5 |   165  |  15  |
|  192  |  6 |   198  |  18  |
|  224  |  7 |   231  |  21  |
|  256  |  8 |   264  |  24  |

Schritt 2 - Entropie in Gruppen aufteilen

Als Nächstes teilen wir das binäre Ergebnis der Entropie in Gruppen auf und erhalten 23 Gruppen mit jeweils 11 Bits Länge und eine 24. Gruppe mit nur 3 verbleibenden Bits:

00110010100 00101011111 01000010111 11111111010 00001001000
00100101011 01000101011 11001001011 00010011110 00111100010
01111011110 11011010010 01001100110 01110111001 10001011101
10100101011 01010011110 10010011010 11111100011 00101011001
00011010001 00001101100 01100101110 001

Schritt 3 - Kodieren

Jede Gruppe (außer der letzten 24. Gruppe, die nur 3 Bits hat) enthält eine 11-Bit-Zahl (0-2047 im Dezimalsystem) und diese Zahl beschreibt einen Index in einer BIP-39-Wortliste.

Die erste Binärzahl ist 00110010100. Diese Binärzahl umgewandelt in Dezimal ist 404. Wir können die obige Binärfolge in eine Dezimalfolge umwandeln (Sie können einen Taschenrechner, ein Web-Tool verwenden oder es von Hand auf Papier machen, wenn Sie Zeit haben).

404 351 535 2042 72
299 555 1611 158 482
990 1897 614 953 1117
1323 670 1178 2019 345
209 108 814

Die Wörter in der Wortliste sind 0-indiziert, was bedeutet, dass Sie mit 0 anfangen zu zählen. Die Zahl 404 entspricht dem Wort "crater". Die Umwandlung der vollständigen Liste von Dezimalzahlen in Wörter ergibt:

crater cloud drill young animal
century earth siren because detail
knock unfold error jaguar merry
pistol fatigue nation wise clinic
boss assault grape

Schritt 4 - Prüfsumme (24. Wort)

Der letzte Schritt besteht darin, eine Prüfsumme zu berechnen. Der Zweck einer Prüfsumme besteht darin, schnell zu überprüfen, ob die Wortliste korrekt (gültig) ist oder nicht. Sie kann Fehler erkennen, wie die Verwendung eines falschen Wortes, ein fehlendes Wort oder ein Wort an der falschen Position.

Um die Prüfsumme zu berechnen, nehmen wir alle 256 Entropie-Bits, mit denen wir in Schritt 1 begonnen haben, und berechnen daraus einen SHA256-Hash.

$ echo 0011001010000101011111010000101111111111101000001001000001001010110100010101111001001011000100111100011110001001111011110111011010010100110011001110111001100010111011010010101101010011110100100110101111110001100101011001000110100010000110110001100101110001 | shasum -a 256 -0

f3f06d74b794b20645460aa0b17d4e7a77eaaea283ee55344adbfcece4a63432

NB: shasum berechnet den SHA-Hash aus dem Input. Option -a 256 bedeutet die Verwendung des 256-Algorithmus, -0 bedeutet das Lesen des Inputs im BITS-Modus, wobei jedes ASCII '0' als 0-Bit und ASCII '1' als 1-Bit interpretiert wird.

Dies ist eine Zahl im Hexadezimalformat. Wir benötigen die ersten 8 Bits von links (1 Byte) aus diesem Hash. Wir können diesen Online Hex-zu-Binär-Konverter verwenden:

f3 (hex) -> 1111 0011 (binär) 

Als Nächstes fügen wir diese Bits zu den 3 verbleibenden Bits aus der 24. Gruppe aus Schritt 2 hinzu und erhalten:

00111110011

Dies ist das letzte Wort (499 - dinosaur)

Die vollständige 24-Wörter-Liste lautet nun:

crater cloud drill young animal
century earth siren because detail
knock unfold error jaguar merry
pistol fatigue nation wise clinic
boss assault grape dinosaur

Wir können überprüfen, dass dies tatsächlich ein korrekter BIP-39-Seed ist, mit diesem hervorragenden BIP-39-Tool, das von Ian Coleman erstellt wurde.

Schritt 5 - Der Seed

Der letzte Schritt von BIP-39 ist die Erstellung des eigentlichen binären Seeds, der dann als Master-Schlüssel in einer BIP-32-deterministischen Wallet oder mit anderen Methoden verwendet wird. Wir werden nicht in die Details gehen, was dieser Schritt beinhaltet, sondern nur aus der BIP-39-Spezifikation zitieren:

Um einen binären Seed aus dem Mnemonik zu erstellen, verwenden wir die PBKDF2-Funktion mit einem mnemonischen Satz (in UTF-8 NFKD) als Passwort und der Zeichenfolge "mnemonic" + Passphrase (wieder in UTF-8 NFKD) als Salt. Die Iterationsanzahl ist auf 2048 eingestellt und HMAC-SHA512 wird als Pseudozufallsfunktion verwendet. Die Länge des abgeleiteten Schlüssels beträgt 512 Bits (= 64 Bytes).

Sie können mehr über die PBKDF2-Funktion im Zusammenhang mit dem Knacken der Passphrase hier lesen.

BONUS:

Wenn Sie den obigen Schritten gefolgt sind, sollten Sie jetzt in der Lage sein, BIP-39-Seeds selbst zu erstellen und ihre Korrektheit zu überprüfen (mit minimaler Hilfe von Tools wie Binär-zu-Hex-zu-Dezimal-Konvertern).

Sie sollten überprüfen können, ob das letzte Wort des Seeds im obigen Video korrekt ist oder nicht. Sie müssen davon ausgehen, dass die ersten 256 Bits der Entropie korrekt sind und die fehlenden 8 Bits berechnen. Die erste Person, die diesen Beitrag mit einer korrekten Antwort (das letzte Wort) und einer kleinen Beschreibung darüber kommentiert, wie sie es getan hat, kann 1x Coldbit Steel + 1x Coldbit Passphrase + ein Stempelset + einen 1,5-kg-Hammer (3 lbs) kostenlos erhalten und ein langlebiges, korrosions- und feuerbeständiges Backup ihres BIP-39-Seeds erstellen.

Zurück zum Blog