Prinzipien moderner Kryptographie
Es geht hier nicht um die mathematischen Details, sondern um de Prinzipien und grundlegenden Eigenschaften moderner kryptographischer «Bauteile».
Hash-Funktionen
Input: Irgendeine Anzahl an Bytes
Output: Konstante Anzahl an Bytes, z.B. 32 Bytes bei SHA-256
Deterministisch (gleicher Input liefert immer gleichen Output)
Kollisionssicher
Zu einem gegeben Hash-Wert $h$ ist es praktisch unmöglich $x$ zu bestimmen mit $H(x)=h$.
Zu einem gegebenen $x$ ist es praktisch unmöglich, ein $y$ zu bestimmen mit $H(x)=H(y)$.
Daraus folgt, dass der Output einer Hashfunktion von Zufall nicht zu unterscheiden ist. Oder anders ausgedrückt: Ändert man ein einziges Bit im Input, ändern sich in etwas die Hälfte aller Bits im Output.
Aktuelle Hashfunktionen
Zur Zeit empfohlene Hashfunktionen sind
Veraltete Hashfunktionen (nicht mehr brauchen!) sind:
SHA-1 (noch halbwegs sicher, erste Kollisionen wurden aber berechnet).
MD5 (komplett kaputt). Kann aber noch zur Detektion von zufälligen Übertragungsfehlern dienen (aber nicht gegen Attacken schützen).
Symmetrische Krypto
Zufallszahlen
«Echter Zufall» ist schwierig. Zufallsgeneratoren z.B. in Python sind nicht zufällig und kryptographische Zwecke ungeeignet!
Moderne Betriebsysteme «ernten Entropie» aus diversen Quellen, wie z.B. Temperatur, Netzwerkverkehr, Tastatur, Maus etc. Damit wird dann «guter» Zufall erzeugt, der für kryptographische Zwecke geeignet ist.
Diffie-Hellman Vefahren
Klassisches Verfahren
$$
b^e = x \mod n \qquad \text{Aus $b$ und $x$ kann $e$ nicht berechnet werden.}
$$
* Schlüsseltausch über unsicheren Kanal von $A$ und $B$:
$A$ wählt zufällige Basis $b$, zufällige Primzahl $n$ und geheime Zufallszahl $x$. $A$ berechnet $p = b^x \mod n$.
$A$ übermittelt (einsehbar) $b$, $n$ und $p$ and $B$.
$B$ wählt eine geheime Zufallszahl $y$ und berechnet $q=b^y \mod n$ und $s=p^y \mod n = \left(b^x\right)^y = b^{xy}$.
$B$ übermittelt $q$ and $A$.
$A$ berechnet $s=q^x \mod n = \left(b^y\right)^x \mod n = b^{xy} \mod n$.
Beide haben nun die gleiche Geheimzahl $s$, die zur Erzeugung eines Schlüssel für die geheime Kommunikation gebraucht werden kann.
Probleme:
Woher weiss $A$, dass es sich wirklich um $B$ handelt? $E$ könnte sich dazwischen hängen und den Austausch mit $A$ und $B$ machen, hat dann zwei Schlüssel und kann sich so einklinken.
Authenzität von $A$ und $B$ muss überprüft werden!
Weitere Varianten und Bemerkungen
Dieses Verfahren gibt es u.a. auch basierend auf «elliptischen Kurven».
Es ist keine gute Idee, immer die gleiche Primzahl zu verwenden. Mit einigen Monaten Vorberechnung kann das Verfahren dann geknackt werden (bei Primzahlen in der Grössenordnung von 1000 Bits).
Public/Private-Key Cryptography
Schlüsselpaar, einer ist öffentlich (public), einer ist privat (private) und streng geheim!
Was mit dem einen Schlüssel verschlüsselt wird, kann nur mit dem anderen entschlüsselt werden.
Es ist praktisch unmöglich, aus dem einen Schlüssel den anderen zu berechnen.
Aktuelle Verfahren
Elliptische Kurven sind heute das Mittel der Wahl. RSA wird zwar immer noch weitläufig verwendet, sollten aus verschiedenen Gründen aber nicht mehr verwendet werden. Beide Verfahren werden mit grossen Quantencomputern hinfällig.
Verfahren, die auch von Quantencomputern nicht ausgehebelt werden können werden aktuell getestet.
RSA
Für einen Modulus $n=pq$ mit $p,q$ prim können zwei Exponenten $e$ und $d$ bestimmt werden, so dass für alle $m<n$ gilt:
$$
\left(m^d\right)^e = m \mod n \qquad \text{und damit} \qquad \left(m^d\right)^e = m^{de} = \left(m^e\right)^d = m
$$
Ohne Kenntnis von $p$ und $q$ ist es, für sorgfältig gewählte Parameter praktisch unmöglich aus dem öffentlichen Schlüssel ($n$, $e$) den privaten
Schlüssel $d$ zu errechnen.
D.h. wenn man effizient faktorisieren kann, fällt RSA.
RSA «knacken»
Praktische Umsetzung
Challenge/Response
Bemerkung zu RSA vs. Elliptic Curves
Digitale Unterschrift
Prinzipien
Mit privatem Schlüssel verschlüsseln.
Kann nur mit öffentlichem Schlüssel entschlüsselt werden.
Kommt dabei was sinnvolles heraus, kann das nur der Besitzer des privaten Schlüssels verschlüsselt haben.
Effektive Umsetzung
Nur der Hash der Nachricht wird verschlüsselt, nicht die Nachricht selbst.
Anwendung bei https
Zentrale Stellen
Zentrale stelle unterschreibt, öffentlichen Schlüssel vom Server.
Client überprüft unterschrift auf vom Server präsentierten Zertifikat.
wenn Zertifikat OK (d.h. der unterschreibenden Stelle wird vertraut), wird dem Server vertraut
Schlüsseltausch (z.B. Diffie-Hellman oder ähnliches Verfahren).
Pre-Snowden
Kaum https, Passwörter im Klartext übers Netz.
Wenn https, dann oft Schlüssel-Tausch via privatem Server-Schlüssel. Problem: nachträgliche Entschlüsselung möglich, wenn Zugriff auf privaten Server-Schlüssel.
Zertifikate waren schweineteuer. Heute gratis dank Letsencrypt (Spenden von Bürgerrechtsorganisationen).
POW-Blockchain
Öffentliche Buchhaltung
Transaktionen sind vom Sender unterschrieben.
Block:
Konsens: Längste Kette ist massgebend.
Transaktion erst «sicher», wenn ein paar Blöcke angehängt
Transaktion wieder «löschen» nur mit enormer Rechenpower möglich (z.B. wenn man mehr als 50% der Power hat, kann man eine parallele Kette ohne die eigene Transaktion rechnen).
Aufwand/Ertrag
Alternativen
Welches «Problem» löst eine Blockchain?
Meine Meinung: Vertrauen ist das höchste Wirtschaftsgut, ein wichtiger Grund für das wirtschaftliche Wohlergehen der Schweiz. Vertrauen ist verdammt effizient.
Braucht es für $xy$ eine Blockchain?
Kurze Antwort: Nein.
Lange Antwort: Meist reicht eine digitale Unterschrift einer vertrauenswürdigen Stelle (worauf fast alle Blockchains in öffentlichen Projekten basieren).
NFT
Weitere Buildingblocks