3. Adressen

Dieses Kapitel behandelt

  • Grundlegende Privacy, oder Datenschutz

  • Ersetzen von Namen durch public Key Hashes

  • Schutz gegen teure Tippfehler

Am Ende dieses Kapitels wird das Cookie Token Spreadsheet keine persönlichen Namen mehr haben–wir werden diese Namen durch Hashes von public Keys ersetzen. Das ist aus Sicht der Privacy nützlich. Niemand kann leicht erkennen, wer an wen bezahlt, was es schwieriger macht, aus dem Spreadsheet Daten zu ernten und zu sehen, wer wie viele Kekse isst. Lisa findet es ausserdem nützlich, weil sie keine Tabelle mit Namen und public Keys mehr pflegen muss.

Wenn wir das Spreadsheet auf public Key Hashes umstellen, benutzen die Kollegen nicht mehr ihre Namen in den Mails an Lisa. Stattdessen verwenden sie Hex-Zeichenketten, die public Keys repräsentieren. Das bedeutet, es ist einfacher, Tippfehler zu machen. Wenn du einen Tippfehler machst, ist dein Geld am Ende digital verbrannt!

Ein paar Kollegen erfinden Cookie Token Adressen (Bitcoin Adressen), die sie vor dem Verlust durch Tippfehler schützen (Abbildung 1) Cookie Token Adressen werden von Benutzern untereinander verwendet, wenn sie sich gegenseitig bezahlen, aber sie finden im Spreadsheet keine Verwendung.

03 01
Abbildung 1. Cookie Token Adressen sind exakt dasselbe wie Bitcoin Adressen. Sie werden hauptsächlich von Wallet Software verwendet.

3.1. Keks-Essgewohnheiten entlarvt

Acme Versicherung

Dieses höchst unethische Versicherungsunternehmen unternimmt ernsthafte Anstrengungen, unsere Gewohnheiten herauszubekommen, um deine Versicherungsprämie “anzupassen”.

Du und deine Kollegen sind bei der Acme Versicherung krankenversichert. Acme hat John überredet, ihnen eine Kopie des Spreadsheets zu geben. Acme denkt sich, dass sie damit die Prämien anpassen können, oder im Falle eines Disputes die Keks-Essgewohnheiten (Abbildung 2) gegen die Versicherungsnehmer verwenden können.

03 02
Abbildung 2. Die Acme Versicherung beobachtet Chloes Keks-Essgewohnheiten.

Eine weitere verstörende Tatsache bei dem Spreadsheet ist, dass jeder Mitarbeiter ganz leicht die Kontostände aller Kollegen herauskriegen kann, ebenso wie deren Keks-Essgewohnheiten.

Die Mitarbeiter haben Lisa gebeten, sich eine Lösung dafür einfallen zu lassen. Ansonsten würden sie aufhören, das Spreadsheet zu benutzen.

3.2. Ersetzen von Namen durch public Keys

u03 01

Lisa hat die Tabelle der Namen und public Keys die ganze Zeit aktuell gehalten, seitdem die Kollegen angefangen haben, digitale Signaturen zu benutzen. Sie hat keine Lust mehr darauf, also lässt sie sich etwas einfallen, was sowohl ihr als auch ihren Kollegen zugute kommt: Lisa ersetzt alle Namen im Spreadsheet mit den entsprechenden public Keys (Abbildung 3).

03 03
Abbildung 3. Ersetzen von Namen durch public Keys. Das Spreadsheet ist jetzt unleserlicher, was aus Privacy Sicht gut ist.

Jetzt ist es schwer zu sehen, wie viele Kekse Chloe gegessen hat, wenn man nicht ihren public Key kennt. Wenn die Acme Versicherung dieses neue Spreadsheet bekommt, kann sie nicht mehr sehen, wer Sender und Empfänger sind. Sie sieht nur noch die public Keys von Sender und Empfänger jeder Zahlung.

Lisa kann jetzt die umständliche Tabelle aus Namen mit zugehörigen public Keys löschen. Aber sobald sie das tut, können die Benutzer für Zahlungen nicht mehr ihre Namen verwenden. Sie müssen stattdessen die public Keys von Sender und Empfänger benutzen (Abbildung 4).

Alte Variante
u03 02
03 04
Abbildung 4. Neue Zahlweise mit public Keys anstelle von Namen

Die Mail an Lisa enthält einige wichtige Teile:

  • Eine Nachricht mit

    • Betrag

    • Absender public Key

    • Empfänger public Key

  • Signatur, die mit dem private Key des Senders erstellt wurde

Der wesentliche Unterschied ist, dass die Zahlung nun pseudonym ist: Namen sind durch die korrespondierenden public Keys ersetzt worden. Abgesehen davon sehen die Zahlungen noch genauso aus wie zuvor.

3.2.1. Neuer Zahlungsvorgang

Angenommen eine neue Mitarbeiterin hat gerade in der Firma angefangen. Ihr Name ist Faiza. Die Firma möchte ihr 100 CT als Willkommensgeschenk senden. Wie kann die Firma die 100 CT an Faiza schicken?

Zuerst braucht die Firma den public Key des Empfängers–Faiza. Faiza hat noch nie Cookie Tokens benutzt, also muss sie ein neues Schlüsselpaar generieren und den public Key dem Sender–der Firma–geben, wie Abbildung 5 zeigt.

03 05
Abbildung 5. Faiza generiert ihren public Key und gibt ihn der Firma. Die Firma erzeugt eine Zahlung mit Faizas public Key als Empfänger.

Faiza erzeugt einen private und einen public Key, wobei sie dem selben Prozess folgt wie in [improving-cookie-token-security], aber sie gibt ihren public Key nicht Lisa. Jetzt wo Lisa nicht mehr die Tabelle mit Namen und public Keys pflegt, hat es keinen Sinn, ihr den public Key zu geben. Sie braucht ihn nicht. Stattdessen gibt Faiza den public Key der Partei, die ihr Cookie Tokens schicken will–der Firma.

Die Firma erzeugt eine Nachricht, in der sie Lisa bittet, 100 CT von 037e944a…36de9496 an 029a726c…ad8f436d zu senden. Dann signiert sie diese Nachricht digital und schickt sie an Lisa. Lisa benutzt

  • Die Nachricht

  • Den public Key des Senders

  • Die Signatur

Lisa in Bitcoin

Lisa führt mit den Cookie Tokens dieselben Aufgaben aus wie sie ein Bitcoin Miner bei Bitcoin Zahlungen ausführen würde.

um sicherzustellen, dass die Nachricht mit dem private Key, der zu dem public Key des Senders gehört, signiert wurde. Sie verifiziert ebenfalls, dass im Spreadsheet auf dem public Key des Senders ausreichend Guthaben vorhanden ist. Sie tut dies auf die gleiche Weise, wie sie es tat, als im Spreadsheet noch Namen standen–sie sucht nach dem public Key des Senders und berechnet den Kontostand.

Lisa hat den public Key des Empfängers vorher noch nie gesehen, aber das ist ihr egal. Ihr geht es nur darum, dass der Sender genug Geld zum Ausgeben hat, und dass die Nachricht korrekt signiert wurde. Sie trägt in die Empfängerspalte des Spreadsheets ein, was immer in der Nachricht stand.

u03 03

Faiza entdeckt eine neue Zeile mit ihrem public Key in der An: Spalte. Das gibt ihr ein warmes, gutes Gefühl. Jetzt kann sie ihre Cookie Tokens benutzen, wie sie will. Faiza musste Lisa nicht mit ihrem public Key behelligen, was Lisa einiges an Arbeit erspart hat.

Sammeln wir einmal auf, was bisher passiert ist:

  • Namen sind im Spreadsheet durch public Keys ersetzt worden.

  • Lisa hat die Tabelle mit Namen und public Keys gelöscht.

  • Zahlungen werden jetzt durch public Keys anstelle von Namen als Angabe von Sender und Empfänger durchgeführt.

Diese Änderungen haben die Privacy verbessert und Lisa die Arbeit vereinfacht. Am Ende dieses Kapitels werden wir mehr darüber diskutieren, wie wir die Privacy weiter verbessern können.

Die Mail an Lisa in diesem Beispiel gibt gegenüber Lisa preis, wer der Sender ist (die Firma in diesem Fall), weil deren Absenderadresse im Von: Feld der Mail steht. Für den Moment können wir annehmen, dass Lisa diese persönliche Information weder ausnutzt noch preisgibt. Wir benutzen Mail in diesen Beispielen anstelle des Bitcoin Peer-to-Peer Netzwerks. Das Bitcoin Netzwerk, eingehender besprochen in [ch08], benutzt keinerlei persönliche Information.

Bitte denk einen Moment darüber nach, was die Acme Versicherung jetzt noch aus dem Spreadsheet herauslesen kann. Welche Information kann sie herausbekommen, wenn sie den Namen von Sender oder Empfänger einer Zahlung herausbekommt? Sie wird in der Lage sein, alle Zahlungen herauszubekommen, die diese Person getätigt hat.

3.3. Abkürzen des public Keys

Public Keys im Spreadsheet zu benutzen hat die Privacy verbessert, aber solche Keys verbrauchen im Vergleich zu Namen sehr viel Platz. Der Name “John” nimmt 4 Bytes im Spreadsheet ein, wohingegen ein public Key 33 Bytes belegt. Das Spreadsheet so klein wie möglich zu halten ist wichtig, weil ein kleineres Spreadsheet kürzere Ladezeiten für die Kollegen bedeutet, die ihre Kontostände checken wollen; es belegt ausserdem weniger Platz auf Lisas Festplatte.

3.3.1. Hashen des public Keys zu 20 Bytes

u03 04

Einige Entwickler unter den Kollegen glauben, sie können die 33 Byte public Keys durch etwas kürzeres ersetzen und trotzdem ausreichende Sicherheit beibehalten. Sie schlagen vor, jeden public Key im Cookie Token Spreadsheet durch einen kryptografischen Hash des public Key zu ersetzen. Das kürzt Sender und Empfänger im Spreadsheet ab, schützt aber das Geld der Benutzer im Falle eines Fehlers in der public Key Ableitungsfunktion, wie wir später sehen werden. Das Hashen geschieht nicht mittels einer einzelnen kryptografische Hashfunktion, sondern mit zwei verschiedenen, wie Abbildung 6 illustriert. Wir diskutieren den Grund für die Benutzung zweier Hashfunktionen im nächsten Abschnitt.

03 06
Abbildung 6. Ersetzen des public Keys mit dem RIPEMD160 Hash des SHA256 Hashes des public Keys

Der public Key wird zunächst mit SHA256 gehasht, womit du aus dem letzten Kapitel schon vertraut sein müsstest. Der Output dieser kryptografischen Hashfunktion wird dann mit RIPEMD160 gehasht, einer anderen kryptografischen Hashfunktion, die als Output eine 160 Bit (20 Byte) lange Zahl erzeugt. Wir nennen diesen letzten Hash den public Key Hash (PKH). Alle public Key im Spreadsheet werden durch ihre jeweiligen PKHs ersetzt.

Herkömmliche Zahlung
u03 05

Die Zahlung unterscheidet sich jetzt von der, bei der Faiza 100 CT von der Firma erhalten hatte. Angenommen John möchte einen Keks kaufen (Abbildung 7).

03 07
Abbildung 7. John kauft einen Keks. Der Sender ist immer noch ein public Key, aber der Empfänger ist ein PKH anstelle eines public Keys. Lisa muss den PKH aus dem public Key des Senders berechnen, um den Kontostand zu prüfen und die Zahlung abzuwickeln.
p2pkh

Die meisten Zahlungen in Bitcoin werden mit PKH als Empfänger abgewickelt. Dieser Typ wird oft als pay-to-public-key-hash (p2pkh) bezeichnet, aber es gibt auch andere Bezahlarten.

Erstens wird die Nachricht an Lisa etwas abgewandelt. John muss den PKH des Cafés–was früher der public Key war–als Empfänger verwenden. Der Sender ist immer noch ein public Key in der Nachricht, da der public Key zur Verifikation der Signatur benötigt wird. Lisa merkt sich ja nicht mehr die public Keys der Kollegen.

Zweitens, weil das Spreadsheet jetzt PKHs enthält, muss Lisa den PKH des Senders aus dem public Key des Senders ausrechnen, um den Kontostand des Senders zu berechnen und um in der Lage zu sein, die Zahlung in das Spreadsheet einzutragen.

3.3.2. Warum SHA256 und RIPEMD160?

RIPEMD160 als letzten kryptografischen Hash zu benutzen ist eine bewusste Wahl, damit die PKHs möglichst kurz werden. Vergleiche doch einmal die Outputs von SHA256 und RIPEMD160:

SHA256:
85ae273f0aa730eddf2285d3f3ab071eb29caba1e428db90e6dfbd71b8e1e918
RIPEMD160:
5f2613791b36f667fdb8e95608b55e3df4c5f9eb

Es ist ein gut balancierter Tradeoff zwischen Sicherheit und Grösse.

Aber weshalb zwei verschiedene kryptografische Hashfunktionen? Wir wissen nicht genau, warum dieses Schema für Bitcoin ausgesucht wurde, weil sein Erfinder, Satoshi Nakamoto, aufgehört hat, mit der Bitcoin Community zu kommunizieren. Wir können nur spekulieren. Diskutieren wir stattdessen lieber die Eigenschaften dieses Verfahrens.

Wenn eine der Hashfunktionen sich als nicht Pre-Image resistent herausstellen würde, wäre es die andere immer noch. Wenn man also einen Input für RIPEMD160 berechnen könnte, der einen bestimmten PKH Output ergibt, dann müsste man immer noch eine Pre-Image Attacke gegen SHA256 (mit ungefähr 2255 mal raten) ausführen, um den public Key zu finden. Ebenso müsste man, wenn man einen Input für SHA256 finden könnte, der einen bestimmten Output erzeugt, immer noch erst eine Pre-Image Attacke auf RIPEMD160 ausführen, bevor man das Ergebnis zur Berechnung des public Keys hernehmen kann.

u03 06

Sollte sich andererseits herausstellen, dass die Outputmenge einer der kryptografischen Hashfunktionen kleiner ist als angenommen, dann leidet darunter die Sicherheit der gesamten Hashfunktionen-Kette. Um das klarer zu machen, nimm an, SHA256 hätte nur 100 mögliche Output Werte. man kann dann Geld stehlen, indem man verschiedene zufällige private Keys ausprobiert und die korrespondierenden PKHs ausrechnet. Wenn ein PKH mit dem Zielwert übereinstimmt, dann hättest du einen private Key gefunden, mit dem du Geld stehlen könntest. Im Durchschnitt müsstest du nur 50 private Keys ausprobieren, um von einem PKH zu stehlen. Diese Eigenschaft verbindet das Schlechteste beider Welten: Wenn eine der beiden Funktionen Schwächen hat, dann ist die gesamte Kette geschwächt. Die Wahrscheinlichkeit, dass eine der Funktionen eine solche Schwäche hat, ist gering. Wenn es eine solche Schwäche wirklich gibt, dann ist die Verringerung der Outputmenge wahrscheinlich nicht signifikant genug, um die Sicherheit in der Praxis zu beeinträchtigen. Denke dran, dass wir immer noch keine einzige Kollision in irgendeiner dieser kryptografischen Hashfunktionen gefunden haben.

Es gibt ausserdem noch zu bedenken, dass unterschiedliche Organisationen die beiden kryptografischen Hashfunktionen entwickelt haben. RIPEMD160 wurde an einer Europäischen Universität in offener Kollaboration mit einer grossen Gemeinde von Kryptografen entwickelt. SHA256 wurde von der US National Security Agency (NSA) entwickelt. Beide werden als sicher betrachtet, und beide unterzogen sich genauesten Prüfungen durch eine grosse Menge Leute.

Ist die Privacy verbessert worden?

Nein

Jetzt, wo wir die Sicherheit des Cookie Token Spreadsheets verbessert haben, lass uns erneut über Sicherheit nachdenken. Hat es die Privacy verbessert? Ist es schwieriger für die Acme Versicherung geworden, Information darüber herauszufinden, wer wen bezahlt im Vergleich zu der Zeit, wo wir public Keys im Spreadsheet benutzt haben?

Die Antwort lautet Nein. Es gibt praktisch eine eins-zu-eins Beziehung zwischen public Keys und PKHs. PKHs zu benutzen verhüllt nicht zusätzlich persönliche Informationen gegenüber der Verwendung von public Keys.

3.4. Vermeidung teurer Tippfehler

Wenn Lisa eine Zahlung vor Ausführung verifiziert, dann ist ihr egal, wer der Empfänger ist oder ob er überhaupt existiert. Sie trägt einfach in die Empfängerspalte des Spreadsheets ein, was der Sender dort eingetragen haben möchte. Sie kann nicht einmal wissen, ob ein Empfänger gültig ist, weil sie nicht mehr jeden persönlich kennt.

Das ist bequem für Lisa, aber es kann zum Verlust von Geld führen, wenn jemand nicht vorsichtig ist. Stell dir nochmal vor, dass John einen Keks kaufen will. Diesmal ist er nicht vorsichtig genug beim Schreiben seiner Nachricht, wie Abbildung 8 zeigt.

03 08
Abbildung 8. John macht einen Tippfehler im Empfängerteil in der Mail an Lisa. Was nun?

Er macht einen Tippfehler in dem Empfänger-PKH. Das Letzte Zeichen ist ein d obwohl es ein c hätte sein sollen. Was passiert nun?

Jeder Empfänger ist gültig

Es gibt keinen “falschen” Empfänger-PKH. Lisa trägt jeden Empfänger ein, solange die Signatur gültig ist.

John bemerkt den Fehler nicht, signiert fröhlich die Nachricht und schickt die Mail an Lisa. Lisa überprüft die Signatur, was erfolgreich verläuft, und berechnet den PKH des Senders. Der Empfänger ist ihr egal. Sie trägt eine neue Zeile im Spreadsheet ein, in der von 5f261379…f4c5f9eb an 87e3d169…8393b1cd gezahlt wird.

Dann betrachtet sie ihre Arbeit als erledigt und wendet sich anderen interessanten Aufgaben zu. Der Cafébesitzer, der im Spreadsheet nach seinem PKH sucht, sieht keine eingehende Zahlung. John steht an der Theke vom Café und brüllt den Besitzer an, dass er den Betrag überwiesen habe, also “Gib mir den verdammten Keks!” Der Cafébesitzer weigert sich. John schaut sich das Spreadsheet näher an und sucht nach seinem PKH. Er findet den Transfer, den er gerade gemacht hat und erkennt seinen Tippfehler.

u03 07

John hat Geld an einen “Public Key Hash” geschickt, zu dem es keinen bekannten private Key gibt. Niemand wird jemals die 10 CT ausgeben können–weder das Café, noch John, niemand. John hat soeben 10 CT digital verbrannt.

Unglücklicherweise wird so etwas wieder und wieder passieren, wenn nichts getan wird, um es zu verhindern. Das Problem kann an jedem Punkt auftreten von da, wo der Cafébesitzer seinen eigenen PKH liest um ihn John zu geben, bis zu John, wenn er seine Nachricht an Lisa schreibt, bevor er sie signiert. Man könnte argumentieren, dass auch Lisa beim Pflegen des Spreadsheets diesen Fehler machen könnte, aber sie ist so sorgfältig, dass dies niemals passieren kann. Sie ist einfach zu gut in dem, was sie tut. Lisa wird nie der Grund sein, weshalb jemandes Geld verbrannt wird.

3.4.1. Wo waren wir?

Dieses Kapitel befasst sich mit Bitcoin Adressen. Zur Erinnerung daran, wo all dies in Bitcoin hineinpasst, denke an das Diagramm aus [ch01], das in Abbildung 9 wieder gezeigt wurde.

03 09
Abbildung 9. Bitcoin Adressen

Gegen Ende dieses Kapitels werden wir bei Bitcoin (Cookie Token) Adressen gelandet sein. Wir haben gerade die Namen im Spreadsheet durch PKHs ersetzt. Wir gehen jetzt über zu Bitcoin Adressen. Eine Bitcoin Adresse ist ein konvertierter PKH–das bedeutet, es ist ein PKH, der so geschrieben wird, dass er besser für menschliche Benutzer geeignet und gegen Tippfehler geschützt ist. Der PKH wird an Lisa geschickt (oder an Bitcoin Nodes), aber die Adresse ist das, was die Benutzer sehen und untereinander austauschen.

3.4.2. Base58check

Die sicherheitsorientierten Leute unter den Kollegen diskutieren das Problem mit den Tippfehlern und lassen sich die Idee mit Cookie Token Adressen einfallen. Eine Cookie Token Adresse ist ein PKH, der codiert wird, um Tippfehler zu bemerken. Der PKH kann zwischen dieser Codierung und dem einfachen Textformat hin und zurück konvertiert werden.

Bitcoin Adressen

Cookie Token Adressen sind exakt dasselbe wie die üblichste Form der Bitcoin Adressen. Es gibt allerdings noch andere Arten von Bitcoin Adressen.

Angenommen Faiza tut John leid, und sie möchte ihm 20 CT von ihren 100 CT geben, um seinen Schmerz zu lindern. Sie möchte nicht denselben Fehler wie John begehen, also bittet sie ihn um seine Cookie Token Adresse. John erzeugt diese, indem er seinen PKH mit einer Funktion namens base58check codiert (Abbildung 10).

03 10
Abbildung 10. Überblick über die base58check Codierung, die einen PKH in eine Cookie Token Adresse umwandelt
Wer benutzt Cookie Token Adressen?

Cookie Token Adressen werden nur zwischen Benutzern verwendet, um einen PKH sicher zu transportieren. Lisa sieht diese nie.

Das Resultat ist Johns Cookie Token Adresse: 19g6oo8f…gCenRBPD. John reicht diese Adresse Faiza, die dann die Zahlung anhand des Prozesses in Abbildung 11 durchführt.

Der Zahlungsprozess ändert sich für den Sender, aber für Lisa ändert sich nichts. Faiza base58check–decodiert Johns Adresse in einen PKH. Dieses Decodieren stellt sicher, dass keine Tippfehler in der Adresse gemacht worden waren.

03 11
Abbildung 11. Faiza nimmt die Zahlung an Johns Cookie Token Adresse vor. Sie decodiert die Adresse in den PKH, wobei sie verifiziert, dass die Adresse keine Tippfehler enthält.

Wie zuvor erwähnt, kann ein PKH von und zu einer Adresse konvertiert werden. Es ist keine Einwegfunktion. Es sind lediglich zwei verschiedene Arten, den PKH zu repräsentieren, entweder als eine Serie von Bytes oder als eine Adresse (Abbildung 12).

03 12
Abbildung 12. Der PKH kann in eine Adresse codiert und wieder zurück zu einem PKH decodiert werden

Die Mail an Lisa ist genau dieselbe wie bisher. Nur Benutzer verwenden die Cookie Token Adresse. Sie gehört keineswegs zu Lisas Validierungsprozess oder zum Spreadsheet.

Base58check Codierung

Schauen wir mal, wie diese mysteriöse base58check Codierung funktioniert (Abbildung 13). Zuerst wird eine Versionierung vor den PKH gesetzt. Die Leute, die die Idee mit den Cookie Token Adressen hatten, wollten zukünftige Upgrades zum Adressformat einfacher machen. Bislang gibt es nur eine Version von Cookie Token Adressen. Diese Version ist ein einzelnes Byte mit dem Wert 0.

03 13
Abbildung 13. Base58check Codierung von Johns PKH. Eine Version wird dem Hash zugefügt, dann eine Prüfsumme, oder Checksum, gebildet und an den versionierten Hash gehängt. Schliesslich wird der prüfsummenbehaftete und versionierte Hash mit base58 codiert
u03 09

Um Tippfehler zu entdecken, wird eine Checksum angefügt. Diese Checksum wird aus dem versionierten PKH errechnet. Um eine Checksum zu bilden, hasht base58check den versionierten PKH mit Doppel-SHA256. Das bedeutet, er wird erst mit SHA256 gehasht und der resultierende Hash wird erneut mit SHA256 gehasht. Dann nimmt er die ersten 4 Bytes des zweiten Hashes als Checksum. Die Checksum wird dem versionierten PKH hinten angehängt. Wir sehen gleich, wie diese Checksum den Benutzer von Tippfehlern schützt. Etwas Geduld!

Wir haben mit einem PKH von 20 Bytes (40 Hexziffern) begonnen. Aber jetzt, wo wir eine Version und eine Checksum hinzugefügt haben, haben wir 25 Bytes (50 Hexziffern). Um das auszugleichen, codieren wir die 25 Bytes in einer Form, die kompakter als die hexadezimale Darstellung ist.

Verwendung einer kompakteren Codierung

Hex Codierung ist ineffizient zur Darstellung von Datenbytes. Es benötigt 2 Zeichen zur Darstellung von einem Byte. Wir benutzen ja nur 16 Zeichen, wobei jedes Zeichen nur 4 Bits repräsentiert, 0000 bis 1111.

Viele Codierschemata verwenden mehr Zeichen, um Daten darzustellen. Das Verbreitetste ist base64, bei dem jedes Zeichen 6 Datenbits repräsentiert; um dies zu erreichen, benötigt dieses Schema mehr als nur Buchstaben und Ziffern. Base64 verwendet folgendes Alphabet:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Das Zeichen A repräsentiert die Bits 000000, B repräsentiert 000001, und das Zeichen / repräsentiert 111111. Das ist eine schöne, einfache, kompakte Darstellungsform für Daten mit menschenlesbaren Zeichen. Ich habe in diesem Buch bereits mehrfach base64 codierte Daten benutzt, um Signaturen darzustellen.

u03 10

Aber base64 passt nicht besonders gut auf die Problemstellung der Cookie Token Adressen. Wir brauchen eine Codierung, die Tippfehler nicht nur findet, wenn sie passiert sind, sondern auch das Risiko verringert, überhaupt welche zu machen. Bedenke, dass einige Zeichen sich in manchen Fonts ähneln, wie lI (kleines L, grosses i) und 0O (Null und grosses O). Wir brauchen ausserdem ein Format, das die Benutzer leicht kopieren und einfügen können, was bedeutet, dass Sonderzeichen wie + und / nicht vorkommen sollten—diese hindern uns daran, die ganze Adresse per Doppelklick zu markieren. Diese sechs Zeichen auszuschliessen, reduziert die Wahrscheinlichkeit von Tippfehlern. Aber jetzt haben wir nur noch 58 Zeichen übrig, also brauchen wir eine neue Art der Codierung.

Die neue Art der Codierung heisst base58, weil deren Alphabet 58 Zeichen enthält.

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Wenn dich dieser maschinenorientierte base58 Hokuspokus abschreckt, kannst du zu Abschnitt 3.4.2.3 vorspulen und einfach akzeptieren, dass base58 eine Art der Codierung und Decodierung von Daten ist. Der Rest von euch macht weiter. Es macht Spass.

In base64 repräsentiert jedes Zeichen 6 Bits, was das Codieren und Decodieren einfach macht. Aber bei base58 repräsentiert jedes Zeichen etwas weniger als 6 Bits, aber mehr als 5 Bits. Wir müssen die Daten anders codieren.

Gehen wir zu dem Beispiel zurück, in dem John seine Adresse erzeugt. Er hat gerade die Version und Checksum hinzugefügt. Jetzt ist es Zeit, die 25 Bytes in das Endergebnis zu überführen: die Adresse (Abbildung 14).

03 14
Abbildung 14. Johns versionierter und prüfsummierter PKH mit base58. Der wichtige Teil ist dort, wo wir die Zahl durch 58 teilen und die Reste behalten, die dann einer nach dem anderen in der Lookup-Tabelle abgebildet werden.

Die Grundstrategie von base58 ist die, die gesamten Daten als eine riesige Zahl zu betrachten, die man wieder und wieder durch 58 teilt, bis der Quotient 0 ergibt; man merkt sich dabei den Rest jeder Division. Man schaut in der Lookup-Tabelle jeden Rest nach und hängt für jedes führende Byte 0 im Input eine 1 hinten an. Am Schluss wird die Zeichenkette umgedreht, und das Ergebnis ist Johns Cookie Token Adresse. Wohlgemerkt beginnen alle, nicht nur Johns, Cookie Token Adressen mit einer 1. Das liegt daran, dass das Versionsbyte 0 ist, was durch das Zeichen 1 codiert wird.

Du kannst base58 codierte Daten wie Johns Adresse zurück zum ursprünglichen Input der base58 Codierung decodieren. Ich überlasse das dem interessierten Leser als Übung.

Denke daran, dass die base58 Codierung nichts Neues ist. Es ist eine generische Art, eine Dezimalzahl in eine andere Basis umzurechnen. Man kann denselben Algorithmus benutzen, um stattdessen zur Basis 3 zu konvertieren–man dividiert durch 3 anstatt durch 58. Ausserdem will man vielleicht die Lookup-Tabelle so ändern, dass sie 0 auf 0, 1 auf 1 und 2 auf 2 abbildet, damit man die gewohnten Zeichen bekommt. Schreibe zum Beispiel mal 17 zur Basis 3:

\[17=5*3+2 \\ 5=1*3+2 \\ 1=0*3+1\]

Dann schlage die Reste in der Lookup-Tabelle nach (dieselben Ziffern wie die, die du konvertierst), und du bekommst 2 2 1. Drehe das um und du bekommst das Endergebnis: 1 2 2. Verifiziere die Korrektheit wie folgt:

\[1*3^2+2*3^1+2*3^0=9+6+2=17\]
Base58check Decodierung
u03 11

John hat soeben seine Cookie Token Adresse durch base58check Codierung seines PKH erzeugt. Er hat die Adresse Faiza gegeben, damit sie ihm 20 CT senden kann. Jetzt muss Faiza eine Nachricht an Lisa schreiben. Um das zu tun, braucht sie Johns PKH. Das Gute an der base58check Codierung ist, dass der Prozess umkehrbar ist, sodass man den PKH aus der Adresse ermitteln und gleichzeitig auf Tippfehler prüfen kann (Abbildung 15).

03 15
Abbildung 15. Base58check Decodierung erreicht man im Grunde dadurch, dass man die base58check Codierung umdreht. Tippfehler werden erkannt, wenn die Checksum nicht passt.

Faiza nimmt Johns Cookie Token Adresse und base58-decodiert sie. Dann entfernt sie die Checksum und benutzt den verbliebenen Teil, den versionierten PKH, um die Checksum nochmal zu berechnen. Die neu berechnete Checksum und die soeben entfernte Checksum müssen gleich sein. Ansonsten war ein Tippfehler passiert, und in dem Fall würde Faiza keine Nachricht verfassen. Sie würde wissen, dass die Adresse auf dem Weg verfälscht wurde und keine Mail an Lisa schicken. Sie würde nochmal prüfen, dass sie die Adresse korrekt eingegeben hat und dass John ihr die richtige Adresse gegeben hatte, um herauszufinden, wo der Fehler passiert ist.

Wie sicher ist die Checksum? Nimm an, ein Tippfehler passiert in einer Adresse. Mit welcher Wahrscheinlichkeit würde die Checksum den Fehler nicht erkennen? Die Checksum ist 4 Bytes, was 232 ≈ 4,3 Milliarden Werten entspricht. Die Chance ist etwa 1 zu 4,3 Milliarden, dass base58check einen Tippfehler nicht bemerkt. Es ist ziemlich sicher.

3.5. Zurück zu Privacy

Obwohl die Privacy verbessert wurde, als wir die Namen durch PKH ersetzt haben, enthält das Spreadsheet immer noch Informationen, die für die Acme Versicherung nützlich sind.

Forensik

Diese Technik wird in Bitcoin häufig benutzt–zum Beispiel bei kriminaltechnischen Untersuchungen.

Zum Beispiel kann Acme herausfinden, dass das Café den PKH 87e3d169…8393b1cc besitzt, weil eine Menge Zahlungen dorthin geleistet worden sind. Von dort aus kann Acme sehen, welche PKHs die meisten 10 CT Zahlungen an diesen PKH senden. Sagen wir mal, Acme redet mit Faiza und bittet sie um Informationen zu ihren letzten Zahlungen. Sie hat bisher erst eine Zahlung geleistet, die an John. Weil Faiza nicht weiss, weshalb Acme diese Auskunft haben möchte, gibt sie an, dass die Zahlung an John ging.

Lieber John,

uns fiel auf, dass Sie ungesund leben. Wir haben Sie daher in eine höhere Kategorie eingestuft. Wir Gratulieren.

Mit freundlichen Grüssen, Acme Versicherung

Eine Woche später bekommt John einen Brief von Acme, der ihn höflich darüber informiert, dass er in eine höhere Risikoklasse aufgestiegen ist, und dass seine Versicherungsprämie entsprechend angepasst wurde.

Es verbleiben offenbar noch einige Privacy Probleme. Glücklicherweise können Benutzer so viele Adressen erzeugen wie sie wollen. Zum Beispiel könnte das Café eine einmalige Adresse für jede eingehende Zahlung erzeugen. Und John könnte beim nächsten Mal, wenn er von Faiza Cookie Tokens bekommt, eine neue Adresse generieren.

Einmalige Adressen für jede Zahlung zu benutzen macht es Acme schwieriger, Information aus dem Cookie Token Spreadsheet zu extrahieren, weil sie nicht mehr sagen können, welche Zahlungen der gleichen Person zuzurechnen sind.

3.6. Zusammenfassung

Dieses Kapitel begann damit, die Namen im Spreadsheet durch die jeweiligen PKHs der Benutzer zu ersetzen.

u03 12

Dann benutzten wir base58check, um aus dem PKH eine Adresse zu generieren. Lass uns die Teile zusammenfügen und den gesamten Cookie Token Adressenerzeugungs-Prozess vom Zufallszahlengenerator bis zur Adresse betrachten.

u03 13
u03 14

Faiza geht sicher, dass keine Tipfehler passieren, indem sie die Adresse base58check-decodiert, bevor sie die Nachricht signiert.

u03 15

3.6.1. Systemänderungen

Die Kozepttabelle (Tabelle 1) hat sich in diesem Kapitel nicht verändert. Cookie Token Adressen sind exakt das, was Bitcoin benutzt, also haben wir keine Konzepte eingeführt, die von Bitcoin abweichen.

Tabelle 1. Nichts Neues in der Konzepttabelle
Cookie Tokens Bitcoin Behandelt in

1 Cookie Token

1 bitcoin

[ch02]

Das Spreadsheet

Die Blockchain

[ch06]

Email an Lisa

Eine Transaktion

[ch05]

Eine Zeile im Spreadsheet

Eine Transaktion

[ch05]

Lisa

Ein Miner

[ch07]

u03 16

Dank PKH und Cookie Token Adressen kann Lisa ihre Tabelle von public Key loswerden. Wir nehmen PKH und Adressen in unseren Werkzeugkasten mit auf und geben Version 3.0 des Cookie Token Systems frei (Tabelle 2).

Tabelle 2. Release notes, cookie tokens 3.0
Version Feature Wie

new3.0

Sicher gegen teure Tippfehler

Cookie Token Adressen.

Privacy Verbesserungen

Ein PKH statt eines Namens steht im Spreadsheet.

2.0

Sichere Zahlungen

Digitale Signaturen lösen das Problem mit Betrügern.

1.0

Einfaches Bezahlsystem

Vertraut auf Lisas Integrität und ihre Kenntnis aller Mitarbeiter

Begrenzte Geldmenge

Lisa wird täglich mit 7,200 neuen CT belohnt; halbiert sich alle vier Jahre

3.7. Übungen

3.7.1. Wärm dich auf

  1. Der PKH ist kürzer als der public Key–nur 160 Bits. Wir haben ihn mittels RIPEMD160 gekürzt. Warum möchten wir ihn kürzer haben? Es gibt zwei gute Gründe.

  2. Base58check Codierung wird benutzt, um eine Cookie Token (Bitcoin) Adresse aus einem PKH zu erzeugen. Ist es möglich, den Prozess umzudrehen, um aus einer Adresse einen PKH zu machen?

  3. Wann wird base58check Decodierung benutzt, und von wem?

  4. Base58-codiere die beiden Hexziffern 0047. Benutze das folgende Diagramm. Du kannst diese Übung überspringen, wenn du nicht den Abschnitt über base58 Codierung gelesen hast.

    u03 17
  5. Welcher Teil der Adresse schützt sie am meisten vor Tippfehlern?

3.7.2. Grabe tiefer

u03 18
  1. Stell dir vor, John möchte einen Keks vom Café kaufen. Er besitzt zwei Adressen: @1 mit einem Kontostand von 5 CT, und @2 mit 8 CT. Sein Gesamtstand ist 13 CT, also sollte er 10 CT für einen Keks bezahlen können. Gib ein Beispiel, wie er 10 Cookie Token an das Café bezahlen könnte.

  2. Ist es möglich herzuleiten, welche Cookie Token Adressen in einer bestimmten Zahlung involviert waren, indem man das folgende Spreadsheet untersucht?

    u03 19
  3. Ist es möglich herzuleiten, welche public Keys in einer bestimmten Zahlung involviert waren, indem man nur dieses Spreadsheet untersucht?

  4. Angenommen jeder benutzt immer einmalige Adressen für jede Zahlung. Welche Information aus dem Spreadsheet kann Acme verwenden, um die Adressen des Cafés ungefähr zu identifizieren?

  5. Angenommen es gäbe einen ernsthaften Mangel in der public Key Ableitungsfunktion, sodass jeder aus einem public Key den private Key berechnen könnte. Was hindert in diesem Szenario einen Bösewicht daran, dein Geld zu stehlen?

    u03 20
  6. Angenommen es gäbe einen ernsthaften Mangel in RIPEMD160, sodass jeder ganz einfach ein 256 Bit Pre-image eines PKH erzeugen könnte. Das würde bedeuten, es wäre nicht Pre-Image resistent. Was hindert einen Bösewicht in diesem Szenario daran, dein Geld zu stehlen?

3.8. Zusammenfassung

  • Privacy ist für dich wichtig, nicht nur für Kriminelle.

  • PKHs statt persönliche Namen für die Empfänger von Zahlungen zu benutzen, ist sicherer und wichtig für die Privacy.

  • Einen PKH als Bitcoin Adresse zu codieren, verringert dank der Checksum in der Adresse das Risiko, Geld ins Leere zu schicken.

  • Nur Benutzer interessieren sich für Bitcoin Adressen. Das Bitcoin Netzwerk oder Lisa befasst sich nur mit einfachen PKHs.

  • Man kann so viele Bitcoin Adressen haben wie man will. Mehrere Adressen zu benutzen, vorzugsweise eine pro empfangener Zahlung, verbessert deine Privacy.