LottaBits – Zufall zum Anfassen
Wie ich beim Aufräumen meines Sicherheitskonzepts eine alte Bitcoin-Spielerei wiederentdeckte.
Ich habe gerade damit begonnen, mein persönliches Sicherheitskonzept neu zu ordnen: Proton Pass, YubiKeys, Offline-Backups, Recovery. Irgendwann landet man unweigerlich bei der Frage: Wem vertraue ich eigentlich welches Geheimnis an?
Per Zufall bin ich dabei über eine kleine Spielerei gestolpert, deren Grundidee Ende 2024 entstanden ist - und die ich im Februar 2025 in einer Schublade beerdigt habe. Ziemlich weit unten.
In der „Zeit zwischen den Jahren“ hatte ich (dank Robin, liebe Grüße :) begonnen, mich intensiver mit Bitcoin zu beschäftigen – erst theoretisch, später auch praktisch. Reichlich spät, zugegeben: Im Gegensatz zur „Erfindung“ des Internets und anschließend der Cloud habe ich dieses Kapitel wohl komplett verschlafen.
Als dann endlich einen Monat später mein Hardware-Wallet ankam, kaufte ich für schmales Geld die großen Kryptowährungen und experimentierte eine Zeit lang damit. Danach entschied ich mich, Krypto nicht weiter zu verfolgen.
Hängen geblieben war aber eine ganz andere Frage:
Wie erzeuge ich einen Bitcoin-Seed so, dass ich die Zufälligkeit selbst nachvollziehen kann?
Ich wollte ihn nicht einfach von irgendeinem Gerät erzeugen lassen. Der naheliegendste Weg sind Würfel: Ein Wurf liefert knapp 2,6 Bit, für die 256 Bit eines 24-Wort-Seeds braucht man also 100 Würfe. Jeden einzeln ablesen, notieren, nicht verzählen. Die wollte ich mir sparen.
Die Würfelanleitung der BitBox02 kannte ich zu diesem Zeitpunkt noch nicht. Kürzer wäre es damit auch nicht geworden: Pro Wort wirft man fünf Würfel und eine Münze, jede 5 und 6 wird neu geworfen. Für 23 Wörter sind das im Schnitt rund 170 Würfelergebnisse plus 23 Münzwürfe.
Vor allem aber wollte ich einfach mal etwas für mich selbst tüfteln: den physischen Zufall für mich neu entdecken. Vermutlich ein kleiner Rückfall in die Schulzeit.
Also besorgte ich mir im Januar 2025 nummerierte Lottosteine aus Holz, einen Beutel und baute mir „mein eigenes“ Verfahren.
Ganz losgelassen hat mich das aber nicht: Die Holzsteine kamen an mein „Gefühl von Gleichheit“ nicht heran. Wenig später ersetzte ich sie durch Spielchips aus dem Schulbedarf, in zwei Farben, mit gleich großen runden Zahlenaufklebern. Dass das für die Entropie ziemlich egal ist und gutes Mischen viel wichtiger, weiß ich jetzt.
64 Chips. Ein Beutel. Zwei Ziehungen pro Wort.
Rund zwei Jahre später habe ich die Schublade wieder geöffnet. In der Idee steckte mehr, als ich damals herausgeholt hatte. Drei Bit mehr, um genau zu sein.
Damals nannte ich das Projekt übrigens noch Tokenware. Warum daraus LottaBits wurde, habe ich in einem eigenen kleinen Artikel aufgeschrieben. Inzwischen hat es sogar ein Maskottchen: Lotta, eine Kängurudame. Ihr Beutel ist der Beutel. ;)
Kein besserer Zufall
Vorweg: Ich behaupte nicht, dass ein Beutel voller Chips „zufälliger“ ist als ein guter Würfel. Ein haushaltsüblicher Würfel ist eine ganz hervorragende physische Zufallsquelle!
Mich interessierte etwas anderes: das Human Interface zur Zufälligkeit. Die Mathematik eines Verfahrens kann noch so sauber sein. Wer sich beim Ablesen verzählt, hat trotzdem verloren.
Die Idee hinter LottaBits ist unspektakulär:
- möglichst identische nummerierte Chips,
- ein undurchsichtiger Beutel,
- Beutel zu, schütteln, ohne hinzusehen in die Mitte greifen,
- Zahl notieren,
- Chip zurücklegen,
- wiederholen.
Kein Zufallszahlengenerator, keine Cloud – aber auch kein Anspruch auf neue Kryptographie.
Not better randomness. A simpler human interface to physical randomness.
Perfekt gleich müssen die Chips dabei übrigens nicht sein. Selbst ein Chip, der 20 Prozent seltener gezogen wird, als er sollte, kostet einen ganzen Seed nur rund 0,02 von 256 Bit. Gefährlich sind grobe Ablauffehler: Chips, die man ertasten kann, schlechtes Mischen, Ziehen ohne Zurücklegen – und Hinsehen.
64 × 64
Die englische BIP39-Wortliste besteht aus genau 2048 Wörtern, also 11 Bit. Ein Chip aus 64 liefert 6 Bit:
2^11 = 2048
2^6 = 64
Zwei Ziehungen liefern also zwölf Bit beziehungsweise 4096 gleichwahrscheinliche Kombinationen.
Mein damaliger Ansatz war, die erste Ziehung auf 32 Gruppen zu falten und die zweite Ziehung als Position innerhalb der Gruppe zu verwenden:
Gruppe = (Z1 − 1) mod 32
Position = Z2 − 1
Index = Gruppe × 64 + Position
Dadurch führen 01 und 33 zur selben Gruppe, ebenso 02 und 34 und so weiter bis 32 und 64.
Jedes der 2048 BIP39-Wörter besitzt damit exakt zwei mögliche Ziehungspaare aus den 4096 Kombinationen.
Das ist wichtig: Die Abbildung bleibt gleichverteilt. Ein Test prüft heute alle 4096 Paare einzeln.
Für die ersten 23 Wörter braucht man also:
23 × 2 = 46 Ziehungen
Dazu baute ich damals ein ausdruckbares Booklet, das die gezogenen Zahlen direkt in Wortnummer und BIP39-Wort übersetzt.
Paper first.
Warum eigentlich nur 23 Wörter?
Eine 24-Wort-BIP39-Phrase besteht nicht einfach aus 24 frei gewählten Wörtern.
BIP39 beginnt bei einer 24-Wort-Phrase mit 256 Bit Entropie. Daraus wird eine acht Bit lange SHA-256-Prüfsumme berechnet. Entropie und Prüfsumme ergeben zusammen 264 Bit, die in 24 Blöcke à elf Bit zerlegt werden.
Die ersten 23 Wörter entsprechen also den ersten 253 Bit der Entropie. Es fehlen noch drei Entropiebits, danach kommen acht Prüfsummenbits. Das 24. Wort besteht also aus:
3 Entropiebits + 8 Checksum-Bits
Damals ließ ich meinen Raspberry Pi Zero in einem Bash-Skript diese drei fehlenden Bits noch über
/dev/urandom erzeugen und anschließend die Prüfsumme berechnen.
Beim Wiederlesen meines alten Codes fiel es mir dann „wie Schuppen von den Augen“.
Ich hatte die drei Bits schon immer
Zwei 64er-Ziehungen enthalten zwölf Bit Zufälligkeit. Für das BIP39-Wort benutze ich davon aber nur elf. Bei der Faltung von 64 auf 32 geht ein Bit scheinbar verloren:
Z1 = 01…32 → 0
Z1 = 33…64 → 1
Dieses Bit ist aber weiterhin physisch erzeugte Zufälligkeit. Nach 23 Wörtern habe ich 23 davon – und brauche nur drei.
Ich hatte also 23 Bit echten Zufall weggeworfen und mir die drei fehlenden ausgerechnet von einer Maschine dazugeholt.
Also verwendet LottaBits heute einfach die Zusatzbits der ersten drei Wortziehungen:
253 Bit aus den ersten 23 Wortindizes
+ 3 bereits physisch erzeugte Zusatzbits
= 256 Bit Entropie
Damit ist die gesamte Entropie physisch erzeugt. Der Computer berechnet nur noch SHA-256 und schlägt Wort 24 nach.
The chips create secrets. The computer only calculates.
46 Zahlen rein, 24 Wörter raus
Die Software zu LottaBits ist deshalb kein „Seed-Generator“, sondern ein kleines Rechenprogramm in Go. Es fragt nur die 46 gezogenen Zahlen ab, Paar für Paar, und lässt Tippfehler sofort neu eingeben. Am Ende steht zum Beispiel:
24 1467 resemble
Extra bits: 101 -> block 5, word numbers 1281–1536
Entropy source: 46 chip draws
Software-generated randomness: none
Alles dazwischen ist deterministisch: die ersten 23 Wörter, die drei Zusatzbits, die 256 Bit Entropie, die Prüfsumme und Wort 24.
Das Programm ist bewusst klein und langweilig: nur die Go-Standardbibliothek, kein Netzwerkcode, keine Dateizugriffe, keine Logs. Zufallsfunktionen sind im Build sogar ausdrücklich verboten.
Weil ein falsches Ergebnis hier Geld kosten kann, habe ich es mehrfach gegenrechnen lassen: gegen die offiziellen BIP39-Testvektoren, gegen eine zweite, unabhängige Implementierung in Python und für die veröffentlichten Testfälle zusätzlich gegen eine dritte, verbreitete BIP39-Bibliothek. Die Binärdateien sind reproduzierbar: Wer den Quellcode selbst baut, bekommt Byte für Byte dieselbe Datei – das habe ich beim ersten Release Candidate auf meinem Rechner gegen den Build auf GitHub nachgeprüft.
Und wenn ich gar keinen Rechner verwenden möchte?
Das geht – sofern das Hardware-Wallet mitspielt.
Manche Geräte, etwa COLDCARD oder die BitBox02, zeigen nach Eingabe der ersten 23 Wörter alle acht gültigen Kandidaten für Wort 24. Acht, weil genau drei Entropiebits fehlen: 2³ = 8. Meine drei bereits vorhandenen Zusatzbits bestimmen eindeutig, welcher Kandidat der richtige ist.
Das 24. Wort besteht aus den drei Entropiebits als oberen Bits und acht Prüfsummenbits darunter. Dadurch gehören die acht Möglichkeiten zu acht festen Bereichen der BIP39-Liste:
Lauten meine drei Zusatzbits zum Beispiel 101,
muss Wort 24 zwischen BIP39-Nummer 1281 und 1536 liegen. Unter den acht angebotenen Wörtern liegt genau eines
in diesem Bereich. Das Booklet enthält die Wortnummern, die Bereichstabelle steht innen auf dem Umschlag.
Auf die Reihenfolge, in der das Gerät die acht Wörter anzeigt, muss man sich also nicht verlassen. Die BitBox02 zeigt sie laut Quellcode genau in Blockreihenfolge an. Ihre Würfelanleitung sagt trotzdem nur, man solle das letzte Wort „zufällig“ wählen. Ich habe BitBox deshalb vorgeschlagen, drei Münzwürfe über die Position entscheiden zu lassen. Mal sehen, was daraus wird.
Andere Geräte wie SeedSigner oder Krux gehen noch einen Schritt weiter: Dort gibt man die drei Bits direkt ein, etwa als Münzwürfe, und das Gerät ergänzt die Prüfsumme.
Damit kann der komplette Ablauf tatsächlich bestehen aus:
Chips → Papier → Hardware-Wallet → Papier.
Kein Raspberry Pi, kein Pi Zero. Schon gar nicht Laptop oder Smartphone.
Zwei Einschränkungen gehören ehrlicherweise dazu. Bei der BitBox02 werden die Wörter zwar nur am Gerät eingegeben, die Wiederherstellung wird aber über die BitBoxApp gestartet. Und mein eigenes Hardware-Wallet, ein Ledger Nano S Plus, kann das gar nicht: Es nimmt nur eine vollständige 24-Wort-Phrase an. Den Weg ganz ohne Rechner kenne ich deshalb nur aus Dokumentation und Quellcode der Hersteller, nicht aus eigener Praxis – Erfahrungsberichte sind sehr willkommen.
Und ohne passendes Hardware-Wallet?
In diesem Fall braucht man für die Prüfsumme doch ein Rechengerät: z. B. einen Raspberry Pi mit frischem, dauerhaft offline gehaltenem Image oder ein frisch gebootetes Live-System auf einem ausrangierten Laptop ohne Netzwerk und ohne dauerhafte Speicherung.
Was ich für echte Bitcoin-Seeds nicht empfehlen würde, ist der normale Alltagsrechner, bei dem man lediglich kurz WLAN abschaltet. In dem Moment, in dem ein Rechner die ersten 23 Wörter sieht, kennt er praktisch das gesamte Geheimnis. Ein bereits kompromittiertes System könnte die Daten speichern und übertragen, sobald es wieder online ist.
So hätte man 46-mal sorgfältig gezogen, nur um das Ergebnis am Ende einem Rechner zu verraten, dem man nicht trauen kann.
Irgendwann fand ich heraus, dass ich (natürlich) nicht der Erste war
Nach älteren Verfahren habe ich erst gesucht, als mein eigenes ganz gut funktionierte. Und wie so oft bei einfachen Ideen waren andere längst auf verwandte Gedanken gekommen.
- Die Mutter aller physischen Passphrasen ist Diceware von Arnold G. Reinhold aus dem Jahr 1995: fünf Würfelwürfe, ein Wort aus 7776.
- BitBox bestimmt jedes Wort mit fünf Würfeln und einer Münze über eine Tabelle; jede 5 und 6 wird neu geworfen.
- SeedPicker verwendet Lose in einem Beutel und einen Würfel für die ersten 23 Wörter und berechnet das letzte offline.
- Bei SeedSticks werden die BIP39-Wörter selbst als Holzstäbchen aus einem Beutel gezogen.
- In einer Bitcointalk-Diskussion schlug jemand am 30. Oktober 2022 zwei Bingo-Trommeln mit 32 und 64 Kugeln vor: 32 × 64 = 2048.
- SeedGrid setzt diese schöne Idee als Zwei-Beutel-Prinzip um.
Damit ist klar:
LottaBits hat weder physische Entropie noch die Auswahl von BIP39-Wörtern durch Ziehen erfunden.
Was ich bei meiner bisherigen Recherche allerdings noch nicht in genau dieser Form gefunden habe, ist mein konkreter Ein-Beutel-Ansatz:
64 wiederverwendbare Chips, zwei Ziehungen, 2:1-Faltung auf die BIP39-Liste – und die Wiederverwendung der dabei übrigbleibenden Bits.
Gut möglich, dass es das längst gibt - und ich es nur nicht gefunden habe. Dann freue ich mich über den Link.
Seed. Passwort. Passphrase.
Beim Durchsehen meines alten Archivs fiel mir noch etwas auf: Ich hatte damals nicht nur Steine für BIP39 vorbereitet. Die Holzsteine reichten ohnehin bis 90, und es gab bereits eine Zeichentabelle für zufällige Passwörter.
Seed
64 Chips
1 Beutel
46 Ziehungen
→ 256 Bit physische BIP39-Entropie
Passwort
Mit 88 Chips wählt eine einzelne Ziehung direkt ein Zeichen aus einem festen 88-Zeichen-Alphabet, ungefähr
6,46 Bit pro Ziehung. Zeichen, die sich zum Verwechseln ähneln oder in Eingabefeldern Ärger machen, sind von
vornherein draußen:
I, l, |, ', ` und \.
Unter jedes Zeichen schreibt man außerdem seine Klasse – Ziffer, Groß- oder Kleinbuchstabe, Sonderzeichen. So
bleibt auch eine
0 von einem O
unterscheidbar, wenn die Handschrift nicht mitspielt. Ein Passwort entsteht vollständig auf Papier.
Passphrase
Zwei 88er-Ziehungen ergeben 88 × 88 = 7744 gleichwahrscheinliche Kombinationen. Das liegt erstaunlich dicht an den 7776 Einträgen einer klassischen langen Diceware-Wortliste.
Für Englisch verwende ich die lange Liste der EFF, für Deutsch die Liste von dys2p – jeweils schlicht die ersten 7744 Einträge, ohne eigene Auswahl. Ein Ziehungspaar dient direkt als Koordinate:
Keine Rechnung, kein Rejection Sampling. Sechs Wörter liefern ungefähr 77,5 Bit – genauso viel wie zwölf Passwortzeichen. Auch diese Passphrase entsteht ausschließlich mit Beutel, Chips, Papier und Stift.
Draw bits, make secrets: Passphrase, Password, Seed.
Gleich wichtig sind die drei allerdings nicht.
Zufällige Passwörter erzeugt jeder Passwortmanager besser und bequemer. Und für die allermeisten Menschen ist ein Seed, den ein gutes Hardware-Wallet selbst erzeugt, die vernünftigere Wahl. Der Seed-Teil ist und bleibt mein persönliches Bitcoin-Experiment von Ende 2024/Anfang 2025 – nur eben jetzt sauber zu Ende gebracht.
Die Passphrase dagegen löst ein echtes Problem: Manche Passwörter muss man sich merken – das Master-Passwort des Passwortmanagers, das Mailkonto bei Proton, die Festplattenverschlüsselung. Genau dafür ist eine gewürfelte – oder eben gezogene – Passphrase seit Jahrzehnten die klassische Empfehlung.
Und lieber veröffentliche ich alle drei Teile richtig, als sie halb fertig wieder liegen zu lassen.
Was aus der Spielerei geworden ist
Jetzt ist daraus eine saubere, eigenständige Version geworden:
- eine formale Spezifikation der Mathematik,
- ein kleines Go-Programm mit englischer und deutscher Bedienung,
- Tests, die jede mögliche Ziehung durchspielen,
- Druckvorlagen auf Englisch und Deutsch, aus denselben Daten erzeugt wie das Programm,
- Threat Model und Prior Art,
- reproduzierbare, nachprüfbar auf GitHub gebaute Releases,
- und alles offen in einem kleinen Repository.
Die gedruckten Materialien sind dabei kein Zubehör, sondern ein Kernbestandteil: Booklets zum Falten, Protokollbögen, eine Zeichentabelle, Kurzreferenzen und ein Inventurbogen, auf den man vor jeder Runde alle Chips legt, um zu sehen, ob der Satz vollständig ist.
Paper first. Software only where mathematics requires it.
Für Passwort und Passphrase kann LottaBits vollständig analog bleiben. Bei Bitcoin muss lediglich die Prüfsumme irgendwo berechnet werden – oder das Hardware-Wallet übernimmt diesen letzten Schritt.
Wer keine Chips hat: Eine Box mit Greifloch oder eine Bingotrommel mit Kugeln von 1 bis 90 funktioniert genauso. Zur Not gibt es Chips zum Ausschneiden – die lassen sich allerdings ertasten und taugen eher zum Ausprobieren.
Was ich mir dafür gekauft habe
Was LottaBits nicht ist
LottaBits ist kein Ersatz für gute Kryptographie.
Es ist kein Beweis dafür, dass ein Beutel „besser“ würfelt als ein Würfel.
Es ist keine Empfehlung, bei relevanten Bitcoin-Beträgen nicht auditierten Code zu verwenden.
Und es ist schon gar keine neue kryptographische Primitive.
Die interessantere Frage lautet für mich:
Kann man physische Zufälligkeit so gestalten, dass ein Mensch sie gern und möglichst fehlerfrei benutzt?
Mein Versuch einer Antwort besteht aus erstaunlich wenig:
One bag. Numbered chips. No software-generated randomness.
Das Repository mit Code, Druckvorlagen, Spezifikation, Tests und Prior-Art-Notizen liegt hier: https://github.com/mkorun/lottabits
Gerade ist es noch ein Release Candidate. Bevor ich es „1.0“ nenne, freue ich mich über kritische Blicke – was dabei am meisten hilft, steht im angepinnten Issue: https://github.com/mkorun/lottabits/issues/1
Und jetzt bleibt die Schublade ein für allemal zu.
Quellen und verwandte Projekte
- LottaBits
https://github.com/mkorun/lottabits - BIP-39 – Mnemonic code for generating deterministic keys
https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki - Diceware (Arnold G. Reinhold)
https://theworld.com/~reinhold/diceware.html - EFF – Dice-generated passphrases
https://www.eff.org/dice - Deutsche Diceware-Wortlisten (
dys2p/wordlists-de)
https://github.com/dys2p/wordlists-de - BitBox02 – Seed generation with dice
https://bitbox.swiss/bitbox02/BitBox_Diceware_HowTo.pdf - SeedPicker
https://github.com/merland/seedpicker - SeedSigner – Dice verification
https://github.com/SeedSigner/seedsigner/blob/dev/docs/dice_verification.md - Krux
https://selfcustody.github.io/krux/ - SeedSticks
https://seedsticks.org/ - Bitcointalk: „Are dices for generating seed words fair?“ (Bingo-Vorschlag, 30.10.2022)
https://bitcointalk.org/index.php?topic=5395587.80 - SeedGrid 32×64
https://seedgrid.org/
Hinweis: Dieser Artikel beschreibt ein persönliches Open-Source-/Security-Experiment. Die Software ist kein professionell auditiertes Wallet-Produkt. Wer damit reale Werte absichern möchte, sollte die Implementierung und den Workflow unabhängig prüfen und zunächst ausschließlich mit Testdaten bzw. wertlosen Wallets arbeiten.
Die Grafiken habe ich mit KI-Unterstützung per Skript erzeugt; alle Zahlen darin sind nachgerechnet.