Am 30. Juli 2026 wurde bekannt, dass ein Angreifer mittlerweile über 1000 Bitcoins auf seine Wallet überwiesen hat. Nicht wie viele sagen, gestohlen, sondern einfach nach den Regeln des Bitcoin-Consensus überweisen. Der Bitcoin-Stand des neuen Besitzers findet man über diese Watch-Seite.
Wieso wird das dennoch als Diebstahl bezeichnet? Nun, es ist nur Diebstahl aus der Sicht der vorherigen "Besitzern". Denn in Bitcoin gibt es das an sich nicht, weil Bitcoin bekanntlich immateriell ist und daher vom Physischen nicht besessen werden kann.
Wie beweist man denn, dass man Bitcoins besitzt oder hält? Physisch kann man's ja nicht. Aber mathematisch. Dazu braucht man den privaten Schlüssel, und woher hat man den? Als Ableitung von einem Seed, das wohl bekannteste Wort im Bitcoin-Glossar. Mit dem privaten Schlüssel kann man mathematisch beweisen, dass man die Bitcoins bewegen könnte, wenn man wollte. Man kann damit allerlei beweisen, auch die Unversehrheit eines elektronischen Vertrags, eines PDFs, das ein Mensch durchaus anschauen und ändern könnte. Aber eben, die Verfälschung könnte dann locker nachgewiesen werden.
Der Seed
Der Seed ist einfach eine 256 Bit, 32 Byte Zahl. Im 10er System also etwas zwischen 0 und 1077. Das sind gigantische Zahlen, die niemals ein Computersystem abgrasen kann. Ich rechnete ja mal etwas im Nachtrag zu einen Artikel, um die damals aktuelle Rechenpower dem Zahlenbereich dieser 2256 Möglichkeiten entgegenzustellen.
Nun, die Hash-Funktion ist halt wie eine Mühle mit einem grossen Trichter und einem Test-Auslauf unter dem Mahlwerk, wo - in menschlicher Analogie - ein Prüfer andauernd etwas rausnimmt, auf Qualität prüft und oben mit dem konstanten Zulauf wieder in den Trichter kippt, wo es natürlich wieder zermahlen wird mit dem neuen Zeug.
Das ist die Hash-Funktion. Nicht wie es in der Presse und TV oft heisst "komplizierte Berechnungen" ... nein, einfach f*cking simple bit operations. In Wikipedia sieht man ja, wie es geht.
Das Problem ist nun, was schüttet man in den Trichter, damit dieser Hash möglichst zufällig ist? Nun, wer Hash verstanden hat, weiss aber auch, dass es bei gleichem Input immer den gleichen Output gibt.
Wenn ich also einen Kubikmeter Holz reinschmeisse, kommt unten bis aufs Gramm genau immer dasselbe raus. Wer's probieren will, hier eine schöne Website, die auch grad noch diverse andere Hashes und Prüfsummengeneratoren nutzt und deren Resultat anzeigt.
Wenn man dort im Feld Hash String etwas reintippt oder unter Hash File eine Datei hochlädt, spuckt die Seite nach etwas Rechnerei die diversen Hashes aus, darunter den SHA-256, den wir in Bitcoin ja brauchen.
Also, wenn wir
Bitcoin
in den Trichter des digitalen Mahlwerks schütten, kommt
b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa416
heraus. Tja.
Und wenn wir
bitcoin
reinschütten, ist es
6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b16
Aha. Immerhin, sieht schon sehr anders aus.
Und der hier
BiTCoin
ergibt
01c310ff0cc17b8670c673ea12f711614e36ad168e283f5e78d939be4441824e16
Genau man erkennt keinerlei Abhängigkeiten von Input zu Output. Eine Hash-Funktion hat also einige wichtige Merkmale zu erfüllen:
- Egal, was und wieviel man reingibt, es erzeugt immer eine Zahl von 256 Bits (für SHA-256)
- Ein bestimmter Input erzeugt immer denselben Output
- Minimalste Änderung am Input (kleines b statt B) erzeugt einen nicht vorhersehbaren anderen Output
- Änderungen am Input können nicht zu einem Output vorausberechnet werden
- Es ist nicht möglich, auch nicht mit Quantencomputern (QC), von einem Output auf den Input zurückzurechnen1
1 Selbst wenn ein QC den SHA-256 mal wirklich rückwärts rechnen könnte, wieviele mögliche Inputs gäbe es dann? Unendlich viele. Wieso? Tja, wieviel grösser ist der unendliche Zahlenraum, wenn man ihn auf 0..1077 abbilden müsste? Es gibt für jeden möglichen Hashwert also unendlich viele Inputs. Ein Hash ist ein Informationszerstörer! Eben, eine digitale Mühle halt.
Menschen und Computer haben aber rein gar nichts mit Unendlichkeit am Hut. Siehe Georg Cantor.
Dennoch, für uns im Alltag reicht es ein paar Milliarden Jahre weit.
ColdCard
Zurück zum Thema: Leute mit der ColdCard haben alles richtig gemacht, sie haben ein vom Computer getrenntes Cold-Wallet, das den Seed niemals rauslässt. Und dennoch, wie konnte der Angreifer denn an die Bitcoins ran?
Wie Ihr sicher schon gemerkt habt, geht es also darum, was man in den Trichter schüttet, denn anhand des Outputs kann ja eben niemand sagen, was es war. Aber wenn man eventuell erraten könnte, was es war, dann könnte man superschnell beliebig viele Seeds generieren und dann damit in der Blockchain nach benutzten Schlüsseln suchen und nachsehen, ob dort etwas drauf liegt. Wenn ja, dann schnell alles überweisen und voilà ... 3-2-1, alle Bitcoins sind nun meins.
Können wir als Benutzer die Qualität des Inputs beurteilen? Leider nein. Oder zumindest nur dann, wenn der Code des Seed-Generators öffentlich einsehbar ist, also Open Source.
Und hier wurde offenbar geschlampt. Egal, ob Closed oder Open Source, schlampen ist schlampen.
Wir haben ja oben am Beispiel der Varianten des Wortes Bitcoin gesehen, dass der Output eben keinerlei Rückschlüsse auf den Seed-Generator zulässt. Daher könnte man ja einfach das Tagesdatum inkl. Microsekunden nehmen. Würde ja reichen.
Also zum Beispiel ein Zeitstempel wie 2020-12-24 12:34:56.789012.
Nach einer Microsekunde ist das ja schon vorbei und die Hash-Funktionen werfen total verschiedene Resultate aus.
Nein, das ist ein total doofer Input. Warum?
Erstens gibt es diese Zeit 24 mal auf der Erde. Zeitzonen.
Zweitens sind es viel zu wenige Varianten. Wenn man bei Jahr 2000 startete, wären das ja grad mal 8 × 1014 Microsekunden gewesen, was ungefähr 250 ist, also nur 50 Bits.
Drittens weiss ja jeder, wie man so einen Zeitstempel herstellt, so dass man den Seed-Generator natürlich damit füttern könne. Also nichts von Zufall.
Wie könnte man das verbessern?
Nun, man könnte den Hash vom Zeitstempel, oder noch besser den Hash vom Zeitstempel + lepmetstieZ + stempeltieZ ja in den Seed-Generator füttern. Besser, aber immer noch schlecht. Klar, wieso?
Also es schläckt kei Geiss ewäg, man muss etwas finden, dass wirklich zufällig ist. Das man auch nicht nachbauen kann, selbst oder gar genau dann, wenn der Code des Seed-Generators Open Source ist.
Wenn man es schlimmer sieht: Gelänge es einem Produzenten einer Wallet, seine erzeugten Seeds unter 264 zu erzeugen, dann wären von links her 192 Nullen, bevor die 64 Nullen und Einsen kämen. An den Hashes sieht man dieses Faktum nicht an. Aber, der Produzent wüsste, dass er nun nur noch 18 Trillionen Möglichkeiten hat, also wie bei der bekannten Schach-Anekdote.
Es gab solche Fälle schon, allerdings nicht bei Bitcoin, aber offenbar bei den S-Boxen der (3)DES Verschlüsselungsalgorithmen. Niemand wusste es bis auf die NSA. Die hielten aber dicht.
Was käme also als richtig guter Seed-Generator in frage?
Es müsste etwas sein, das man im physikalischen Universum als echten Zufall akzeptieren würde. Denn wenn der Seed-Generator sowas als Input bekäme, könnte kein Mensch, kein Computer, nichts und niemand den Input in den Seed-Generator nachahmen, nachbauen, nachkonstruieren, voraussehen. Somit wäre dann der Output tatsächlich zufällig verteilt im Zahlenraum von 0..1077.
Sowas wäre also ein guter Input.
Damit ist das Rätsel schon "gelöst". Die ColdCard hat einen schlechten Seed-Generator. Punkt. Nur, keiner hat's bemerkt. Ausser der Hacker. Die Gelackmeierten sind die, die alles richtig gemacht haben. Das ist schmerzhaft.
Landläufig wird das in einen Topf geschmissen mit "Bitcoin ist gehackt" und "Selbstverwahrung ist mühsam und letztendlich unsicher".
Ersteres stimmt nicht, Bitcoin ist in keiner Weise gehackt, ja, es ist im klassischen Sinn nicht mal ein Hack, denn der Angreifer hat nichts kompromittiert. Wie er auch immer darauf kam, er hat nachgebaut, erraten, erforscht, was die ColdCard als Seed-Generator nimmt. Punkt.
Mit Ersetzen der ColdCard gegen etwas anderes ist es aber nicht getan. Denn Bitcoin hängt am Seed, nicht an einer Software oder Hardware. Der Seed bleibt schwach, auch wenn man den in die Bitbox importiert. Damit hat man das Problem nicht gelöst.
Auch die ColdCard kann ja hoffentlich Seeds importieren, man muss sie also nicht wegschmeissen, nur zuvor einen gscheiten Seed importieren. Denn wozu braucht man Hard- oder Software? Richtig, um die mühsame Mathematik einer Transaktionssignatur durchzuführen. Deshalb gibt's Wallets. Dafür ist der Seed dann nicht mehr (direkt) nötig.
Zweiteres hat den Funken Wahrheit in sich, dass wir als Konsumenten der Produkte eben NICHT immer wissen, ob die Produkte gut gemacht sind. Das gilt besonders bei Software. Die schlimmsten Sünden sind ja jeweils jährlich an den Themen des C3, Chaos Communication Congress zu sehen.
In diesem Sinne sind wir eh alle den Produzenten von digitalen Dingern ausgeliefert. Die andere Seite der Selbstverwahrung ist aber, dass man gar kein elektronisches Gerät braucht, um einen Input für den Seed-Generator zu liefern: Würfeln. Es geht und wie man das macht, findet man unter Dice Ware.
Bei Bitcoin ist es halt so, dass wir kein Gegenüber haben. Wenn unsere Administrationsprodukte Fehler haben, ist's um "meine" Bitcoin geschehen.
Drum nenne ich das ColdCard Zeug ein Desaster. Weil niemand es wissen kann - ausser die Hersteller.
Andere Wallets haben natürlich sofort reagiert und nachgelegt mit Information, so wie im Blog der bekannten Bitbox 2 / Nova.
Wenn die Leute von Coinkite wirklich so bescheuert waren, einen schlechten Seed-Generator einzubauen ... dann sollten sie vom Markt verschwinden. Denn in der Welt von Kryptografie hängt alles von gutem Zufall ab. Denn ohne Zufall ist die benutzte Mathematik immer deterministisch, wie die Hash-Funktion.
Woher also der zufälligste Zufall?
Es gibt verschiedene Methoden, aber wer mal bei mir im Arduino Kurs war, kennt den besten Effekt bereits:
Wenn man den AD-Wandler nicht irgendwo anschliesst, sprich, den Input einfach offen liegen lässt, dann erzeugt der AD-Wandler ziemlich gute zufällige Werte, denn der versucht ja, den Spannungswert am Eingang zu digitalisieren. Wenn der Pin aber "in der Luft hängt", Elektronikerslang, dann misst er eigentlich im besten Fall die Brownsche Molekularbewegung, also den Zustand der Materie, die den Eingangswert des AD-Wandlers bildet. Und was deren Moleküle grad so treiben bei 20° Raumtemperatur ... DAS weiss nun wirklich niemand.
Jedes gute Hardwarewallet wie eben "unsere" Schweizer Bitbox hat sowas. Kaufen!
Weil's grad passt heute: Schweizer Qualität seit 1291 :-)