Kryptographie Adrian Neumann Motivation Das Wort Kryptographie stammt von den griechischen Worten kryptos ( verborgen“) und gra” phein ( Schrift“) und bezeichnet die Kunst Nachrichten so zu verändern, dass nur bestimmte ” Menschen sie lesen können. Seit jeher will man Botschaften übermitteln, die nur vom Empfänger gelesen werden können. Früher waren die Anwendungen vorallem militärisch oder politisch. Nur die eigenen Feldherren sollten über die Strategie Bescheid wissen, nur die befreundeten Senatoren in laufende Intrigen eingeweiht sein. Heutzutage, insbesondere seit der explosionsartigen Verbreitung des Internets, werden kryptographische Methoden verwendet um Sicherheit und Authentitiztät für allerlei Transaktionen (z.B. bargeldloses Einkaufen) zu gewährleisten. Theorie Ein kryptographisches System besteht aus einer in polynomieller Zeit berechenbaren Funktion fk (w), die eine Transformation g aus einer Schar T auswählt und sie auf w anwendet. Dabei bestimmt ein Schlüssel k aus einem Schlüsselraum K, welche der Transformationen angewandt wird. Beispiel : Wir bilden eine Menge von Transformationen als Liste von einstelligen Funktionen a->a in Haskell ab. Der Schlüssel k ist dann offensichtlich die Stelle in der Liste. Wir können uns also eine Funktion f bauen, die ein k und eine Zahl nimmt und die entsprechende Transformation anwendet: transf :: [( a - > a ) ] transf = [(*) 1 , (*) 2 , (*) 3 , (*) 4] f :: Int -> Int -> Int f k n = ( transf !! k ) n Man muss die Funktion natürlich umkehrbar wählen, damit der Empfänger sie rückgängig machen kann. Dabei sollte es ohne Wissen um k schwer“ sein die Umkehrfunktion zu berechnen, ” mit k aber leicht (in polynomieller Zeit). Um schwer“ zu formalisieren, brauchen wir ersteinmal ” eine neue Art von Turingmaschine: Def : Eine randomisierte Turingmaschine ist eine TM, deren Übergangsfunktion an Hand einer Wahrscheinlichkeitsverteilung den Folgeschritt wählt. Eine Sprache gilt wie üblich als akzeptiert, wenn die TM alle Wörter akzeptiert, die in der Sprache sind. Man erlaubt aber Fehler. Sei 0 ≤ < 12 w ∈ L ⇔ P r[M akz. w] ≥ 1 − Jetzt können wir sagen: $ CC BY: \ 1 C Proseminar Theoretische Informatik Def : Sei M eine randomisierte Turingmaschine mit polynomieller Laufzeit. Schwer“ zu berech” nen heißt: ∀k∃n : P rM,w [M (g(w)) ∈ g −1 (w)] ≤ n−k mit n = |w| Für ausreichend lange Wörter wird die Wahrscheinlichkeit, dass M die Umkehrfunktion berechnet beliebig klein. Das heißt anschaulich, es gibt keine bessere Möglichkeit, als alle Schlüssel durchzuprobieren (O(cn )), um die Umkehrfunktion zu berechnen. Eine solche Funktion fk (w), die diese Eigenschaften hat, wird trapdoor function genannt. Um zu zeigen, dass ein Kryptosystem sicher ist, müsste man beweisen, dass es keine Abkürzung gibt, um den Schlüssel zu finden. Da aber die Schlüsselsuche in NP ist (man kann ja die Umkehrfunktion in polynomieller Zeit berechnen, wenn man k geraten hat), wäre ein Beweis dafür, dass man den richtigen Schlüssel nicht in polynomieller Zeit finden kann, eine Antwort auf die Frage ob P = N P . Man weiß also nicht, ob es passende Funktionen gibt. Es bleibt einem also nichts weiter übrig, als zu zeigen, dass die Schlüsselsuche mindestens so schwierig ist, wie ein Problem von dem man keine effiziente Lösung kennt (NP-schwere Probleme zum Beispiel). Da man aber in der Komplexitätstheorie üblicherweise den schlimmsten Fall annimmt, ist das kein ausreichendes Maß für die Sicherheit, die verschlüsselte Nachricht soll ja im mittleren Fall auch nicht einfach zu entschlüsseln sein. Symmetrische Verschlüsselung Bei symmetrischen Verschlüsselungsverfahren sind die Schlüssel zum Ver- und Entschlüsseln identisch. Im Allgemeinen gilt, je länger der Schlüssel, desto sicherer die Verschlüsselung. Im Idealfall ist der Schlüssel genauso lang wie die Nachricht. Es gibt natürlich das Problem, den Schlüssel sicher zu übermitteln. RC4 Ein sehr einfaches und relativ sicheres symmetrisches Verfahren zur Verschlüsselung ist RC4. Obwohl einige Schwächen bekannt sind, verwendet man es auf Grund der einfachen Implementierung bei populären Protokollen wie WEP oder WPA. Es benutzt einen Pseudozufallszahlengenerator (PRNG), der mit dem Schlüssel initialisiert wird und dann eine Bytefolge liefert, die mit dem Klartext modulo 256 addiert wird. Der Zustand des PRNG wird durch ein Array S mit den Zahlen [0..255] festgelegt. In der Initialisierungsphase werden die Zahlen im Array wie folgt permutiert: for i in 0..255 j = (j+S[i]+key[i % keylength]) % 256 swap(S[i],S[j]) Jetzt benutzt man das Array um Pseudozufallszahlen zu generieren, je eine pro Nachrichtenbyte. i = 0 j = 0 for (n = 0; n < msg_size; n++) i = ++i % 256 j = (j+S[i]) % 256 swap(S[i],S[j]) output.add(S[ (S[i]+S[j]) % 256 ]) $ CC BY: \ 2 C Proseminar Theoretische Informatik Wie man sieht, wird der Zustand des PRNGs bei jeder Erzeugung verändert. Da durch den PRNG ein Schlüsselstrom erzeugt wird, der mit den Klartext verrechnet wird, zählt RC4 zu den sog. stream cipher Algorithmen. Die andere übliche Art von symmetrischen Verschlüsselungsalgorithmen sind die block ciphers, die jeweils einen Block (z.B. 128 bit) der Nachricht verschlüsseln. Wichtige Mitglieder dieser Gruppe sind unter anderem DES und AES. Asymmetrische Verschlüsselung Symmetrische Verschlüsselungsverfahren sind heutzutage sehr sicher und schnell. Es bleibt aber das leidige Problem des Schlüsselaustauschs. Jedes Personenpaar, das miteinander sicher reden möchte, braucht einen eigenen einzigartigen Schlüssel. Die Anzahl der benötigten Schlüssel steigt also quadratisch mit der Anzahl der Personen. Gerade in Zeiten des Internets ist das natürlich völlig inakzeptabel. RSA 1976 lösten R. Rivest, A. S hamir und L. Adleman das Problem durch die Entwicklung des nach ihnen benannten RSA Algorithmus. Er benutzt statt eines geheimen Schlüssels ein paar von Schlüsseln: den öffentlichen, der aller Welt bekannt sein kann, und den privaten, den nur der Empfänger kennt. Verschlüsselt wird mit dem öffentlichen Schlüssel des Empfängers, entschlüsseln kann man die Nachricht nur mit dem privaten Schlüssel. Das Verfahren funktioniert so: 1. Schlüsselerzeugung: (e,N) ist der öffentliche Schlüssel, (d,N) ist der private. 2. Verschlüsseln C ≡ Ke mod N K ≡ Cd mod N 3. Entschlüsseln Korrektheit Wir müssen zeigen: ∀K : K ed ≡ K mod |{z} N p·q $ CC BY: \ 3 C Proseminar Theoretische Informatik Nach dem chinesischen Restesatz kann man das auseinanderziehen: ∀K : K ed ≡ K mod p ∧ K ed ≡ K mod q p und q kann man vertauschen, deswegen betrachten wir nur p. Wenn die Nachricht K=0 ist, gilt das ganze offensichtlich. Lediglich bei K 6= 0 müssen wir genauer hinsehen. e,d haben wir so gewählt, dass e · d ≡ 1 mod φ(N ) ⇒ e · d = 1 + k(p − 1)(q − 1) Desweiteren wissen wir, K ed ≡ K mod N ⇒ K ed ≡ K mod p, da p|N . Damit können wir jetzt K ed mod p = K 1+k(p−1)(q−1) mod p p−1k(q−1) mod p =K ∗K nach dem kleinen Satz von Fermat = K ∗ 1k(q−1) mod p Sicherheit Man unterscheidet zwischen zwei Problemen RSAP Mit dem öffentlichen Schlüssel und dem Geheimtext soll der Klartext bestimmt werden RSAP∗ Mit dem öffentlichen Schlüssel soll der private Schlüssel gefunden werden Es gilt folgende Reduktionskette: RSAP ≤p RSAP∗ =p FACTORING RSAP∗ ≤p FACTORING leicht, denn wenn man N in polynomieller Zeit faktorisieren kann, kann man den Schlüssel aus den gewonnenen p,q wie oben beschrieben berechnen. Auch die Umkehrung gilt, man kennt einen randomisierten Algorithmus, der das macht. Aus einem öffentlichen Schlüssel den geheimen zu gewinnen, ist also genauso schwierig, wie das Faktorisieren von Zahlen. RSAP≤r RSAP∗ ist auch trivial, wenn man den privaten Schlüssel kennt, kann man ja einfach entschlüsseln. Ob aber auch die Rückrichtung gilt, also dass das Entschlüsseln von RSA-kodierten Nachrichten so schwierig ist wie Faktorisierung, ist bis heute nicht bekannt. Es könnte also sein, dass es leichter ist, das RSA Problem zu lösen, als Zahlen zu faktorisieren. Quellen • M. Sipser: Introduction to the Theory of Computation • A. Konheim: Cryptography: A Primer • Wikipedia: RC4, RSA • MafI III Skript WiSe 05/06, Dr. Klaus Kriegel $ CC BY: \ 4 C Proseminar Theoretische Informatik