Dieser Gastartikel ist ein Beitrag zum ScienceBlogs Blog-Schreibwettbewerb. Alle eingereichten Beiträge werden im Lauf des Septembers hier im Blog vorgestellt. Danach werden sie von einer Jury bewertet. Aber auch alle Leserinnen und Leser können mitmachen. Wie ihr eure Wertung abgeben könnt, erfahrt ihr hier.
Dieser Beitrag wurde von Dominic Wäsch eingereicht.
———————————————————————————————————————–
Die Nachrichten um die NSA und Edward Snowden reißen nicht ab, und oft hört man, dass Verschlüsselung das wahre Mittel zur Gegenwehr gegen die allmächtigen Geheimdienste wäre. Zeit, einmal einen Blick auf die Verfahren zu werfen und zu schauen, wie es um die Sicherheit steht.
Grundsätzlich gibt es zwei verschiedene Arten, Nachrichten zu verschlüsseln: Symmetrische und asymmetrische Verfahren. Die symmetrischen Verfahren sind schon seit über zweitausend Jahren in Gebrauch; am bekanntesten dürfte die Cäsar-Chiffre[1] sein. Das Hauptproblem bei solchen symmetrischen Verfahren ist meist die Übermittlung des Schlüssels. Dies ist nötig, da für das Ver- und Entschlüsseln derselbe Schlüssel verwendet wird (deswegen „symmetrisch“). Da der Kanal, über den die Nachricht verschickt wird, als unsicher angesehen wird (sonst bräuchte die Nachricht nicht verschlüsselt werden), ist dieser Kanal für die Weitergabe des Schlüssels ungeeignet.
Asymmetrische Verfahren sind erst seit den 1970er Jahren bekannt. Bei diesen wird für das Chiffrieren ein öffentlicher Schlüssel benutzt, für das Dechiffrieren ein geheimer Schlüssel, den nur der Empfänger kennt und niemandem verrät. Das Schöne hieran ist, dass jeder, der meinen öffentlichen Schlüssel kennt, mir eine verschlüsselte Nachricht schicken kann. Es ist aber nicht möglich, mit dem öffentlichen Schlüssel eine chiffrierte Nachricht zu entziffern. Ich muss also nur dafür sorgen, dass jeder andere Mensch meinen öffentlichen Schlüssel kennt und benutzen kann; der geheime Schlüssel darf hingegen nicht an die Öffentlichkeit gelangen.
Jetzt könnte man meinen, symmetrische Verfahren spielen heute keine Rolle mehr, denn wir haben die asymmetrischen. Einfach die Nachricht verschlüsseln und verschicken. Nun kann man aber beispielsweise mit GnuPG[2] mehreren Empfängern gleichzeitig eine verschlüsselte Nachricht schreiben. Es wäre naheliegend, die gesamte Nachricht einfach für jeden Empfänger erneut zu verschlüsseln. Doch das ist leider unpraktikabel, da dann die Datenmege mit der Anzahl der Empfänger proportional ansteigt.
Hier ist die Idee, dass man nicht die Nachricht selber, sondern nur einen zufällig erzeugten Schlüssel für ein symmetrisches Verfahren verschlüsselt (der im Vergleich mit der Nachricht im Allgemeinen kurz ist). Für verschiedene Empfänger muss dann nur noch dieser Schlüssel mit den unterschiedlichen öffentlichen Schlüsseln chiffriert werden. Als weiterer Vorteil ergibt sich, dass asymmetrische Verfahren meist mit erheblich höherem Rechenaufwand verbunden sind als die symmetrischen. Das Ganze hat allerdings den Nachteil, dass die Sicherheit an zwei Verschlüsselungen hängt: einer symmetrischen Chiffrierung der Nachricht und einer asymmetrischen Chiffrierung des Schlüssels.
Noch mal der Reihe nach: Alice möchte eine verschlüsselte Nachricht an Bob schicken.
* Vorbereitung. Beide einigen sich zunächst auf ein symmetrisches und ein asymmetrisches Verschlüsselungsverfahren. Bob erzeugt für das asymmetrische Verfahren einen geheimen und einen öffentlichen Schlüssel. Den öffentlichen Schlüssel stellt Bob der Welt zur Verfügung (z.B. auf einem Key-Server, seiner Webseite und in seiner E-Mail-Signatur).
* Verschlüsselung. Alice erzeugt dann zufällig einen Schlüssel für das symmetrische Verfahren und chiffriert damit die Nachricht. Damit Bob diese Nachricht entschlüsseln kann, braucht er sowohl die verschlüsselte Nachricht, als auch den Schlüssel. Den Schlüssel chiffriert Alice jetzt mit dem öffentlichen Schlüssel von Bob und schickt beides – den asymmetrisch verschlüsselten Schlüssel und die symmetrisch verschlüsselte Nachricht – an Bob.
* Entschlüsselung. Bob bekommt das Paket der beiden unterschiedlich verschlüsselten Nachrichten. Er dechiffriert den Schlüssel für das symmetrische Verfahren mit seinem geheimen Schlüssel und benutzt dann diesen, um die Nachricht zu entschlüsseln.
Das gesamte Verfahren – Einigung auf Verfahren, Schlüssel generieren usw. – ist mittlerweile komplett in Software verborgen. Als Anwender kann ich zwischen zwei Verfahren wählen: einerseits gibt es das bereits erwähnte GnuPG[2] und andererseits S/MIME[3]. Sie unterscheiden sich von der Art, wie die Daten verpackt werden, welche Algorithmen verwendet werden und wie die öffentlichen Schlüssel in der Welt bekannt gemacht werden und sind daher leider nicht kompatibel. Ein genauerer Vergleich ist nicht leicht, die Vor- und Nachteile sind von der konkreten Situation abhängig[4].
Wie steht es mit der Sicherheit? Hier wird die Kryptologie auf einmal zur Naturwissenschaft. Eine begründete Hypothese wird aufgestellt („Dieser Algorithmus ist sicher!“) und die Gemeinde der Kryptographen stürzt sich darauf, um diese Hypothese zu entkräften. Gelingt das nicht, gilt ein Verfahren so lange als sicher, bis es Hinweise auf seine Unsicherheit gibt.
Die Sicherheit der asymmetrischen Verfahren basieren fast alle auf der Vermutung, dass P≠NP[5] ist. Diese vier Zeichen beschreiben eine der größten offenen Fragen unserer Zeit: Sind bestimmte Probleme, die uns schwierig vorkommen, auf eine schnelle Art und Weise zu lösen (z.B. das Rucksackproblem[6] oder die Primfaktorzerlegung[7])? Die meisten Informatiker und Mathematiker gehen davon aus, dass diese Probleme tatsächlich schwierig sind. (In Wahrheit ist P≠NP nur ein Teil des Problems. Die Vermutung, auf die hier gesetzt wird, ist noch stärker, da auch zufallsgesteuerte Algorithmen erlaubt sind.) Darüber hinaus kann es noch weitere Unsicherheiten geben, wie z.B. beim Merkle-Hellman-Kryptosystem[8], bei dem es in kurzer Zeit möglich ist, mit Hilfe des öffentlichen Schlüssels einen Ersatz-Geheim-Schlüssel zu berechnen.
Die momentan viel eingesetzten Algorithmen sind RSA[9], ElGamal[10] und Elliptic Curve[11]. Sie gelten im Allgemeinen als sicher. Trotzdem können natürlich durch ungünstige Wahl von Parametern oder durch Programmierfehler Sicherheitslücken oder Hintertüren entstehen. Außerdem gibt es Gerüchte, dass die NSA im Bereich der Primfaktorzerlegung große Fortschritte gemacht hat, was die Sicherheit von RSA gefährden kann.
Bei den symmetrischen Verfahren gibt es ein bewiesenermaßen sicheres, das Vernam-Chiffre oder One-Time-Pad genannt wird: Ein echt zufälliger Strom von Einsen und Nullen wird mit der Binärdarstellung der Nachricht via XOR verknüpft (1 XOR 0=0 XOR 1=1, sonst 0). Der zufällige Strom ist dann gleichzeitig der Schlüssel und ist immer genau so lang, wie die zu verschlüsselnde Nachricht ist. Die Entschlüsselung funktioniert genau mit demselben Algorithmus wie die Verschlüsselung. Dieses Verfahren hat zwei Nachteile. Erstens ist der Schlüssel sehr lang und zweitens ist es extrem schwierig, schnell an echte Zufallszahlen zu kommen. Daher ist es naheliegend, statt echter Zufallszahlen Pseudozufallszahlen zu benutzen, die ausgehend von einem Schlüssel generiert werden. Dazu benötigt man dann einen möglichst guten Pseudozufallszahlengenerator.
Klarerweise ist die Sicherheit solcher Strom-Chiffres durch die Qualität des Zufallszahlengenerators begrenzt, wie zuletzt am Beispiel von RC4[12] zu sehen war. Der sehr kompakte Algorithmus, den viele Kryptographen auswendig gelernt haben um nach einer Zombiekalypse eine gute Chiffre zur Verfügung zu haben, kann vermutlich in Echtzeit von der NSA gebrochen werden[13]. Es gibt einige bewiesenermaßen perfekte Pseudozufallszahlengeneratoren, die aber alle von der Zeit-Performance nicht für praktische Anwendungen geeignet sind. Gute, praxisrelevante Algorithmen wurden beispielsweise im eSTREAM-Projekt[14] in den Jahren 2004 bis 2008 ausgewählt.
Davon unabhängig besteht bei den Strom-Chiffres immer die Gefahr, dass derselbe Zufallsstrom mehrfach verwendet wird. Auf dieser Basis wurde die WLAN-Verschlüsselung WEP gebrochen.
Die andere große Gruppe von symmetrischen Verschlüsselungen sind die Block-Chiffren, welche immer eine bestimmte Anzahl an Bits gleichzeitig verschlüsseln (häufig 128 oder 64). Die Schwierigkeit ist, dass die Verschlüsselung immer umkehrbar sein muss. Dies wird bei vielen modernen Verfahren (z.B. Twofish[15])] dadurch gelöst, dass ein Feistelnetzwerk[16] implementiert wird. Dabei werden in einem mehrstufigen Verfahren („Runden“) aus dem Schlüssel und dem zu chiffrierenden Inhalt pseudozufällige Zahlen generiert, die immer wieder mit dem Block via XOR verknüpft werden. Durch geschickte Zerlegung der Daten können diese Verknüpfungen zur Entschlüsselung rückwärts angewendet werden. Außerdem erhöhen viele Runden die Sicherheit und man kann den Algorithmus aus sicheren Einzelteilen zusammensetzen. Aber auch Feistelnetzwerke garantieren keine Sicherheit; als Beispiel für einen Algorithmus mit Schwächen sei hier TEA[17] genannt. DES[18] gilt zwar als unsicher, dies resultiert jedoch im Wesentlichen aus der zu kurzen Schlüssellänge von 56 Bit (wobei auch die einzelnen Schritte von DES anscheinend nicht ideal sind, wie Analysen aus den 1990ern und Anfang der 2000er zeigen[19]).
Die Sicherheit von Feistelnetzwerken kann gut eingeschätzt werden. Es existiert offenbar sogar ein Beweis von Luby und Rackoff aus dem Jahre 1988, der zeigt, dass es möglich ist, nach bereits vier Runden eine perfekt sichere Verschlüsselung zu haben. Die praktischen Anforderungen sind dabei allerdings so hoch, dass sie in der Realität nicht erfüllbar sind. Zudem ist die Sicherheit des Algorithmus von der Breite der Blöcke abhängig; je sicherer der Algorithmus sein soll, umso breiter müssen die Blöcke sein.
Vermutlich ist der momentan wichtigste Algorithmus für Verschlüsselung – AES[20] (oder auch Rijndael) – gerade aus diesem Grund kein Feistelnetzwerk. Bisher hat sich der Gewinner der AES-Wettbewerbs gegen alle Arten von Angriffen als ziemlich robust erwiesen. Auch die Gerüchte aus dem Herbst 2013, dass die NSA starke Verschlüsselung brechen kann, haben wohl nichts mit AES oder anderen starken Kryptoalgorithmen zu tun sondern eher mit der Zertifikats-Infrastruktur oder der Implementierung von kommerziellen Umsetzungen von AES. Es gibt jedoch die Kritik, dass der Sicherheitspuffer zu klein gewählt ist für ein Verfahren, welches die nächsten Jahrzehnte halten muss. Zudem ist AES eine der wenigen Chiffren (vielleicht sogar die einzige?), die durch geschlossene algebraische Formulierungen darstellbar ist[21]. Damit ist der Angriff auf den Algorithmus auf einmal von einer Seite der Mathematik möglich, die bisher wenig mit Kryptographie zu tun hat.
Ähnlich wie die Wiederverwendung von One-Time-Pads gibt es bei den Block-Chiffren Anwendungsfehler, die die Sicherheit unabhängig vom Algorithmus schmälern. Ein Block-Chiffre erlaubt es normalerweise nur Nachrichten zu verschlüsseln, die höchstens einen Block lang sind. Es gibt unterschiedliche Ideen („Betriebsarten“), wie man längere Nachrichten chiffriert. Alleine vom NIST, dem amerikanischen National Institute of Standards and Technology, werden ein Dutzend akzeptierte Betriebsarten beschrieben[21]. Sie reichen vom einfachen ECB („Ich verschlüssele jeden Block unabhängig voneinander“) bis hin zu Arten, die Sicherheit und Integrität ermöglichen, wie dem CCM („Ich verwende für jeden Block einen neuen Schlüssel und bilde zusätzlich eine kryptographisch sichere Prüfsumme mit Hilfe des Chiffres“). Die Frage nach der besten Betriebsart ist davon abhängig, wie genau die Anforderungen aussehen und kann nicht pauschal beantwortet werden.
Verschlüsselungsverfahren sind und bleiben ein spannendes Thema, bei dem der Forschungsbedarf hoch ist. Es gibt viele offene Fragen und durch die Tatsache, dass heute die kryptographische Sicherheit auf Vermutungen beruht, rückt die Kryptographie deutlich in die Nähe der Naturwissenschaften. Zudem wird das Spektrum der mathematischen Werkzeuge erweitert und lässt auf neue Analysemethoden und Ideen für Chiffren hoffen. Dagegen hält die Umsetzung und Benutzung der Algorithmen viele Tücken bereit und die jüngsten Skandale um Sicherheitslücken in populärer Software („goto fail“[23] und „heartbleed”[24]) zeigen, dass sogar Open-Source-Software nicht sicher vor Programmierfehlern oder Hintertüren ist. Wir können gespannt sein, wohin uns die Zukunft bringt.
Links:
[1] https://de.wikipedia.org/wiki/Cäsar-Chiffre
[2] https://www.gnupg.org/index.de.html
[3] https://tools.ietf.org/html/rfc5751
[4] https://www.kes.info/archiv/online/01-01-60-SMIMEvsOpenPGP.htm
[5] https://de.wikipedia.org/wiki/P-NP-Problem
[6] https://de.wikipedia.org/wiki/Rucksackproblem
[7] https://de.wikipedia.org/wiki/Primfaktorzerlegung
[8] https://cacr.uwaterloo.ca/hac/about/chap8.pdf (S. 300ff)
[9] https://de.wikipedia.org/wiki/RSA-Kryptosystem
[10] https://de.wikipedia.org/wiki/Elgamal-Verschlüsselungsverfahren
[11] https://de.wikipedia.org/wiki/Elliptic_Curve_Cryptography
[12] https://de.wikipedia.org/wiki/RC4
[13] https://twitter.com/ioerror/status/398059565947699200
[14] https://www.ecrypt.eu.org/stream/
[15] https://de.wikipedia.org/wiki/Twofish
[16] https://www.am.hs-mannheim.de/KryptoLern/feistel.php
[17] https://www.csshl.net/sites/default/files/downloadable/crypto/TEA_Cryptanalysis_-_VRAndem.pdf
[18] https://page.math.tu-berlin.de/~kant/teaching/hess/krypto-ws2006/des.htm
[19] https://crypto.junod.info/sac01.pdf
[20] https://de.wikipedia.org/wiki/Advanced_Encryption_Standard
[21] https://www.dpunkt.de/leseproben/3112/Kapitel%208.pdf (S. 136)
[22] https://csrc.nist.gov/groups/ST/toolkit/BCM/index.html
[23] https://gotofail.com
[24] https://heartbleed.com
Topp! Ich komme aus der Branche und muss sagen, dass du ein Talent hast Inhalte anschaulich zu erklären. Aber auch hier gilt: ein Bild zur Auflockerung zwischendrin wäre schön gewesen.
@Dominic
Schöner Artikel, allerdings etwas schwere Kost für Nicht-Informatiker (kennt jeder die Komplexitätsklassen P und NP? P ist mit polynomialem Aufwand (quadratisch, kubisch etc., z.B. Sortieren einer Menge von Zahlen) zu lösen, NP höchstwahrscheinlich nicht (exponentieller Aufwand oder noch höher). Ob ein Problem in die Klasse NP fällt, wird dadurch bewiesen, dass man das betreffende Problem auf ein anderes zurückführt, das als Element von NP bereits bekannt ist, wie z.B auf das genannte Rucksackproblem, also das optimale Füllen eines imaginären Rucksacks mit einer Menge von Objekten verschiedener Größe (z.B. Summe einer Teilmenge gegebener verschieden großer Zahlen unterhalb einer gegebenen Schranke), oder die Ermittlung des kürzesten Weges durch einen Graphen, das Traveling-Salesman-Problem).
Vielleicht hätte man noch erwähnen sollen, dass bei den asymmetrischen Verfahren Primzahlen eine Rolle spielen: verschlüsselt wird mit dem Produkt zweier großer Primzahlen; dieses Produkt ist nur mit sehr großem Aufwand in seine Primfaktoren zerlegbar (jedenfalls NP; im wesentlichen muss man alle möglichen Prim-Divisoren durchprobieren, das kann ein Weilchen dauern), dies macht den Schlüssel sicher; entschlüsselt wird mit einem der Primfaktoren, die nur der Schlüsselinhaber kennt (wenn man sich zwei große Primzahlen generiert, hat man natürlich ganz leicht das Produkt aus zweien dieser Zahlen berechnet und somit den öffentlichen Schlüssel generiert).
Wirklich schön geschrieben. Ich wünsche mir jetzt einen zweiten Teil, der mir sagt, was vermutlich der praktikabelste/sicherste/mögliche Weg ist, mit dem ich in den nächsten 2 Jahren meine Mail verschlüsseln sollte.
Ein sehr interessantes Thema, aber für Laien vielleicht stellenweise ein wenig zu kompliziert… Die vielen Abkürzungen dürften nicht allen bekannt sein und Sätze wie „Ein echt zufälliger Strom von Einsen und Nullen wird mit der Binärdarstellung der Nachricht via XOR verknüpft (1 XOR 0=0 XOR 1=1, sonst 0). „ sind schon ein wenig heftig, wenn man unvorbereitet auf sie trifft.. 😉
Konkrete Beispiele wären vielleicht hilfreich gewesen bzw. ein bisschen mehr Hintergrund zu den vielen verschiedenen Verfahren – oder die Konzentration auf ein einziges der Verfahren.
In der Tat sehr schön geschrieben .. komme allerdings auch aus der Branche, weiss daher mit XORs was anzufangen 😉
Was ist eine „Zombiekalypse“?
@Herbert: „Was ist eine “Zombiekalypse”?“
Wahrscheinlich weiß die NSA schon wieder mehr als wir…
@Herbert: Kofferwort aus Zombie und Apokalypse -> Der Tag an dem die Zombies die Weltherrschaft an sich reißen wollen. Hier: Wenn nur noch ein paar Leute eine Pandemie überlebt haben und die Infrastruktur langsam den Geist aufgibt.
@Alderamin
Da gibt es weit effizientere Methoden (quadratisches Sieb, Zahlkörpersieb, Elliptische Kurven Faktorisierung)
Nein. Du meinst hier die Klasse NP-schwer bzw. NP-vollständig
Ein Problem liegt in NP, wenn man eine Lösung des
Problems schnell (in polynomieller Zeit) verifizieren kann. Z.B. Faktorisieren von Zahlen. Gibt mir jemand zwei Primzahlen p und q und behauptet N=pq kann ich das sofort nach prüfen. Wenn aber N groß ist (200 Dezimalstellen) dann ist es meistens praktisch unmöglich p und q zu bestimmen.
Vielen dank für diesen lesenswerten Artikel. War für mich als Laie zwar grenzwertig aber dennoch informativ auch wenn er mir einiges abverlangt hat.
Was ist denn der Unterschied zwischen Zufallszahl & Pseudozufallszahl?
@dude:
Eine zufällige Zahl (sagen wir 0 oder 1) erzeugst du durch „echten“ Zufall, indem du z.B. eine Münze wirfst (Kopf=0 und Zahl=1).
Eine Pseudozufallszahlgenerator ist ein deterministischer Algorithmus, der eine Folge von 0en und 1en ausgibt, die zufällig aussieht, es aber nicht ist.
Ein Pseudozufallszahlengenerator ist um so besser, um so schlechter man voraussagen kann welche Zahl – 0 oder 1- als nächstes kommt, wenn man den Algorithmus, der dahinter steckt nicht kennt. Kann zum Beispiel bei One-Time-Pads ein Angreifer berechnen, welche Zahl als nächstes kommt, ist der One-Time-Pad ziemlich nutzlos. Man geht natürlich davon aus, dass der Angreifer den Algorithmus der die Pseudozufallszahl erzeugt nicht kennt.
@Volki
Sorry, ist schon fast 30 Jahre her, die Feinheiten sind mir da etwas untergegangen (ja, unverzeihlich für einen Informatiker). 😳
Also,
– Die Klasse P beschreibt Probleme, die in polynomieller Zeit berechnet werden können (ein Polynom über der Problemgröße, z.B. O(n²) für einige einfache Sortieralgorithmen, die n Zahlen sortieren, indem sie immer wieder die ganze Liste durchsuchen, um den Platz für den nächsten Eintrag zu finden, oder O(n log n) für etwas geschickte Verfahren, die z.B. einen Suchbaum aufbauen).
– Die Klasse NP beschreibt Probleme, die in polynomieller Zeit verifiziert werden können, egal wie groß der Aufwand zu ihrer Berechnung ist.
– Die Klasse NP-schwer beschreibt Probleme, die eine hypothetische nichtdeterministische Maschine (die stets richtig rät, also etwa den richtigen Primfaktor) in polynomieller Zeit lösen könnte.
– Die Klasse NP-vollständig beschreibt Probleme, die sowohl NP-schwer sind als auch in NP liegen, also von einer nichtdeterministischen Maschine in polynomieller Zeit berechnet und von einer deterministischen in polynomieller Zeit überprüft werden könnten.
– P ist Teilmenge von NP und könnte sogar = NP sein, aber letzteres ist unbewiesen (und nicht wirklich wahrscheinlich).
Ich hoffe, so war’s richtig.
Das aktuelle Hauptproblem der Kryptografie ist, daß NSA und Konsorten die Standardisierungsgremien unterwandert haben.
So waren sie in der Lage, Algorithmen und Parameter zu Standards zu erheben, die sie selber schon kancken konnten.
Außerdem muss man eigentlich nach den Snowden-Enthüllungen davon ausgehen, daß sämtliche interessante Hardware, Software und Netzinfrastruktur durch die Geheimdienste komprommitiert sind.
Der beste Verschlüsselungsalgorithmus hilft nichts, wenn das Betriebssystem jeden Tastendruck an die NSA schickt…
@Alderamin:
Sieht gut aus!
Zum Faktorisierungsproblem könnte man noch anmerken, dass es zwar in NP liegt aber sehr wahrscheinlich weder in P noch in NP-vollständig liegt.
Stark vereinfacht gesagt: Sehr wahrscheinlich (wird vermutet ist aber noch nicht bewiesen) ist Primfaktorzerlegung leichter als das Rucksackproblem, aber schwerer als z.B. sortieren.
Was aber für den Laien erstaunlich klingen mag ist, dass es polynomielle Algorithmen gibt um testen, ob eine Zahl eine Primzahl ist.
@volki
Ich hab‘ mal ein Semester Numerik gehört, von daher kann ich mich noch an das Wort „Miller-Rabin-Test“ erinnern (ohne das Verfahren noch zu kennen), und siehe da, der Aufwand ist O((log n)^4). Nein, hätte ich ohne Nachschlagen nicht gewusst.
@Alderamin: Da hast du aber nicht genau gelesen:
Der einzige polynomielle Algorithmus, den man kennt (bewiesen), ist der AKS-Test bzw. seine Verfeinerungen von Lenstra und Pomerance.
Natürlich ist der Miller-Rabin-Test und ähnliche Tests für die Praxis viel relevanter.
@Florian: Ja, manchmal ist es ein wenig schwierig zu lesen, das gebe ich zu. 😉
@Herbert: Zombikalypse=Zombie-Apokalypse … hier eine etwas flapsige Bezeichnung für eine Katastrophe, bei der viel Weltwissen leicht verloren gehen kann.
@dude: was volki sagt. Pseudozufallszahlen sind solche, die aus einem möglichst guten Algorithmus stammen.
@uli: Das mit der Standardisierung ist in meinen Augen nur teilweise ein Problem, da du nicht auf standardisierte Algorithmen angewiesen bist. Relevanter ist da das Problem, dass die NSA den Postweg für Hardware kontrolliert, vgl. den Vortrag von Appelbaum vom 30C3.
Puh. An dem Thema habe ich mich schon mehrfach versucht, aber ich finde es schwer zu verstehen. Diese Artikel erklärt das schon recht gut, wobei mir nicht alle verwendeten Begriffe geläufig sind (XOR etc.)
Das Cryptonomicon von Neil Stephenson hat mir die Materie am besten nahegebracht (Ein Roman, kein Sachbuch). Das kann ich allen interessierten wärmstens empfehlen.
Auch Klausis Krypto-Kolumne hier auf Scienceblogs ist lesenswert (wobei es da mehr um historische Verschlüsselungsverfahren geht als um Computer).
Alles in Allem ein guter Artikel. Ich glaub, es ist fast unmöglich, das in der gebotenen Kürze für doofe wie mich zu erklären 😉
Gruß
Dampier
@Dampier: Das beste und verständlichste Buch zur Kryptografie ist Codes: Die Kunst der Verschlüsselung. Geschichte – Geheimnisse – Tricks von Simon Singh. Das ist echt super! (Und nebenan gibts bei SB sogar ein Kryptografie-Blog: https://scienceblogs.de/klausis-krypto-kolumne/
@Florian, danke für den Tipp! Singhs Fermats letzter Satz hat mir schon sehr gut gefallen. Wie er die ganze Geschichte ohne eine einzige Formel erzählt, ist schon meisterhaft.
Klausi lese ich auch gern (hatte ihn oben auch empfohlen).
grz
Dampier
Ich bin nicht aus der Sicherheitsbranche, aber lege hier meine Stirn in Falten.
Ich hätte behauptet, dass bei einem guten Pseudozufallszahlengenerator der Algorithmus bekannt sein darf, um ihn einzuschätzen vielleicht sogar bekannt sein muss, dass aber der aktuelle Zustand in dem er sich befindet, bzw. die Initialisierung unbekannt ist, und dann soll es einem Beobachter unmöglich oder schwer möglich sein das nächste Ergebnis sicher vorherzusagen.
Für Laien vielleicht verständlich ausgedrückt: Ein Zufallsgenerator, der Würfelwürfe simuliert, also Zahlen von 1-6 muss im Mittel jede Zahl in 1/6tel der Fälle produzieren, aber natürlich nicht einfach 1,2,3,4,5,6 als Reihe wieder und wieder. Auch 1,3,6,5,2,4 und das wieder und wieder würde man vor Ende der zweiten Wiederholung erraten – die erste Reihe allerdings bereits nach der Hälfte der Reihe.
Im wahren Leben kommen natürlich auch zwei Einsen hintereinander vor, und gar 3 oder 4 Sechsen (immer nur bei den anderen). Auch diese Ausreißer muss der Zufallszahlengenerator im erwartbaren Ausmaß liefern.
Allerdings – hier begebe ich mich aber auf dünnes Eis – wiederholt sich jeder Pseudozufallszahlengenerator irgendwann. Wenn die Serie, nach der er sich wiederholt, aber lange genug ist, ist die Schwäche gering. So habe ich es bislang verstanden.
Echte Zufallszahlengeneratoren arbeiten mit zufälligen Störeinflüssen, etwa mit radioaktivem Zerfall, der statistisch beschreibbar ist (Halbwertszeit) aber wann genau ein Teilchen sich spaltet ist nicht vorhersehbar. Es gibt aber auch eine Maschine im Internet, da werden wirklich Würfel per Förderband einen Turm hochgeschleppt, purzeln dann eine bucklige Rampe herab, landen unten in einem Körbchen vor einem Fenster, wo ein Bild von ihnen geschossen wird, also von 4 oder 5 Würfeln nebeneinander (5, 3, 3, 5, 1) und dieses per Mustererkennung analysiert, und ca. ein solches Quintupel pro Sekunde wird so erzeugt. Ob es die Daten auch wirklich an einen seriösen Nutzer liefert weiß ich nicht, die Übertragung wäre natürlich angreifbar und man könnte Videos statt Livebilder einspielen, um Kontrolleure auszutricksen, aber man könnte sich so ein Gerät ja neben die Maschine stellen, die den Zufall als Input braucht.
Radio- und Audiosignale, Maus- und Tastaturbewegungen wurden schon als Hilfsmittel zum Verrauschen diskutiert und werden bei Linux auch (zum Teil?) benutzt, aber sind auch angreifbar/erratbar.
Noch ein Wort zu großen Primzahlen: Für den Hausgebrauch ist 2011 eine hübsch große Primzahl. Das war aber sicher nicht gemeint. Nur – wie groß ist eine große Primzahl, wie sie bei PGP eingesetzt wird? 100 Stellen? 1000 Stellen?
@Stefan Wagner:
„Nur – wie groß ist eine große Primzahl, wie sie bei PGP eingesetzt wird? 100 Stellen? 1000 Stellen?“
In der Regel ein paar Hundert Stellen. Nach der Empfehlung des BSI mindestens 2048 Bit.
Hier ist das am Beispiel des weit verbreiteten RSA Verschlüsselungssystems genauer beschrieben:
https://de.wikipedia.org/wiki/RSA-Kryptosystem
Hängt die derzeit sichere Schlüssellänge nicht auch noch vom verwendeten Verfahren ab? – Ich meine, ich hab da mal was gelesen, dass die 2048 Bit langen Schlüssel zwar bei RSA nötig sind, dass man aber bei Verfahren, die auf elliptischen Kurven beruhen, mit wesentlich kürzeren Schlüsseln auskommt, ohne die Sicherheit zu gefährden.
—
Nebenbei: Ich hab mich gerade gefragt, wieviele Dezimalstellen eine 2048 Bit lange Zahl hat? – Dazu fiel mir dann was mit ’nem Zweierlogarithmus ein, also mal kurz nachgerechnet: $latex \frac{\ln 2048}{ln 2}$. Da da kommt 11 raus, also 11 Dezimalstellen für eine 2048 bit lange Zahl?! – Das erscheint mir gerade vieeel zu kurz. Bliebe die Frage, wie man das genau ausrechnet, bzw. wo mein Fehler steckt?
@Hans
Es sind $latex 2048 \cdot \frac{\ln 2}{ln 10} \sim 617$ Dezimalstellen. Man bekommt das heraus, wenn man folgende Gleichung löst:
$latex 2^{2048}=10^x$
logarithmieren ergibt
$latex 2048 \cdot \ln 2 = x \cdot \ln (10)$
und dann bekommt man für x die Anzahl der Dezimalstellen.
@Stefan Wagner:
Vollkommen richtig. Danke für die Ergänzung zu meiner Beschreibung.
Bin da leider auch kein Experte, aber so weit ich es verstehe, ja. Aber ein guter Pseuduzufallsgenerator hat eine sehr große Periode, sodass dies paraktisch nicht relevant wird.
Wirklich? Das kenne ich gar nicht. Kannst du bitte eine Quelle/Link nennen?
Zu PGP beruht auf SHA (bzw. den neueren Varianten) und man braucht dafür keine Primzahlen.
Wenn du RSA meinst, dann sind 100 Stellen definitiv zu wenig. Aber 1000 Stellen reichen – derzeit. Sieht man sich die RSA Factoring Challenge an bekommt man glaube ich einen ganz guten Eindruck, was derzeit machbar ist und was nicht.
@Hans, Volki:
nich so kompliziert rechnen. 2^10 ≈ 10³.
2^2048 sind etwa 205 mal 2^10 (genauer: (2^10)^205 🙂 ),
also auch
205 mal 10³ (genauer: (10³) ^205)
Rechenregel:
(a^b)^c = A ^ b*c
In unserem Fall: 3*205 = 615,
daher
10^615 oder auch 616 Stellen. Ich glaube, die eine Zehnerstelle Unterschied zur exakten Berechnung ist bei derartigen Zahlen echt wurscht. Aber dafür braucht man auch keinen Rechner. Ich kenne jedenfalls niemanden, der beim log-, lg- oder ln-schrubben irjendwat mitm Kopp macht.
(So zum Vergleich übrigens: ein Würfel mit einer Kantenlänge von 70 Mrd. Lichtjahren enthält nicht einmal 10^100 Kubikmikrometer-Würfelchen. Exponenten sind bitches.)
@Bullett:
Rechne ich meistens für mich genau so, wenn kein Taschenrechner in der Nähe ist. Nur beim Kommentare schreiben sitze ich vor einem etwas größerem Taschenrechner und bin dann doch faul ;-).
Nicht doch @Bullet
2^3=8 ~ 10 also 3te-Wurzel 10 etwa 2 (+ ε ) also log(2)~0,3 (< 1/3)
und so ( mit $latex \frac{\ln{a}}{\ln{b}}=\log_b{a}$ 🙂 )
ist 2^2048 ~ [ 0,3*2048 ] = 614 .
( Und ganz frech die 2 (= 10-8) hinzuaddiert = 616 😉 )
soll natürlich nicht 2^2048~ 614 heißen sondern Dezimalstellen(2^2048) …..
komisch, wie sich die Ergebnisse gleichen … *giggl*
@Stefan Wagner/volki: Ja, Pseudozufallszahlengeneratoren müssen sich zwangsläufig wiederholen, da der Speicher in einem Computer endlich ist und somit nur endlich viele Zustände abgebildet werden können. Damit muss irgendwann der Punkt kommen, dass ein Zustand dann wiederholt wird.
Für die kryptographische Sicherheit will man haben:
a) Eine große Periode, damit man viele Zufallszahlen raus bekommt. Denn sobald sich die Zahlen wiederholen, ist die One-Time-Pad-Sicherheit futsch.
b) Eine Folge, die von echtem Zufall nicht unterscheidbar ist. Dummerweise kann man nicht sagen: „Genau so sieht eine zufällige Folge aus!“, denn dann wäre sie ja nicht mehr zufällig. Man kann nur Tests machen, die versuchen, bestimmte Fehler zu finden (z.B. Häufigkeiten von Teilfolgen auswerten, Längen von aufsteigenden Zahlenfolgen zählen und mit der erwarteten Längen vergleichen usw.) Wenn ein Generator alle Tests besteht, heißt das aber nicht, dass nicht morgen ein neuer Test entwickelt wird, der den Generator auffliegen lässt.
c) Der Anfangszustand des Generators darf sich nicht aus der Folge ableiten lassen. Denn wenn das geht, dann könnte ein Angreifer relativ leicht die Folge reproduzieren.
@DerMannMitHut
Dazu fällt mir der Super Random Generator aus dem Buch von Donald E. Knuth (The Art of Programming – Vol. 2: Seminumerical Algorithms) ein. Da hatte jemand versucht, einen fantastisch guten Zufallsgenerator zu bauen, indem er mehrere Verfahren programmierte und dann unter anderem zufällig eines davon auswählen ließ. Aber lest selbst (ab dem Absatz vor Algorithm K)…
Das hab‘ ich mir damals eingehämmert und ich werde niemals versuchen, selbst einen Zufallsgenerator zu bauen, sondern stets auf einen Generator zurückgreifen, wie er dann in der Folge bei Knuth oder in anderen Fachquellen beschrieben ist.
Die Zufallszahlen, die von Standardgeneratoren in C oder anderen Sprachen per Standard-rnd-Befehl geliefert werden, sind übrigens meistens nicht besonders gut. Da lohnt sich ein wenig Recherche.
Eindeutig…
@Alderamin: Jo. Selber ausdenken ist kritisch. Selbst Leute, die sich damit auskennen sollten, rennen da manchmal in Fallen, vgl. das klassische Beispiel von IBMs Algorithmus RANDU.
Es gibt eine ganze Menge guter Pseudozufallszahlengeneratoren. Man kann z.B. jede gute Block-Chiffre verwenden: Denke dir einfach einen Block aus und verschlüssele diesen. Das Ergebnis sind dann einerseits Zufallszahlen, andererseits kannst du die wieder mit demselben Schlüssel chiffrieren und so die nächsten Zahlen generieren, usw.
Das Ganze wird als Betriebsart OFB (Output Feedback Mode) bezeichnet. Auch die Betriebsart CTR (Counter Mode) ergibt gute Zufallszahlen – wenn die verwendete Ciffre gut ist.
@volki, #24
Auch wenn ’s schon etwas spät ist…
Ah, danke! – Das hatte ich glatt vergessen.
——————
@Bullet, #26
Äh… und wie kommst Du auf die 205?
@Hans:
„Äh… und wie kommst Du auf die 205?“
Berichtige den Tippfehler und es wird klarer:
2^2048 ungefähr = 2^(10 * 205) = 2^10 * 2^205.
Stunden später…
@Bullet, #26 ; PDP10, #36:
Was daran jetzt genau einfacher sein soll ist mir trotz nachrechnen zwar immer noch nicht klar, aber vielleicht fällt der Groschen ja noch…