====== 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 * D.h. für $x\neq y$ gilt $P(H(x)=H(y)) \approx \frac{1}{2^{0.5l}} \qquad \text{mit $l$ der Länge des Hashes in Bits}$ * 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 * SHA-2 (vor allem SHA-256 und SHA-512) * SHA-3 («Backup», sollte ein Problem mit SHA-2 auftauchen). 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 ===== * Ver- und Entschlüsseln brauchen den gleichen Schlüssel. * Problem: Schlüsselaustausch! * Standard heute: [[https://en.wikipedia.org/wiki/Advanced_Encryption_Standard|AES]] (128, 192 oder 256 Bits für Schlüssel) * Super schnell (bis zu 15GiB/s auf modernen Prozessoren) -> Verschlüsselung ist tranparent (Harddisk, aber auch RAM!) ===== 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 ==== * Grundprinzip: der diskrete Logarithmus kann nicht effizient berechnet werden (d.h. nicht viel besser als alles ausprobieren). $$ 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. * Aber ist selbstverständlich möglich, ein Schlüsselpaar zu erzeugen! ==== 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