Kryptografie des Bitcoins für Anfänger

ell-kurveKryptografie bildet den Kern des Bitcoins, und nur wer sie versteht, kann beurteilen, wie sicher der Bitcoin ist. Das Problem ist nur, dass moderne Kryptographie ziemlich schwer zu durchschauen ist und man sich schneller, als einem lieb ist, einen dicken Knoten in die Gehirnwindungen hineingedacht hat. Zum Glück hat dieser Blog Leser, die nicht nur reichlich Erfahrung damit haben, auch vertrackste Knoten aufzulösen, sondern auch das Talent, die Lösung anschaulich zu erklären. Einer davon hat mir einen Beitrag zur Kryptografie des Bitcoins zugeschickt. Vertiefe Kentnisse in Mathematik sind nicht nötig, um den Artikel zu verstehen, doch ein wenig Konzentration sollte man zum Lesen schon mitbringen. Ich verspreche, dass Sie danach nicht nur den Bitcoin mit anderen Augen sehen werden.

Symmetrische Verschlüsselung

Die einfachste Definition von Verschlüsselung ist, dass sie vor Mitlauschern schützen soll. Das ist schon lange so und wird auch immer so bleiben. Ob im Krieg, in der Diplomatie oder im Internet. Möchte man einer Person ein Geheimnis anvertrauen, trifft man sich am besten privat mit dieser Person in einem sicheren Raum. Aus naheliegenden Gründen ist dies aber nicht immer möglich.

Gaius Julius Cäsar, Imperator des römischen Reiches, Eroberer Galliens (c) Andreas Liebhart / pixelio.de

Gaius Julius Cäsar, Imperator des römischen Reiches, Eroberer Galliens (c) Andreas Liebhart / pixelio.de

Schon die alten Römer kannten das Problem. Wie teilt der Imperator seinen Truppen in Germanien mit, dass sie sich zurückziehen sollen? Schreibt man diesen Befehl auf ein Pergament und lässt einen Reiter dieses überbringen, läuft man Gefahr, dass der Reiter von den Germanen überwältigt und die Nachricht gegen die römischen Truppen verwendet wird.

Die Römer haben daher eine einfache Verschlüsselung verwendet, die heute nach dem großen Feldherren der Cäsar-Code genannt wird: Jeder Buchstabe im Alphabet wird durch einen anderen Buchstaben ersetzt.

Aus ABCDEFGHIJKLMNOPQRSTUVWXYZ wird EFGHIJKLMNOPQRSTUVWXYZABCD. Jeder Buchstabe wird um 4 Buchstaben nach rechts verschoben. Die Zahl 4 ist in diesem System der geheime Schlüssel, der sowohl dem Imperator als auch dem Kommandanten in Germanien bekannt ist.

So könnte der Imperator, nachdem er von einer germanischen Truppenverstärkung erfahren hat, seinem Zenturio am Rhein folgende Nachricht schicken: Kivqermwgli Yifivqeglx: Dmilx iygl dyvyigo mr hmi Fivki. Wissen Sie, was es bedeutet? Da Sie den geheimen Schlüssel kennen, sollte es kein Problem sein.

Die Germanen hatten es schwerer. Sofern sie das Verfahren kannten, mussten sie Schlüssel für Schlüssel durchprobieren. Erst die 1, dann die 2, und so weiter. Diese Methode nennt man Brute-Force, mit ihr bricht man Verschlüsselung, indem man einfach so lange Schlüssel baut, bis einer passt. Hier eine kleine Tabelle mit den probierten Schlüsseln:

  1. Jhupdqlvfkh Xhehupdfkw:Clhkw hxfk cxuxhfn lq glh Ehujh.
  2. Igtocpkuejg Wgdgtocejv:Bkgjv gwej bwtwgem kp fkg Dgtig.
  3. Hfsnbojtdif Vfcfsnbdiu: Ajfiu fvdi avsvfdl jo ejf Cfshf.
  4. Germanische Uebermacht: Zieht euch zurueck in die Berge.

Kryptographie – im U-Boot-Krieg siegentscheidend (c) MEG / pixelio.de

Und damit hätten wir es. Das Verfahren ist also nicht ganz so sicher. Ein geübter Kryptograf kann es relativ schnell knacken, von einem Computer ganz zu schweigen. Daher wurde das Cäsar-Verfahren in vielerlei Hinsicht verbessert. Zum Beispiel durch Subsitution: Aus A wird B, aber aus B wird nicht C, sonder G. Dies wäre dann zufälliger, aber der geheime Schlüssel wäre keine einzelne Zahl mehr, sondern eine Tabelle. Noch deutlich komplexer wurden die Verschlüsselungen im zweiten Weltkrieg, beispielsweise mit der Enigma. Dabei war die Kenntnis der kryptografischen Verfahren des Feindes auch durchaus mit kriegsentscheidend.

Solche symmetrischen Verschlüsselungen spielen auch im Internet eine wichtige Rolle. Eine Verbindung über HTTPS, wie sie bitcoin.de benutzt (erkennbar an einem Schloss in der Adresszeile im Browser), geschieht über eine symmetrische Verschlüsselung. Um zu sehen, welche Verschlüsselung benutzt wird, klickt man auf das Schloss und dann auf das Verbindungs-Tab (in Chrome, im Firefox auf More informations), dort steht dann etwa AES_128_GCM oder AES_256_CBC (im Firefox steht ein wesentlich längerer Text, z.B. TLS_ECDHE_RSA_AES_128_CBC_SHA). AES ist der Advanced Encryption Standard und gilt auch nach den NSA Enthüllungen als sicher, wenn er richtig implementiert wird. Falls ihr bei einer gesicherten Online-Verbindung dort RC4 stehen seht, beschwert euch beim Webmaster des Servers, denn RC4 kann angeblich von der NSA geknackt werden.

Eine Frage bleibt jedoch offen: Woher weiß der Kommandant in den germanischen Sümpfen, dass die Nachricht, die er in seinen Händen hält, wirklich von seinem römischen Imperator stammt und nicht von den germanischen Feinden? Mal angenommen, die Germanen hätten den Reiter mit dem Pergament empfangen, die Verschlüsselung geknackt, anstatt „ Kivqermwgli Yifivqeglx: Dmilx iygl dyvyigo mr hmi Fivki“ geschrieben „Kivqejir Wglaegk: Kvimjx Er“ und der Zenturio hätte dies für bare Münze genommen – es wäre reichlich römisches Blut geflossen …

Wie also soll der Truppenführer den Braten riechen? Die Antwort lautet: Man muss die Nachricht signieren. Eine Signatur kann man sich wie eine Art Stempel vorstellen. Damit wären wir bei der asymetrischen Verschlüsselung.

Asymmetrische Verschlüsselung

Wie gesagt: Kryptografie ist Mathematik. Daher als Brainteaser zur asymmetrischen Verschlüsselung eine kleine Aufgabe: Gegeben ist die Zahl 5183. Finde zwei ganze Zahlen a und b (ungleich 1) so dass a*b=5183. Schwierig, oder?

Asymmetrische Verschlüsselung funktioniert so, dass man mit dem einen Schlüssel verschlüsselt und mit dem anderen entschlüsselt. Klingt paradox? Stellen Sie sich einfach eine Truhe mit zwei Schlüssellöchern vor. In Loch A passt Schlüssel a, in Loch B Schlüssel b.

(c) Tim Reckmann / pixelio.de

Mit Schlüssel a kann man die Truhe schließen, aber nicht öffnen. Mit Schlüssel b ist es andersherum. Allerdings – nun wird es kompliziert – kann der Schmied aus Schlüssel b den Schlüssel a anfertigen, aber nicht andersherum. Das bedeutet folgendes: Als Besitzer der Truhe kann man Schlüssel a überall herumliegen lassen, vom Schmied eine Kopie anfertigen lassen und diese Kopie Freunden geben oder auch verlieren. Der Schlüssel ist öffentlich für jeden sichtbar und kein Geheimnis. Alles was Sie damit machen können, ist die Truhe abschließen, aber nicht aufschließen. Auf Schlüssel b sollte man dagegen aufpassen. Denn wenn dieser verloren geht, kann die Truhe nicht mehr geöffnet werden. Er sollte geheim gehalten werden.

Was hat das ganze mit dem Brainteaser zu tun? Das erste asymmetrische Verschlüsselungsverfahren heißt RSA und basiert auf dem Problem von oben: Man kann zwei Zahlen (die Lösung des Brainteasers ist übrigens 71 und 73) relativ leicht miteinander multiplizieren, allerdings ist die Umkehrfunktion nicht so leicht. Und nein, die Division ist in diesem Fall nicht die Umkehrfunktion, denn für die Division sind zwei Zahlen erforderlich: Der Dividend und der Divisor. Das Problem lautet also nicht Was ist 5183 geteilt durch 71?, sondern: Welche beiden Zahlen ergeben 5183, wenn man sie miteinander multipliziert?.

Zur Zeit ist keine Lösung für dieses Problem bekannt (dieses Problem heißt das Faktorisierungs-Problem). Sicher, man kann den Computer einfach mal alle Zahlen von 1 bis 5183 durchprobieren lassen, jedoch ist dieses Verfahren alles andere als schnell. In der Realität verwendet man nämlich Zahlen die größer sind als 2^1024 (1024 gilt schon als veraltet und man sollte mindestens 2048 nehmen, 2^1024 hat mehr als 300 Stellen, 2^2048 mehr als 600). Die größte Zahl die bisher faktorisiert wurde hat ungefähr 200 Stellen (2^768, auf diese Challange war ein Preisgeld von 30.000$ ausgesetzt worden. Die Zahl wurde erst nach Ende der Challange faktorisiert.).

Mit RSA lässt sich ein öffentlicher Schlüssel und ein passender geheimer Schlüssel generieren. Mit diesen beiden kann man nun:

  1. Eine Nachricht verschlüsseln
  2. Eine Nachricht signieren

Um eine Nachricht mit einem asymmetrischen Verfahren zu verschlüsseln benötigt man lediglich den öffentlichen Schlüssel des Empfängers. Ist dieser bekannt (und da er öffentlich ist, ist er auch kein Geheimnis) kann man mit Hilfe von Mathematik die Nachricht verschlüsseln und nur der Empfänger (besser gesagt: jeder der den geheimen Schlüssel kennt) kann die Nachricht entschlüsseln.

Eine Signatur ist nichts anderes als ein digitaler Stempel, der die Herkunft einer Nachricht belegt. Dabei wird wie folgt vorgegangen:

Du hast einen geheimen Schlüssel und den passenden öffentlichen Schlüssel erstellt. Du selbst berechnest mit deinen Mathekenntnissen die Signatur für die Nachricht Hallo, wie geht es euch? und hängst die Signatur dem Brief an. Damit besteht der Brief aus der Nachricht, der Signatur und dem öffentlichen Schlüssel. Die Signatur passt nur zu der Nachricht, keiner anderen Nachricht. Jeder, der den Brief öffnet sieht die Nachricht, die Signatur und den öffentlichen Schlüssel. Mit ihren Mathekenntnissen können sie wiederum überprüfen, ob die Signatur wirklich zu dem Text passt. Wird die Nachricht manipuliert, passt die Signatur nicht mehr. Möchte man eine neue Signatur anfertigen, die zu der manipulierten Nachricht passt, benötigt man den geheimen Schlüssel, den man leider nicht hat und der sich nicht aus dem öffentlichen Schlüssel anfertigen lässt.

Also:

Möchte der Autor seine Nachricht M signieren, muss er mit seinem geheimen Schlüssel die Signatur s berechnen und der Nachricht anhängen, damit andere die Signatur überprüfen können. Falls der Empfänger den öffentlichen Schlüssel des Authors nicht kennt, muss der öffentliche Schlüssel der Nachricht angehängt werden.

Möchte man eine Nachricht M und eine Signatur s auf ihre Gültigkeit hin überprüfen, benötigt man lediglich den öffentlichen Schlüssel des Authors von M.

Kommen wir wieder zum Internet. Bei einer gesicherten Verbindung im Netz werden asymetrische und symmetrische Schlüssel miteinander kombiniert. Es passiert, stark vereinfacht, folgendes:

  1. Client an Server: Hallo
  2. Server an Client:
Hallo, hier ist mein öffentlicher Schlüssel. 
Berechne einen geheimen Schlüssel für AES_128_GCM, verschlüssele ihn und schicke ihn mir zu
  1. Client berechnet einen geheimen Schlüssel für das symmetrische Verfahren, verschlüsselt ihn mit Hilfe des öffentlichen Schlüssels, den er vom Server bekommen hat und schickt ihn an den Server
  2. Von nun an kennen beide – und nur beide – einen geheimen Schlüssel für das symmetrische Verfahren und kommunizieren nun verschlüsselt

Jede sichere Verbindung nutzt für den Verbindungsaufbau ein asymmetrisches Verfahren und für die eigentliche Kommunikation ein symmetrisches Verfahren.

Bitcoin.de nutzt ECDHE-RSA-AES128-GCM-SHA256:

  1. ECDHE für den Schlüsselaustausch (ECDHE ist eine spezielle Form von ECDH, was wiederum der Diffie-Hellmann Schlüsselaustausch auf elliptischen Kurven ist. Die Schlüssel werden nach einmaliger Verwendung verworfen.)
  2. RSA für Signaturen
  3. AES128 im Galois Counter Mode für symmetrische Verschlüsselung
  4. SHA256 für Hashes

Hier wird genauso wie oben ein geheimer Schlüssel für ein symmetrisches Verfahren ausgetauscht, nur noch sicherer.

Bitcoin

Ok. Und was hat das ganze mit Bitcoins zu tun? Signaturen sind ein wesentlicher Bestandteil von Bitcoin. Mit ihr werden Transaktionen signiert.

Wenn man eine neue Bitcoin-Adresse erzeugt, erzeugt man im Hintergrund nichts anderes als einen geheimen Schlüssel und einen öffentlichen Schlüssel. Aus dem öffentlichen Schlüssel lässt sich kurzerhand die Bitcoin-Adresse berechnen (Achtung! Eine Bitcoin-Adresse selbst ist kein öffentlicher Schlüssel). Mit dem geheimen Schlüssel lässt sich eine Transaktion signieren. Man signiert salopp gesagt die Nachricht, Ich, mit der Adresse XYZ, überweise 5 BTC an die Adresse ABC. Man hängt die Signatur an die Nachricht ebenso wie den öffentlichen Schlüssel und schon kann jeder folgendes Überprüfen:

  1. Ob die Adresse XYZ überhaupt die nötigen Bitcoins hat
  2. Ob die Signatur zu der Nachricht passt
  3. Ob der öffentliche Schlüssel zu der Adresse XYZ passt

Gehen wir an den Anfang von Bitcoin zurück, ins Jahr 2009 als genau ein Block in der Blockchain existierte. Dieser eine Block legte fest, wer wieviele Bitcoins besitzt. In diesem Block steht, dass die Adresse 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa (Im folgenden Adresse A) genau 50 BTC besitzt. Hätte man zu diesem Zeitpunkt im Wallet eine andere Adresse generiert (1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1, Adresse B), hätte man genau 0 BTC, weil in der Blockchain diese Adresse nirgendwo auftaucht.

Möchte jetzt der Besitzer der Adresse A 10 BTCs an Adresse B überweisen, fertigt er folgende Nachricht an:

    Ich, Adresse 1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1, überweise 1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1 
    genau 10 BTC

Er signiert diese Nachricht mit seinem geheimen Schlüssel, hängt die Signatur und den öffentlichen Schlüssel an die Nachricht an und verteilt diese Transaktion (Die Kombination von Nachricht, öffentlicher Schlüssel und Signatur heißt Transaktion) an die Miner.

Der Miner überprüft nun die oben genannten Punkte, und falls alles seine Richtigkeit hat, nimmt er die Transaktion in den nächsten Block auf. Sobald der nächste Block gemined wurde, wird die Transaktion in der Blockchain verewigt. Damit ist nun für jeden nachvollziehbar, dass Adresse A 10 BTC weniger hat und Adresse B 10 BTC mehr.

Die Blockchain ist also nichts anderes als eine Sammlung von signierten Transaktionen (mal vom Mining-Aspekt abgesehen). Bricht man das System der Signaturen, ist das ganze System kompromittiert.

Um es nochmal deutlich zu wiederholen: Das Bitcoin-System hängt von der Sicherheit der Signaturen ab.

Abgesehen davon gibt es noch andere Angriffe auf das Bitcoin-System, aber ein Angriff auf die Signaturen wäre fatal.

Was ich mit fatal meine: Hat jemand ein Guthaben auf einer Adresse D, sagen wir 1000 BTC, geht man wie folgt vor:

  1. Man holt sich den öffentlichen Schlüssel von D (dieser Teil ist nicht machbar, falls D niemals Bitcoins an andere gesendet hat, denn aus einer Bitcoin-Adresse lässt sich nicht der öffentliche Schlüssel berechnen). Der öffentliche Schlüssel ist kein Geheimnis und kann in der Blockchain mit Leichtigkeit gefunden werden.
  2. Man generiert aus dem öffentlichen Schlüssel von D den passenden geheimen Schlüssel (dieser Teil ist bisher nicht möglich)
  3. Man kann nun beliebige Transaktionen mit D als Absender erzeugen, da man die Nachrichten mit Hilfe des geheimen Schlüssels signieren kann.

Bitcoin wäre ein quasi geschlossenes System, wo jeder den passenden Schlüssel kennt um es zu öffnen (die Signaturen wären ja immernoch vorhanden, nur kann sie jeder fälschen).

Elliptische Kurven

Was? Elliptische Kurven? Auch das noch. In diesem Abschnitt komme ich nicht umhin, ein wenig mathematischer zu werden, um das Problem besser und korrekter beschreiben zu können.

Bitcoin verwendet kein RSA, es verwendet elliptische Kurven. Eine elliptische Kurve ist eine Sammlung von Punkten, die einer bestimmten Gleichung genügen (meist in Form von y^2 = x^3 + a*x + b). Es gibt einige fest definierte Kurven, im Falle von Bitcoin heißt die Kurve, auf die man sich geeinigt hat, secp256k1. Die Parameter a und b sind fest, darüber hinaus gibt es einen Punkt G und eine Primzahl p, auf die man sich geeinigt hat (die Primzahl liegt in der Größenordnung von 2^256).

Außerdem sind einige bekannte Mathe-Operationen definiert: Zum Beispiel die Addition von zwei Punkten und die Multiplikation eines Punkte mit einer Zahl.

Um nun einen öffentlichen und einen geheimen Schlüssel zu erzeugen geht man wie folgt vor:

  1. Man generiert eine zufällige Zahl s, dies ist der geheime Schlüssel
  2. Man multipliziert s mit G (dem Punkt auf der Kurve, der allen bekannt ist) und erhält p
  3. Das Ergebnis der Multiplikation ist wieder ein Punkt auf der Kurve, dies ist der öffentliche Schlüssel

RSA nutzt das Problem, dass man zwar eine Multiplikation schnell durchführen kann, aber die Umkehrung dessen sehr zeitintensiv ist. Ähnlich ist es bei elliptischen Kurven: Man kann leicht eine Zahl mit einem Punkt multiplizieren, aber die Umkehrung ist bisher nicht (bzw. kaum) möglich.

Bevor ihr das in der Schule versucht: Nur auf elliptischen Kurven kann man eine Zahl mit einem Punkt multiplizieren oder zwei Punkte miteinander addieren. Auf der Kurve y=x^2 geht das nicht.

Als mathematische Gleichung:

s*G = p

Man könnte annehmen, dass man einfach durch G teilen könnte, allerdings ist diese Operation nicht definiert: Man kann den Punkt p nicht durch den Punkt G teilen. Das ist nicht möglich.

Da elliptische Kurven endliche Körper sind, lassen sich bekannte Verfahren wie der Digital Signature Algorithm (DSA) und der Diffie-Hellmann (DH) Schlüsselaustausch auf elliptische Kurven anwenden und man kann damit:

  1. Signaturen erzeugen (ECDSA, dies wird in Bitcoin verwendet)
  2. einen geheimen Schlüssel über ein unsicheres Medium austauschen (ECDH, wird nicht in Bitcoin verwendet)

Möchte man dieses System brechen, muss man eine effiziente Methode finden s zu bestimmen wenn man nur G und p kennt. Falls man dies geschafft hat, steht am nächsten Tag die Welt auf dem Kopf, denn kein Verschlüsselungsverfahren wäre mehr sicher. Jede Internet-Verbindung mit einer Bank wäre abhörbar, jedes militärische System wäre abhörbar und jede Art von Signatur wäre wertlos.

Bisher wurde das ECDLP auf einer relativ kleinen Kurve gelöst: Einer Kurve mit einer Primzahl in der Größenordnung von 2^112. Dazu hat man 200 Playstation 3 knapp 3 Monate lang in einem Cluster laufen lassen.

Um nochmal die Größen von denen wir hier sprechen zu verdeutlichen, mal ein kleines Beispiel:

Jedes Mal wenn man eine Bitcoin-Adresse generiert ist nirgendwo sichergestellt, dass diese Adresse bisher nicht verwendet wurde. D.h. es kann durch einen Zufall genau die Adresse sein, die die 92000 Bitcoins von Sheep Marketplace gestohlen hat. Allerdings sollte man im Anschluss gleich die BTCs auf ein eigenes Konto überweisen und am nächsten Tag sein ganzes Geld in Lotto-Scheine investieren, denn es ist um einige Größenordnungen wahrscheinlicher, dass man mehrmals hintereinander im Lotto gewinnt, als dass man zwei gleiche Bitcoin-Adressen hat.

Hier die Zahlen:

Die Kurve secp256k1 bietet ein Sicherheitsniveau von 128 Bits, d.h. es gibt ungefähr 2^128 mögliche Schlüsselpaare (die Zahl hat nichts mit der Primzahlen oben zu tun). Das ist eine Zahl mit 40 Stellen (secp256k1 bietet das selbe Sicherheitsniveau wie RSA mit einer Schlüssellänge von 3072 Bits). Die Wahrscheinlichkeit, dass man direkt die Adresse mit den 92000 BTCs generiert, liegt bei 1/2^128. Die Wahrscheinlichkeit im Lotto zu gewinnen liegt bei 1/139838160, d.h. es ist wahrscheinlicher vier mal hintereinander im Lotto zu gewinnen, als die richtige Adresse zu generieren.

Was ist wenn man den PC Tag und Nacht laufen lässt und er nichts anderes macht als Bitcoin-Adressen zu generieren? Theoretisch erwische ich irgendwann eine Adresse mit einem Guthaben darauf. Praktisch ist es aber sinnvoller, ihn Bitcoins minen zu lassen.

Angenommen man könnte eine Milliarde Adressen pro Sekunde generieren (und das ist viel), man bräuchte immer noch 10^22 Jahre (das Universaum ist gerade mal 15*10^15 Jahre alt) um alle möglichen Adressen zu generieren. Die Betonung liegt auf alle, aber man möchte nur eine einzige. Dieses Problem ist ähnlich dem Geburtstagsproblem, das man vielleicht noch aus der Schule kennt: Wie hoch ist die Wahrscheinlichkeit, das von x generierten Schlüsseln keines dabei ist, dass bereits benutzt wird? Auf unserem Planeten leben ungefähr 7 Milliarden Menschen, angenommen jeder davon hätte genau eine Milliarde Bitcoin-Adressen, dann läge die Wahrscheinlichkeit dafür, dass man eine Adresse generiert die noch nicht verwendet wird bei:

1 - (7*10^18) / (2^128)

Wolfram Online sagt folgendes:

Wenn man 1,000,000,000 Bitcoin-Adressen pro Sekunde generieren kann, und dies 20 Jahre lang laufen lässt, beträgt die Wahrscheinlichkeit, dass man in dieser Zeit mindestens eine Adresse generiert, die bereits von den 7,000,000,000 Menschen mit ihren jeweils 1,000,000,000 Adressen benutzt wird, bei ungefähr 2.3%.

Nach 1000 Jahren ist man immerhin bei 48%.

Viel Spaß. Die Zahlen sind extrem hoch gewählt (1,000,000,000 Schlüssel pro Sekunde ist enorm viel, mal ganz abgesehen von den anderen Zahlen) und die Realität wird noch viel besser zugunsten der ehrlichen Bitcoin-Nutzer sein. Mal ganz davon abgesehen, dass man bei jedem Schlüssel nachschauen muss, ob Guthaben drauf ist und dieser Vorhang sehr aufwendig ist. Kurz: Dieser Angriff ist Utopie.

Angriff auf Bitcoin

Wie kann Bitcoin gebrochen werden?

  1. Man löst das ECDLP. Falls man das Problem löst sind elliptische Kurven für Kryptografie wertlos. Bitcoin wäre am Ende. Einfach forken ginge nicht, da die alten Blocks immer noch auf elliptische Kurven setzen.
  2. Quantencomputer könnten (d.h. in der Theorie können sie es bereits, nur existieren bisher keine Quantencomputer) alle bestehenden Verschlüsselungsmethoden brechen: RSA, DSA, DH, ECDH, ECDSA und die restlichen Methoden wären wertlos.
  3. Implementierungsfehler

Der dritte Punkt muss immer beachtet werden, egal wie sicher die Technik ist. Es können sich immer Fehler in einer konkreten Implementierung einnisten, d.h. Sicherheitsexperten müssen den Code von Bitcoin verifizieren können, und dank Open Source sind sie dazu auch in der Lage.

Abschluss

Die Sicherheit von Bitcoin beruht nicht auf einem geschlossenen System (Security through obscurity, “keiner kann das System knacken, weil keiner außer dem Author genau weiß wie es funktioniert”), sondern auf einem mathematischen Problem (“jeder kennt es, aber niemand weiß wie man es lösen kann”). Es ist bisher keinem Mathematiker gelungen, das ECDLP zu lösen (so heißt das Problem auf das elliptische Kurven beruhen, Elliptic curve discrete logarithm problem).

Ich hoffe ich konnte euch einen Einblick in das spannende Thema der Kryptografie geben. Ich selbst schreibe gerade an einem Projekt (ein sicherer Instant-Messanger, ähnlich Whatsapp, nur abhörsicher) das elliptische Kurven für den Schlüsselaustausch nutzt.

Disclaimer

Ich möchte die Systeme nicht 100%ig korrekt beschreiben, denn dann könntet ihr gleich die Paper und Wiki-Einträge lesen, daher verzeiht mir einfache Fehler. Und wie sonst auch übernehme ich keine Verantwortung für die Richtigkeit des Artikels.

Christoph Bergmann: Herzlichen Dank für diesen tollen Artikel. Wer ihn wie ich mit Gewinn gelesen hat, sollte nicht zögern, unserem Gastautoren Paul eine kleine Spende zukommen zu lassen. 1LekGGupBftyY4gtVYe4zjNzuX6NK3AagR

About Christoph Bergmann (1149 Articles)
Das Bitcoinblog wird von bitcoin.de gesponsort, ist inhaltlich aber unabhängig und gibt die Meinung des Redakteurs Christoph Bergmann wieder. Wenn Ihnen das Blog gefällt, freuen wir uns über Spenden an 1BvayiASVCmGmg4WUJmyRHoNevWWo5snqC. Wir akzeptiere mit dieser Adresse sowohl Bitcoin als auch Bitcoin Cash. Weitere Infos, wie Sie uns unterstützen können, finden Sie HIER. Gastbeiträge sind ebenfalls willkommen. Meinen öffentlichen PGP-Schlüssel sowie den Bitmessage-Schlüssel finden Sie HIER

24 Comments on Kryptografie des Bitcoins für Anfänger

  1. Ich hab bei meinem Linux mit Firefox
    TLS_ECDHE_RSA_WITH_RC4_128_SHA
    als Zertifikatinformation stehen. Das macht mich doch n bisschen nervös hat jemand n Vorschlag an wenn man sich da wenden kann?
    P.S. :
    Beim Beispiel Bitcoins von Adresse a) nach Adresse b) müsste es
    Ich, Adresse 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa, überweise 1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1 genau 10 BTC
    heissen.
    Momentan steht da:
    Ich, Adresse 1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1, überweise 1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1 genau 10 BTC

    • Hab bei Firefox about:config in die Adresszeile eingegeben, nach RC4 gesucht und dann die RC4 boolean Werte auf False gesetzt. Ich mein das müsste die Sache erledigen

  2. Nicht schlecht der Satz:
    “Falls ihr bei einer gesicherten Online-Verbindung dort RC4 stehen seht, beschwert euch beim Webmaster des Servers, denn RC4 kann angeblich von der NSA geknackt werden.”

    Gleich überprüfen denke ich mir und werde sofort fündig.
    Ich sehe bei mir im Firefox folgendes für bitcoin.de:
    TLS_ECDHE_RSA_WITH_RC4_128_SHA

  3. Hat dein sicherer Instant Messenger schon einen Namen bzw hast du eine Website mit mehr infos?

    • Hallo,
      Leider nein, wenn ich in meiner freien Zeit jetzt fertig werde werde ich auf reddit davon berichten ;-).

  4. Leider zu verkürzt dargestellt.
    Wenn man ein so komplexes System erklären möchte, sollte man weiter ausholen und Zusammenhänge besser erklären, sowie die Stringenz des Beitrags erhöehen.
    Liest sich wie ein Sammelsurium von Einzelaspekten, deren Bedeutung für das Ganze nicht klar wird.
    Aber immerhin hat jemand sich ‘mal die Mühe gemacht, ein paar Begriffe aufzulisten.

    • Hallo,
      Welche Aspekte würdest du noch gerne lesen?
      Welche Aspekte wurden nicht deutlich? Ich als Author finde den Artikel relativ “schlüsselig” verfasst, aber das liegt daran, dass ich weiß worauf ich hinaus möchte.

  5. Die Adressen in dem Beispiel

    “Ich, Adresse
    XXX,
    überweise
    XXX
    genau 10 BTC”

    sind identisch

  6. Zum Glück muss man niemals alle Bitcoin Adressen generieren um an die wertvollen zu kommen. PRNG Implementierungen sei dank.

    Netter Artikel

  7. finde ich super Artikel.
    lg

  8. Interessiert // 24. December 2013 at 20:28 // Reply

    Hallo Paul,

    vielen Dank für den, wie ich finde, sehr gelungenen Überblick und Einstieg in die grundsätzliche Funktionsweise von Bitcoin. Und nein, ich bin ganz und gar nicht der Meinung, dass hier ein “Sammelsurium von Einzelaspekten” präsentiert wurde!

    In einem Punkt fehlt mir aber tatsächlich etwas Info: Bei der Validierung von Blöcken und der Aufnahme in die Blockchain. Du schreibst: “Der Miner überprüft nun die oben genannten Punkte, und falls alles seine Richtigkeit hat, nimmt er die Transaktion in den nächsten Block auf.”
    In einer Transaktion sind – vereinfacht – 1. der Bitcoin-Transfer (Adresse XY sendet Z Bitcoins an Adresse YZ), 2. der öffentliche Schlüssel und die Signatur enthalten. Wie wird nun von “den Minern” geprüft, ob die Signatur zu den restlichen Informationen passt? Müsste man für eine solche Überprüfung nicht den geheimen Schlüssel kennen?

    Und wo kommen in dem Ablauf die “kryptografischen Rästel” ins Spiel, die – wie man immer wieder liest – beim Minig gelöst werden?

    Bin gern gespannt auf eine Fortsetzung Deines Artikels! 😉

    Danke und ein frohes Fest!

  9. Firefox Nutzer // 25. December 2013 at 17:29 // Reply

    Hallo Zusammen,
    was passiert nun genau, wenn man RC4 Werte unter about:config auf “false” setzt ? – Deaktiviert man dann gänzlich die Verschlüsselung oder wird diese lediglich nicht akzeptiert, womit man dann auch bitcoin.de nicht nutzen könnte ?
    Danke für die Antworten im Voraus !

    • Also man deaktiviert die Verschlüsselung nicht vollständig. Der Client wählt aus einer Liste *eine* Methode aus. Wenn du Firefox mitteilst, dass er RC4 nicht verwenden soll, wird es statt dessen eine andere Methode verwenden, vermutlich AES.

  10. Leider hört der Artikel da auf wo es anfängt interessant zu werden. Was symmetrische und asymetrische Verschlüsselung ist, sollte so ziemlich jedem seit etwa 1992 bekannt sein. Weil damals PGP sehr bekannt war (aber leider zu wenig genutzt wurde). Alleine die anfängliche Klassifizierung von PGP als (amerikanische) Kriegswaffe und das darauf begründete Exportverbot dieser Software war schon ein Hammer. Wovon aber auch andere Kryptosoftware betroffen war.
    Die Möglichkeiten der Internetspionage war ja auch damals schon großes Thema in der Öffentlichkeit. Wurde von den Massenmedien damals mangels notwendiger Kompetenz allerdings nicht so kommuniziert wie heute. Das ist also alles nichts Neues. Bitte googelt doch mal nach PGP und Echelon und nutzt dazu Wikipedia. Echelon war so bekannt, dazu gab es sogar einen gleichnamigen aber sehr unrealistischen Film aus Hollywood.

    Nun gut, es gibt ja auch die jüngeren Leser die den Aufstieg von PGP nicht so miterlebt haben. Aber etwas mehr Tiefe hätte ich mir im Artikel schon gewünscht, ohne dazu ein ganzes Mathestudium absolvieren zu müssen.

  11. Hier ist eine verwechslung von öffentlichem und privatem schlüssel oder?
    Möchte man eine neue Signatur anfertigen, die zu der manipulierten Nachricht passt, benötigt man den geheimen Schlüssel, den man leider nicht hat und der sich nicht aus dem öffentlichen Schlüssel anfertigen lässt.

    Also:

    Möchte der Autor seine Nachricht M signieren, muss er mit seinem öffentlichen Schlüssel die Signatur s berechnen und der Nachricht anhängen, damit andere die Signatur überprüfen können. Falls der Empfänger den öffentlichen Schlüssel des Authors nicht kennt, muss der öffentliche Schlüssel der Nachricht angehängt werden.

    Möchte man eine Nachricht M und eine Signatur s auf ihre Gültigkeit hin überprüfen, benötigt man lediglich den öffentlichen Schlüssel des Authors von M.

    • Danke für den Hinweis. In der Tat hast du Recht, es muss heißen:

      “Möchte der Autor seine Nachricht M signieren, muss er mit seinem geheimen Schlüssel …”

  12. Folgendes wäre richtig:
    Mit einem Quantencomputer kann das Faktorisierungsproblem in polynomialer Zeit gelöst werden, heutige Computer benötigen dafür exponentiell Viel Zeit.
    Es wird also nicht DL (Diskreter Logarithmus)-Problem gelöst. ECLP ist davon nicht betroffen.
    Die RSA verschlüsselte Verbindung bitcoin.de allerdings schon!

  13. Ich hätte eine Frage an die kompetente Leserrunde des Blogs bzw. deren Autoren:
    Warum verwendet bitcoin.de für die https-Verschlüsselung noch kein Zertifikat mit 256bit-Schlüssel? Oder liegt das doch an der jeweiligen Konfiguration des Clients mit dem Server, sprich Anwender-PC/Browser mit der bitcoin-Seite?

    Und falls die Einrichtung eines besseren/sicheren (256bit-)Zertfikats für Bircoin eine Kostenfrage wäre, frag ich mal in die Runde, ob es nicht im Interesse aller bitcoin.de-Nutzer wäre, diesbezüglich etwas auf den Weg zu bringen?

    MfG,
    rookie

  14. Grüß Gott,
    ich bin absoluter Newbie in dem Topic, daher bitte ich um Nachsicht mit meiner NAchfrage.
    Ich frage mich noch, wie in dem Server/ Client Beispiel
    1.Client an Server: Hallo
    2.Server an Client:
    Hallo, hier ist mein öffentlicher Schlüssel.
    Berechne einen geheimen Schlüssel für AES_128_GCM, verschlüssele ihn und schicke ihn mir zu
    3.Client berechnet einen geheimen Schlüssel für das symmetrische Verfahren, verschlüsselt ihn mit Hilfe des öffentlichen Schlüssels, den er vom Server bekommen hat und schickt ihn an den Server
    4.Von nun an kennen beide – und nur beide – einen geheimen Schlüssel für das symmetrische Verfahren und kommunizieren nun verschlüsselt

    der Server den geheimen Schlüssel zugesandt bekommt – das wird doch wohl auch eher nicht öffentlich erfolgen, oder? Und solange der Server den vom Client geheimen Schlüssel nicht kennt, kann er die Message ja nicht verstehen.

    Herzlichen Dank für eine Erklärung.

  15. ” Die Germanen hatten es schwerer. ?”

    die konnten überhaupt nicht lesen, lach

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s