Kryptologie Bernd Borchert Univ. Tübingen, SS 2017 Vorlesung Teil 1 - Historische Verschlüsselungsverfahren Kryptologie – vom Umgang mit Geheimnissen Drei Zielrichtungen der Kryptologie: Verschlüsseln Nachrichten geheim halten Speicherinhalte verschlüsseln Vertraulichkeit Integrität Signieren: Daten gegen Abänderung schützen Nachweisbarkeit erreichen Authentizität Authentisieren: Passwort Fingerabdruck Token Vertraulichkeit – Basis Szenario m A B Verschlüsselungs-Szenario: Ein Sender A will einen Empfänger B in der Zukunft eine Nachrichten zuschicken, die nicht von jemand anders gelesen werden kann. Zu dem Zweck dürfen sich A und B, solange sie noch am gleichen Ort sind, ein gemeinsames Geheimnis erzeugen, sagen wir auf Papier (oder USB Stick). A c(m) K B K Die Nachricht wird dann von A mithilfe des Geheimnisses K kodiert, Nach Empfang dekodiert B die Nachricht ebenfalls mithilfe des Geheimnisses K. Anwendungen z.B.: - Militär: A Befehlender, B Befehlsempfänger - Geschäft: A Chef, B Mitarbeiter Cäsar Chiffre A B C D E F G H I J K L MN O P Q R S T U V WX Y Z H I J K L MN O P Q R S T U V WX Y Z A B C D E F G HALLOWELT wird zu OHSSVDLSA A OHSSVDLSA K B K Zyklus der Buchstaben. Leicht zu knacken (nur n=25 Möglichkeiten). Besser ist eine “monoalphabetische Chiffre”, also eine Bijektion der Buchstaben: A B C D E F G H I J K L MN O P Q R S T U V WX Y Z Z I O J R L MV N S P WA T Y B Q E C Z K F H G X D U U HALLOWELT wird zu NIAABGLAK Trotzdem nicht sicher: Zählung häufigster Buchstaben, Doppelbuchstaben, etc. Cardano Chiffre Giacomo Cardano, auch Erfinder der Kardanwelle Nachricht Geheimnis (die Lochkarte) (hier in der Steganographie Version, d.h. die Nachricht erscheint harmlos) Vigenere Chiffre Alphabet: A-Z plus ein paar extra Zeichen (insgesamt 30 Zeichen) A B C D E F G H I J K L MN O P Q R S T U V WX Y Z 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 . ? ! 26 27 28 29 Schlüssel: L I S A L I S A L I S A L I S A L I S A Zu codierende Nachricht: H E U T E U M S I E B E N ! Ciphertext: S MI T P D I M G G G E MMB ! Decodierte Nachricht: H E U T E U M S I E B E N ! Der Schlüssel wird einfach immer wieder hintereinandergeschrieben, so oft wie die Nachricht lang ist. Angriff: pro Position des Schlüssels eine Häufigskeitsanalyse machen. Im Beispiel sind das 4 Stellen. An der 2. Stelle kommt im Beispiel-Cyphertext 2 mal M vor: Das vorläufige Setzen auf M=c(E) mit E als häufigstem Buchstaben stellt sich als korrekt heraus. Wenn unbekannt ist, wie lang der Schlüsselstring ist (im Beispiel Länge 4) ist die Analyse schwieriger. Kryptologie Bernd Borchert Univ. Tübingen, SS 2017 Vorlesung Doppelstunde 2 - One Time Pad - Authentisierung Homophone Chiffre Monoalphabetische Chiffre”: Bijektion der Buchstaben: A B C D E F G H I J K L MN O P Q R S T U V WX Y Z Z I O J R L M V N S P WA T Y B Q E C Z K F H G X D U U Problem: Häufigkeitsanalyse: die in der Klartext-Sprache häufigsten Buchstaben werden den häufigsten Buchstaben im Chiffretext zugeordnet, so kann man einen Chiffretext relativ schnell entschlüsseln. Die homophone Chiffre eliminiert diesen Nachteil. Das Chiffre-Alphabet enthält dabei deutlich mehr Buchstaben als das Klartextalphabet. Und dann werden den häufig vorkommenden Buchstaben der KlartextSprache mehrere Buchstaben des Chiffre-Alphabets zufällig zugeordnet, und zwar soviele, wie es ungefähr der Häufigkeit in der Klartextsprache entspricht. Jeder Chiffre-Buchstabe kommt genau einmal vor. A B C D E F G H I J K L MN O P Q R S T U V WX Y Z Z Q a Mq k D d i V I c C P Y u F s t T l e E J m U K O b r j A R h B p X w ca.8% N S x ca.15% Z W G f L y H n g z v HALLO o c RbZCu Beim Verschlüsseln wird gleichverteilter Zufall eingesetzt, um aus der Menge der möglichen Chiffretext-Buchstaben einen auszuwählen. Die Häufigkeitsanalyse wird dadurch praktisch eliminiert. Auch für die Suche nach häufigen Buchstabennachbarn kann man sich eine ähnliche, darauf aufsetzende Technik als Gegenmaßnahme überlegen. Nachteil dieser Substitutions-Verschlüsselung: der Chiffretext ist länger als der Klartext (in bits). One-Time Pad Das One-Time Pad ist praktisch die einzige Verschlüsselung, die nachweislich sicher ist, und nicht nur sicher aufgrund von Annahmen ist. Einzige Annahme (realistisch): Gleichverteilter Zufall ist vorhanden (Münze, Würfel) Erfinder: Vernam (USA, ca. 1918) Beweis der 100% Sicherheit: Mauborgne (USA, ~1920), Shannon (USA, 1948) One-Time Pad Alphabet: A-Z plus ein paar extra Zeichen (insgesamt 30 Zeichen) A B C D E F G H I J K L MN O P Q R S T U V WX Y Z 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Schlüssel: Gleichverteilter Zufallsstring (aus diesen Zeichen): K . WR L D H H P B J A F Z I Zu codierende Nachricht: A N G R I F F MO R G E N ! Codierte Nachricht: K K ? E S B I D T ! S P E S Y E Decodierte Nachricht: A N G R I F F MO R G E N ! 19 20 21 22 23 24 25 . ? ! 26 27 28 29 Binäres One-Time Pad (EXOR) One-time pad (Zufall) 1 1 0 0 1 1 0 1 0 1 1 0 1 0 Zu codierende Nachricht: 1 0 0 1 0 0 0 1 1 0 1 0 0 1 H i Codierte Nachricht: (EXOR) 0 1 0 1 1 1 0 0 1 1 0 0 1 1 Decodierte Nachricht: 1 0 0 1 0 0 0 1 1 0 1 0 0 1 H i In diesem mod 2 Spezialfall: Codierfunktion = Decodierfunktion Beweis Sicherheit One-Time Pad Beweis der perfekten Sicherheit der One-Time Pads. Behauptung: Wenn das one-time-pad K durch gleich-verteilten Zufall entstanden ist, hat ein Angreifer bei einem abgefangenen Ciphertext C keine Information darüber, wie die Originalnachricht m aussah. Beweis: Eine abgefangener Ciphertext C kann aus jeder Nachricht m entstanden sein, nämlich dann, falls als Schlüssel K = C EXOR m gewählt wurde, und auch nur in diesem Fall. Weil alle Schlüssel K die gleiche Wahrscheinlichkeit haben, haben also auch alle Nachrichten die gleiche Wahrscheinlichkeit, dass aus ihnen C entstanden sein könnte. Beispiel: Sei C = 01 der abgehörte Ciphertext. C könnte aus der Nachricht 00 entstanden sein, wenn der Schlüssel 01 wäre. C könnte aus der Nachricht 01 entstanden sein, wenn der Schlüssel 00 wäre. C könnte aus der Nachricht 10 entstanden sein, wenn der Schlüssel 11 wäre. C könnte aus der Nachricht 11 entstanden sein, wenn der Schlüssel 10 wäre. Weil jeder der 4 möglichen Schlüssel die Wahrscheinlichkeit 25% hat, hat jede der 4 entsprechenden Originalnachrichten (alle verschieden) die gleiche Wahrscheinlichkeit (25%). Also kann der Abhörer keine Aussage über die Nachricht machen, nicht einmal eine probabilistische. Er hat mit C also keinerlei Information über die Nachricht. Affine Chiffren: Rechnen auf {0,1} Auf der Menge {0,1} kann man rechnen: Die Addition ist die Addition mod 2, oder anders ausgedrückt: das EXOR 0+0=0 0+1=1 1+0=1 1+1=0 Die Multiplikation auf {0,1} ist so wie als Teilmenge von Z, oder anders ausgedrückt: das UND 0.0=0 0.1=0 1.0=0 1.1=1 So wird {0,1} zu einem sog. Körper (wie R oder C) Die Menge der n-Tupel von Körperelementen ist ein n-dimensionaler Vektorraum. Affine Chiffren: Matrizenrechnung Eine n x n Matrix aus {0,1} stellt damit eine Abbildung auf den n-Tupeln dar: (0, 1, 1) ( ) 0 1 0 0 1 1 1 0 1 = (1, 1, 0) 0.0 + 1.0 + 1.1 = 0 + 0 + 1= 1 Wenn die Matrix A invertierbar ist, ist die durch A gegeben lineare Abbildung v -> vA eine Bijektion, ebenso wie die affine Abbildung v -> vA + b, und das für jeden festen Vektor b. Damit eignet sich eine invertierbare A zum Verschlüsseln von Bitstrings v der Länge n: v wird als Tupel aufgefasst und auf den String c(v) =vA + b abgebildet. Das Paar (A,b) ist der Schlüssel. Entschlüsselt wird w = vA + b durch v = (w-b)A -1 Wenn b = Nullvektor, nennt man es eine Lineare Chiffre, und allgemein eine Affine Chiffre. Eine Bit-String der Länge kn v1...vk wird auf c(v1)...c(vk) abgebildet (erstes Beispiel einer Blockchiffre) Statt auf {0,1} mit mod 2 kann man auch auf {0,1,...,k-1} mit mod k für eine Primzahlpotenz k rechnen. Die Matrizen Rechnung geht genau so und die Def. der Affinen Chiffre ist darauf übertragbar. Als Verschlüsselungsverfahren sind Affine Chiffren relativ schwach, besonders bei known-plaintext. Authentisierung Die drei Authentisierungs-Faktoren Faktor Wissen: etwas, was der richtige Benutzer weiß: Passwort, PIN, etc. Faktor Haben: etwas, was der richtige Benutzer bei sich hat: Zutrittskarte, Handy, Bankkarte, etc. Faktor Sein: etwas, was der richtige Benutzer körperlich hat: Fingerabdruck, Gesichtserkennung, etc. Kryptologie Bernd Borchert Univ. Tübingen, SS 2017 Vorlesung Doppelstunde 3 Visuelle Kryptographie Sie sehen an den mitgebrachten Folien: + = HALLO! Man kann es aber auch so sehen: die Information wird in zwei Teile zerlegt, die beide jeweils allein keine Information haben: HALLO! = Wie funktioniert‘s? + Visuelle Kryptographie – wie funktioniert's? 1.Folie (Zufall) Original-Bild 2.Folie (kein Zufall) 1.+ 2. Folie = = Quasi wie one-time pad, nur 2-dimensional und visuell entschlüsselt mit OR, nicht EXOR Zusammenfassung Historische Verschlüsselungsverfahren A m K B K Einfache Verschlüsselungsverfahren für das einfachste Szenario „A will B eine geheime Nachricht senden“ wobei A und B vorher schon ein Geheimnis K ausgetauscht haben. Cäsar Chiffre Monoalphabetische Vertauschung Cardano Chiffre Vigenere Chiffre Homophone Chiffre One-time Pad Lineare Chiffre Affine Chiffre Visuelle Kryptographie nicht sicher nicht sicher sicher (bei Einmalverwendung) nicht sicher nicht sicher sicher (bei Einmalverwendung) nicht sicher nicht sicher sicher (bei Einmalverwendung) Angriffstypen A cK(m) K B K ciphertext-only, mit Angriffziel Nachricht: cK(m) liegt vor, und es soll m gefunden werden ciphertext-only, mit Angriffsziel Schlüssel: cK(m1), ..., cK(mj) liegen vor, und es soll Schlüssel K gefunden werden known-plaintext: m1, cK(m1), ..., mj, cK(mj) liegen vor, und es soll K gefunden werden chosen-plaintext: m1, ..., mj dürfen vom Angreifer gewählt werden, dann werden cK(m1), ..., cK(mj) berechnet, (ggfs. das einige Male iterativ) und dann soll aus m1, cK(m1), ..., mj, cK(mj) K gefunden werden Alle bisher betrachteten Verschlüsselungs-Verfahren sind nicht sicher gegen known-plaintext Angriffe, geschweige denn, sicher gegen chosen-plaintext Angriffe. Blockchiffre Eine Blockchiffre verschlüsselt Bitstrings der Länge n in Bitstrings der Länge n, und das für jeden Schlüssel K. Formal ist eine Blockchiffre ist also eine Abbildung c: {0,1}n x {0,1}k --> {0,1}n (Blockgröße n, Schlüsselänge k), so dass für jedes feste K gilt, dass die Abbildung von {0,1}n nach {0,1}n gegeben durch y --> c(y,K) bijektiv ist. Typische Blockgrößen sind n = 68, 128, 1024. Der Schlüssel hat ein Größe in der Größenordnung der Blocklänge, aber muss nicht die gleiche Länge haben. Typische Schlüssellängen sind k = 56, 128, 192, 256, 1024. Affine Chiffren waren der erste, aber noch nicht überzeugende Versuch einer Blockchiffre, denn eine Blockchiffre sollte gegen chosen-plaintext und known-plaintext Angriffe sicher sein. Gegeben ist ein langer Text und eine Blockchiffre inkl. Blocklänge und Schlüssel. Wie verschlüsselt man den Text? Es gibt verschiedene Betriebsmodi, von denen die wichtigsten 4 hier vorgestellt werden. Der naheliegenste Modus ist der ECB (Elektronic Code Book) Modus: 1. den Text hinten auf Blocklängenvielfaches padden, 2. und dann Block für Block verschlüsseln, 3. die entstandenen Ciphertexte in dieser Reihenfolge aneinanderketten Betriebsmodi ECB Modus Electronic Code Book Modus Plaintext key Ciphertext V key V key V Betriebsmodi Nachteil ECB key ECB “Pinguin Effekt”: Gleiche Blöcke werden auf den gleichen Chiffre-Blöcke abgebildet. Das kann eine Information für den Angrefier bedeuten. Bei Bildern ist das z.B. fatal, siehe das Beispiel. Betriebsmodi CBC Modus Cipher Block Chaining Modus Plaintext: IV + key Ciphertext: V + key V + key V Betriebsmodi Vorteil CBC key ECB key CBC Betriebsmodi CFB Modus Cipher Feedback Modus Plaintext: key IV Ciphertext: V key + V key + V + Betriebsmodi OFB Modus Output Feedback Modus Plaintext: key IV V key + V key + Ciphertext: Vorteil: der String, mit dem ge-EXOR-ed wird, kann schon im Voraus berechnet werden V + Betriebsmodi ECB CBC CFB OFB Zusammenfassung Betriebsmodi --> Betriebsmodus wählen: ECB, CBC, CFB, oder OFB Nachteile - ECB “Pinguin” Effekt - CBC, CFB, OFB brauchen IV – vergrößert Datengröße und den Verwaltungsaufwand Vorteile - bei CFB und OFB muss nicht auf Blockgröße gepaddet werden - bei OFB kann das ganze feedback im Voraus berechnet werden. OFB stellt somit eigentlich eine typische sog. Stromchiffre dar Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Doppelstunde 4 Rechnen modulo n Modulo Rechnen a mod n ist definiert als Rest von a bei Division durch n (a aus Z, n aus N) Rechenregeln: (a + b) mod n = (a mod n + b mod n) mod n (a - b) mod n = (a mod n - b mod n) mod n (a * b) mod n = (a mod n * b mod n) mod n Operator- und Kongruenz-Schreibweise, Teilbarkeit: a mod n = b mod n ⇔ a ≡ b (mod n) ⇔ n | (a - b) 10 0 9 8 mod 11 1 2 Beispiele: 3 (6 + 9) mod 11 = 15 mod 11 = 4 7 4 6 – 9 ≡ -3 ≡ 8 (mod 11) 6 5 6 * 9 ≡ 54 ≡ 10 (mod 11), 11 | (54 - 10) (60 + 9) mod 11 = (60 mod 11 + 9 mod 11) mod 11 = (5 + 9) mod 11 = 14 mod 11 = 3 Zn sei die Menge der Zahlen 0, 1, ..., n - 1. Die Operationen +, - und * auf Z n sind eindeutig definiert durch die Operation in Z und anschließender Modulo-Rechnung; effizient berechenbar. Was ist mit Dividieren und Potenzieren? Modulo Division “a geteilt durch b mod n” bedeutet die Multiplikation von a mit dem multiplikativen Inversen von b mod n. Das multiplikative Inverse b-1 in Zn von b ist die Zahl c so dass b*c ≡ 1 (mod n). Wenn b-1 in Zn existiert, dann ist es eindeutig. Beispiel: Das mult. Inverse von 2 in Z5 ist 3, denn 2*3 ≡ 6 ≡ 1 (mod 5). Nicht jede Zahl a hat ein mult. Inverses in Zn , z. B. hat 2 in Z4 kein Inverses (2*0 mod 4 = 0, 2*1 mod 4 = 2, 2*2 mod 4 = 0, 2*3 mod 4 = 2). Später sehen wir: Wenn p Primzahl ist, hat jede Zahl > 0 in Z p ein mult. Inverses, d.h. Zp ist ein sogenannter Körper. Aber vorerst stellen wir nur das Verfahren zur Berechnung des mult. Inversen von b in Zn vor – das Verfahren wird uns dabei automatisch sagen, ob dieses Inverse existiert. Euklidischer Algorithmus (für ggT) Gesucht: größter gemeinsamer Teiler ggT(a,b) von zwei Zahlen a und b (hier jetzt keine modulo Rechnung, sondern Rechnung in Z) x := |a|, y := |b| while y ≠ 0: r := x mod y x := y y := r return x Am Ende gilt x = ggT(a,b). Beispiel: ggT(61,36) = ? 61 = 1 * 36 + 25 36 = 1 * 25 + 11 25 = 2 * 11 + 3 11 = 3 * 3 + 2 3=1* 2+ 1 2=2* 1+ 0 ggT(61,36) = 1 Euklid, Alexandria (Ägypten), ca. 300 v.Chr. Beweis Euklidischer Algorithmus Beweis (anschaulich, wie im Original von Euklid ca. 300 v.Chr.) ggT(a,b) = ggT(b,c) wobei c der Rest ist von a : b a b Ein Teiler t von a und b muss auch den Rest c teilen: a b a b t t t t t c b t t t Wenn c nicht durch t teilbar ist, wäre es a auch nicht t t t Das gilt auch für den größten Teiler, also ggT(a,b) = ggT(b,c) Gesamtbeweis von Euklids Algorithmus: ggT(a,b) = ggT(b,c) = ggT (c,d) = ... = ggT(an,bn) Euklidischer Algorithmus (für ggT) Gleiche Berechnung, aber hier nochmal in Tabellenform: Gesucht: ggT(61,36) ggT(61,36) = 1 a b q r 61 = 1 * 36 + 25 61 36 1 25 36 = 1 * 25 + 11 36 25 1 11 25 = 2 * 11 + 3 25 11 2 3 11 = 3 * 3 + 2 11 3 3 2 3=1* 2+ 1 3 2 1 1 2=2* 1+ 0 2 1 2 0 1 0 ggT(61,36) = 1 Erweiterter Euklidischer Algorithmus Lemma von Bézout: Seien a, b aus Z. Dann existieren s, t aus Z mit s*a + t*b = ggT(a,b). s und t können durch Erweiterung des Euklidischen Algorithmus berechnet werden: nach der Berechnung des ggT werden die Restedarstellungen von unten nach oben eingesetzt. Im Beispiel: 1 = 3 - 1*2 = 3 - 1*(11-3*3) = -11 + 4*3 = -11 + 4*(25-2*11) = 4*25 - 9*11 = 4*25 - 9*(36-25) = -9*36 + 13*25 = -9*36 + 13*(61-36) = 13*61 + (-22)*36 s a t b Erweiterter Euklidischer Algorithmus 13 * 61 + (-22) * 36 = 1 (Prüfung: 793 – 792 = 1) a b q r s t 61 36 1 25 13 -22 = -9 – 1 * 13 36 25 1 11 -9 13 = 4 – 1 * (-9) 25 11 2 3 4 -9 = -1 – 2 * 4 25 = 2 * 11 + 3 11 3 3 2 -1 4 = 1 – 3 * (-1) 11 = 3 * 3 + 2 3 2 1 1 1 -1 =0–1*1 2 1 2 0 0 1 1 0 1 0 61 = 1 * 36 + 25 36 = 1 * 25 + 11 3=1* 2+ 1 2=2* 1+ 0 ggT(61,36) = 1 s := tu t := su - q * tu Erweiterter Euklidischer Algorithmus - Beweis Korrektheit (Prüfung: 13 * 61 + (-22) * 36 = 1 793 – 792 = 1) 61 = 1 * 36 + 25 36 = 1 * 25 + 11 25 = 2 * 11 + 3 11 = 3 * 3 + 2 3=1* 2+ 1 a b q r s t 61 36 1 25 13 -22 = -9 – 1 * 13 36 25 1 11 -9 13 = 4 – 1 * (-9) 25 11 2 3 4 -9 = -1 – 2 * 4 11 3 3 2 -1 4 = 1 – 3 * (-1) 3 2 1 1 1 -1 =0–1*1 2 1 2 0 0 1 1 0 1 0 2=2* 1+ 0 ggT(61,36) = 1 s := tu t := su - q * tu Korrektheitsbeweis. Zu zeigen ist die Invariante sa + tb = ggT(a,b) für jede Zeile. Induktionsanfang: zweitunterste Zeile. Induktionsschluss: sa + tb = tua + (su - qtu )b = tu(auq + bu) + (su - q tu )au = tuauq + tubu + suau- q tu au = tubu + suau = ggT(a,b) Berechnung Multiplikatives Inverses modulo a Gegeben sind a, b. b besitzt genau dann ein multiplikatives Inverses modulo a (d.h. ein i mit b*i ≡ 1 (mod a)), wenn ggT(a,b) = 1. Das mult. Inverse kann mit dem EEA berechnet werden (falls es existiert, d.h. ggT(a,b) = 1): * Der EEA liefert s,t aus Z mit s*a + t*b = ggT(a,b) = 1. * Modulo a rechnen: s*a + t*b ≡ 1 (mod a) ⇒ t*b ≡ 1 (mod a) Das mult. Inverse von b in Za ist also t mod a. Beispiel: ggT(61, 36) = 1. EEA liefert: 13 * 61 + (-22) * 36 = 1, also ist das mult. Inverse von 36 modulo 61: -22 mod 61 = 39. Probe: (36 * 39) mod 61 = 1. Potenzieren Dividieren in Zn geht also auch. Die Berechnung ist gewöhnungsbedürftig, aber für einen Computer kein Problem, auch nicht von der Rechenzeit her. Was ist mit Potenzieren? 4383 mod n ist ein Zahl < n. Kann man das berechnen, ohne 83 mal zu multiplizieren? Beobachtung: 432 braucht 1 Multiplikation c d 4 2 2 Potenzgesetz: (a ) = ac*d 43 = (43 ) braucht 2 Multiplikationen, 438 = (434)2 braucht nur 3 Multiplikationen, ... 4364 = (432)2)2 )2)2)2 braucht nur 6 Multiplikationen mod n Daraus ergibt sich der folgende Algorithmus. Um a b mod n zu berechnen, berechne a2 k mod n, a4 mod n, a8 mod n, …, bis zum ersten a2 mod n, so dass 2k+1 größer ist als b. Stelle b als Summe von 2-er Potenzen dar, und multipliziere dann die entsprechenden Potenzen miteinander. Potenzgesetz: ac+d = ac * ad 6 4 1 0 Beispiel: 83 = 2 + 2 + 2 + 2 6 4 1 0 Also ist a83 mod n = a2 * a2 * a2 * a2 mod n Square and Multiply Die folgende Variante des vorigen Algorithmus wird “Square-and-Multiply”-Algorithmus (SaM) genannt. Sei v die Binärdarstellung einer Zahl. Dann ist a (v || 0)2 = (av)2 und a(v || 1)2 = (av)2 * a. Soll ab mod n berechnet werden, so berechne die Binärdarstellung von b und wende die obigen beiden Regeln iterativ an (von links nach rechts; die erste 1 wird ignoriert, danach 0 = erste Regel und 1 = zweite Regel; nach jedem Schritt wird mod n gerechnet). Beispiel: Exponent b = 83: ab = a83 = a(1010011)2 mod n initialize square x := a mod n 1010011 x := x2 mod n 1010011 x := (x2 * a) mod n square and multiply x := x2 mod n x := x2 mod n 1010011 1010011 1010011 x := (x2 * a) mod n 1010011 square and multiply x := (x2 * a) mod n 1010011 square and multiply Es gilt dann: x ≡ a83 ≡ a(1010011)2 (mod n) square square Wenn eine 1 kommt Chinesischer Restsatz Seien m1, ..., mn aus N paarweise teilerfremd, M = m1 * ... * mn, a1, ..., an aus Z. Dann existiert genau ein 0 ≤ x < M mit x ≡ a1 (mod m1) x ≡ a2 (mod m2) Simultane Kongruenz ... x ≡ an (mod mn) } (Sun Zi, China, ca. 300 europ. Zeitrechnung) Berechnung von x: Setze Mi := M : mi. Es ist ggT(Mi, mi) = 1 für alle i in { 1, ..., n }. EEA liefert si und ti mit si * Mi + ti * mi = 1. Setze ei := si * Mi (damit ist ei ≡ 1 (mod mi) und ei ≡ 0 (mod mj) für j ≠ i). Die gesuchte Lösung ist x := ∑i=1n (ai * ei) mod M. Chinesischer Restsatz Beweis. Für alle j in { 1, ..., n } gilt (modulo mj): x ≡ ∑i=1n (ai * ei) ≡ ∑i=1n (ai * si * Mi) ≡ aj * sj * Mj (da alle Mi für i ≠ j durch mj teilbar sind) ≡ aj * (1 - tj * mj) ≡ aj (mod mj) Eindeutigkeit folgt mit M = m1 * ... * mn. Beispiel. Gesucht: Lösung x für x ≡ 1 (mod 3), x ≡ 4 (mod 5), x ≡ 2 (mod 8). m1 = 3, m2 = 5, m3 = 8, a1 = 1, a2 = 4, a3 = 2, M = 120, M1 = 40, M2 = 24, M3 = 15. Mit EEA: s1 = 1 (1*40-13*3 = 1), s2 = -1 (-1*24+5*5 = 1), s3 = -1 (-1*15+2*8 = 1), e1 = 40, e2 = -24, e3 = -15, x = (1 * 40 + 4 * (-24) + 2 * (-15)) mod 120 = -86 mod 120 = 34. Zusammenfassung Zusammenfassung Rechnen in Zn Addition, Subtraktion, und Multiplikation sind in Zn genau wie in Z, es bleibt jeweils nur die mod Operation zu berechnen. Division in Zn ist die Multiplikation mit dem multiplikativen Inversen (falls existent). Der Algorithmus zur Berechnung des multiplikativen Inversen ist der Erweiterte Euklidische Algorithmus (ist schnell). Potenzieren ab in Zn geht mit Square-and-Multiply (ist schnell). Lösungen für simultane Kongruenzen lassen sich effizient mit dem Chinesischen Restsatz berechnen. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Doppelstunde 5 Feistel Netzwerk, DES DES (Data Encryption Standard) Blockchiffre DES: verschlüsselt einen 64 bit Block in einen 64 bit Block,und das mit einem Schlüssel der Länge 56 bit. x Plaintext x Schlüssel K K DES c(x) Ciphertext c(x) K Die Ver- und die Entschlüsselungsfunktion sind rel. schnell berechenbar. Entwickelt ca. 1976, ca. 1990 gebrochen: Schlüssel ist einfach zu kurz! “brechen” heißt: known-plaintext Angriff ist erfolgreich: Schlüssel wird aus abgehörten plaintext/ciphertext Paaren gefunden DES-1 x Vertauschung IP 32 bit + Feistel Netzwerk + + 32 bit 32 bit 32 bit ... + F Subkey 1 (48 bit) 32 bit F Subkey 2 (48 bit) F 32 bit Subkey 3 (48 bit) ... ... 32 bit 32 bit F Subkey 16 (48 bit) Vertauschung IP-1 Umkehrbarkeit DES x y 32 bit 32 bit + F Subkey i (48 bit) swap 32 bit + y 32 bit F Subkey i (48 bit) x x + F(y,Subkey i) + F(y,Subkey i) = x Fazit: Egal, wie F aussieht: DES ist umkehrbar durch Swappen und Durchlaufen der 16 Runden in umgekehrter Reihenfolge: (nächste Seite) Umkehrabbildung DES IP swap + + 32 bit 32 bit ... + F Subkey 16 (48 bit) F Subkey 15 (48 bit) ... ... 32 bit F Subkey 1 (48 bit) swap IP-1 Feistelschaltung F Subkey i (48 bit) 32 bit Extension E + S1 S2 S3 S4 S5 S6 Permutation P 32 bit S7 S8 Feistelbox S1 - Die beiden gelben bits werden binär als Zeile 0-3 interpretiert, - die 4 blauen bits oben binär als Spalte 0-15 - und der in der Tabelle stehende Wert 0-15 wird binär zu den 4 blauen bits unten S1 S1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 15 7 4 14 2 13 1 10 6 12 11 9 5 4 1 14 8 13 6 2 11 15 12 9 7 3 10 15 12 8 2 4 9 1 7 5 11 3 14 10 0 0 3 5 6 7 8 0 13 S2 bis S8 werden analog, aber möglichst unterschiedlich definiert. DES Subkey Erzeugung Die 16 48-bit Subkeys für DES werden aus dem vorgegebenen 56 bit Schlüssel durch Halbieren, Weglassen, Shiften, Permutieren und Wiederzusammensetzen erzeugt. Details (in der Vorlesung nur oberflächlich besprochen) Iteration Number of Number Left Shifts 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 Triple DES (3DES) Triple DES verschlüsselt einen 64 bit Block in einen 64 bit Block, mit einem Schlüssel der Länge 3 x 56 = 168 bit. Plaintext DES bits 0-55 Schlüssel DES-1 bits 56-111 Schlüssel DES bits 112-167 Schlüssel Ciphertext Ist sicher, d.h. nicht gebrochen (2017) Dass in der Mitte die Umkehrfunktion DES-1 genutzt wird, ist unwesentlich. Es ist nur ein Kniff, um eine 3DES Hard-/Software auch als DES nutzen zu können, denn so ist DESK = 3DESK,K,K 2-DES 2-DES ist nicht sicher, denn es kann durch einen Meet-in-the-Middle Angriff gebrochen werden (known plaintext) Annahme: Angreifer hat 2 plaintext/ciphertext Paare <p1,c1> <p2,c2> abgehört. Wir nehmen an, dass eine 2DESVerschlüsselung unter allen 2DES-Veschlüsselungen durch 2 Paare <p1,c1> <p2,c2> eindeutig bestimmt ist (deshalb 2 Paare). Gesucht sind K1, K2 mit 2DESK1,K2(p1)= c1 und 2DESK1,K2(p2)= c2 p K1 DES e(p)=d(c) K2 DB DES c <ek76(p1),ek76(p2),k76> <ek2(p1), ek2(p2), k2> <ek34(p1),ek34(p2),k34> ... <ek17(p1),ek17(p2), k17> Index - nicht auf k, sondern auf e(p) Angreifer legt eine große DB an mit den Tripeln <ek(p1),ek(p2),k> für alle möglichen Schlüssel k für die erste DES-Verschlüsselung, geordnet nach ek(p1), d.h. binäre/schnelle Suche möglich (256 Datensätze ist heutzutage machbar) Danach berechnet er für alle Schlüssel k' der 2. DESVerschlüsselung dk'(c1) und dk'(c2) und sucht in den DB nach einem Eintrag mit ek(p1) = dk'(c1) und ek(p2) = dk'(c2)? Wenn die nicht ex. geht er zum nächsten Schlüssel. Er kann sicher sein, dass er irgendwann für ein <dk'(c1),dk'(c2),k'> in der DB ein passendes Tripel <dk(p1),dk(p2),k> findet, denn e(p1)=d(c1) und e(p2)=d(c2). Die Schleife mit max. 256 Iterationen ist durchlaufbar, d.h er wird K1= k und K2 = k' finden. Zusammenfassung DES/3DES ● DES Blockchiffre (Blocklänge 64, Schlüssellänge 56) ● DES ist inzwischen gebrochen, aber nur, weil der Schlüssel mit 56 bits zu kurz war ● 3DES = 3 mal DES mit 3 verschiedenen Schlüsseln hintereinander (Blocklänge 64, Schlüssellänge 168) ● 3DES ist bislang sicher ● 2DES nicht sicher: Meet-in-the-middle Algorithmus bei known-plaintext Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Doppelstunde 6 AES AES AES ist eine Blockchiffre in drei Varianten AES128, AES196 und AES256. Wichtigste Kennzahlen: Blocklänge bei allen drei Varianten: 128 bit (= 16 Byte) Schlüssellänge: 128, 196, oder 256 bit x Plaintext x 128 bit Schlüssel K (128, 196, 256) K AES Ciphertext c(x) 128 bit c(x) K AES-1 x Grundstruktur AES Zuerst werden aus dem 128 bit Schlüssel 11 “Rundenschlüssel” R0 bis R10 mit jeweils 128 bit erzeugt (Beschreibung später). Dann werden die folgenden 11 Runden mit Exor (+) und der 128-bit Bijektion B (bzw. B last) durchlaufen: Plaintext 128 bit + = Rundenschlüssel R0 Runde 0 B + = Rundenschlüssel R1 Runde 1 B + = ... Rundenschlüssel R2 Runde 2 ... B + = RundenschlüsselR13 R9 Runde 9 Rundenschlüssel Blast + = Rundenschlüssel R10 Runde 10 Chiffretext Entschlüsselung AES Allein durch die Grundstruktur von AES128 und der Bijektivität von B und B last ist garantiert, dass die Verschlüsselung bijektiv ist, mit der folgenden Entschlüsselung. Es wird genutzt: (a + b) + b = a. Plaintext = + Rundenschlüssel R0 Runde 10 B-1 = + Rundenschlüssel R1 Runde 9 B-1 = + ... Rundenschlüssel R2 Runde 8 ... B B-1 = + = + RundenschlüsselR13 R9 Runde 1 Rundenschlüssel Blast-1 = + Rundenschlüssel R10 Runde 0 Chiffretext Bijektion B B setzt sich zusammen aus drei hintereinander ausgeführten Bijektionen auf 128 bit Strings: SubBytes ShiftRows MixColumns Die Umkehrfunktion B-1 von B ergibt sich durch umgekehrte Ausführung der drei jeweiligen Einzel-Umkehrfunktion. Bei B fehlt die letzte Teilfunktion MixColumns. last B Bijektion SubBytes Die 128 bits werden als 16 Bytes aufgefasst und dann wird auf jedes Byte ein monoalphabetische Substitution (Bijektion) S durchgeführt. Definition von S siehe nächste Seite. = S S S S S S S S = S S S S S S S S Substitution S (AES S-Box) S Die Funktion S ist eine Bijektion von Bytes auf Bytes, also 8-bit Wörter auf 8-bit Wörter. Die hexadezimale Tabelle sieht so aus: Beispiel. 00101111 = 0x2f wird durch S abgebildet auf 0x15 = 00010101. Wichtig ist vor allem, dass S bijektiv und nicht affin ist ist. Das erstere kann man daran erkennen, dass jedes Byte in der Tabelle genau einmal vorkommt. Daraus ergibt sich direkt auch schon die Umkehrfunktion S-1 als Tabelle: Wie kommt S zustande? Ist S zufällig „gewürfelt“ worden? wenn ja, dann würde der Verdacht aufkommen, dass die Architekten von AES eine Hintertür eingebaut haben. | 0 1 2 3 4 5 6 7 8 9 a b c d e f ---|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--| 00 |63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76 10 |ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0 20 |b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15 30 |04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75 40 |09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84 50 |53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf 60 |d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8 70 |51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2 80 |cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73 90 |60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db a0 |e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79 b0 |e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08 c0 |ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a d0 |70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e e0 |e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df f0 |8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16 -1| 0 1 2 3 4 5 6 7 8 9 a b c d e f S---|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--| 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 |52 |7c |54 |08 |72 |6c |90 |d0 |3a |96 |47 |fc |1f |60 |a0 |17 09 e3 7b 2e f8 70 d8 2c 91 ac f1 56 dd 51 e0 2b 6a 39 94 a1 f6 48 ab 1e 11 74 1a 3e a8 7f 3b 04 d5 82 32 66 64 50 00 8f 41 22 71 4b 33 a9 4d 7e 30 9b a6 28 86 fd 8c ca 4f e7 1d c6 88 19 ae ba 36 2f c2 d9 68 ed bc 3f 67 ad 29 d2 07 b5 2a 77 a5 ff 23 24 98 b9 d3 0f dc 35 c5 79 c7 4a f5 d6 38 87 3d b2 16 da 0a 02 ea 85 89 20 31 0d b0 26 bf 34 ee 76 d4 5e f7 c1 97 e2 6f 9a b1 2d c8 e1 40 8e 4c 5b a4 15 e4 af f2 f9 b7 db 12 e5 eb 69 a3 43 95 a2 5c 46 58 bd cf 37 62 c0 10 7a bb 14 9e 44 0b 49 cc 57 05 03 ce e8 0e fe 59 9f 3c 63 81 c4 42 6d 5d a7 b8 01 f0 1c aa 78 27 93 83 55 f3 de fa 8b 65 8d b3 13 b4 75 18 cd 80 c9 53 21 d7 e9 c3 d1 b6 9d 45 8a e6 df be 5a ec 9c 99 0c fb cb 4e 25 92 84 06 6b 73 6e 1b f4 5f ef 61 7d Basis der Permutation: Mult. Inverses in GF(28) Sei GF(28) der Körper der Z2-Polynome mit Grad < 8 modulo dem irred. Polynom r = x8 + x4 + x3 + x1 + x0 ● Elemente sind die 8-bit Strings a a a a a a a a ● a steht für das Monom xi : Wenn a = 1, dann taucht es in dem Polynomausdruck auf, sonst nicht. 7 i 6 5 4 3 2 1 0 i Beispiel: 01101001 steht für das Polynom x6 + x5 + x3 + x0 ● Addition ist EXOR Beispiel: (x6 + x5 + x3 + x0 ) + (x5 + x4 + x3 + x0) = x6 + x4 ● Multiplikation: dazu werden die 2 Polynome in die Monome ausmultipliziert, und danach durch das irreduzible r (ist fest, siehe oben) geteilt: Beispiel: (x6 + x1 ) * (x5 + x4 + x0) Zuerst die Monome: (x6 + x1 ) * (x5 + x4 + x0) = x11 + x10 + x6 + x6 + x5 + x1 = x11 + x10 + x5 + x1 Dann das Teilen durch r: x11 + x10 + x5 + x1 : x8 + x4 + x3 + x1 + x0 = x3 + x2 x11 + x7 + x6 + x4 + x3 x10 + x7 + x6 + x5 + x4 + x3 + x1 x10 + x6 + x5 + x3 + x2 x7 + x4 + x2 + x1 Das heißt also: (x6 + x1 ) * (x5 + x4 + x0) = x7 + x4 + x2 + x1 Basis der Permutation: Mult. Inverses in GF(28) 2. Beispiel: (x5 + x2 + x0 ) * (x6 + x3 + x2 + x0) Zuerst das Ausmultiplizieren in Monome: (x5 + x2 + x0 ) * (x6 + x3 + x2 + x0) = x11 + x8 + x7 + x5 + x8 + x 5 + x 4 + x2 + x6 + x 3 + x 2 + x0 = x11 + x7 + x6 + x4 + x3 + x0 Dann das Teilen durch r: x11 + x7 + x6 + x4 + x3 + x0 : x8 + x4 + x3 + x1 + x0 = x3 x11 + x7 + x6 + x4 + x3 x0 Also: (x5 + x2 + x0 ) * (x6 + x3 + x2 + x0) = x0 x0 ist das neutrale Element 1 in GF(28), denn x0 * p = p für jedes Polynom p. Das heißt: die zwei Faktoren sind die mult. Inversen voneinander: ● (x5 + x2 + x0) * (x6 + x3 + x2 + x0) = 1 ● 00100101 * 01001101 = 1 ● 0x25 * 0x4D = 1 Basis der Permutation: Mult. Inverses in GF(28) Sei GF(28) der Körper der Z2-Polynome mit Grad < 8 modulo dem irred. Polynom r = x8 + x4 + x3 + x1 + x0 Wenn die Polynome als 8-bit Vektoren (also Bytes) aufgefasst werden, ergibt sich also die folgende Tabelle der multiplikativen Inversen: Beispiel von der vorhergehenden Seite: Das mult. Inverse von 00100101 = 0x25 ist 0x4D = 01001101 Die multiplikatives-Inverse Funktion ist hochgradig nicht-linear (a EXOR b)-1 != a-1 EXOR b-1 Die Nicht-Linearität kann man sich in gewisser Weise auch so klar machen, dass nur die Polynome mit Grad 0 und 1 affin/linear sind, die höhergradigen aber nicht. Die Subsitutionsbox S ist der einzige nicht-lineare Teil in der AES-Berechnung Der affine Teil von S Nachdem das mult. Inverse x-1 von x gefunden ist, wird x-1 noch mit der durch die folgende Matrix A gegebenen, affinen Abbildung (inkl. Offset-Vektor b) umgeformt in den endgültigen Wert S(x) A b Insgesamt ist also S(x) = Ax-1 + b Dass Ax + b eine affine Bijektion ist, erkennt man daran, dass die folgende affine Abbildung die Umkehrabbildung davon ist: Für S-1 wird also zuerst diese affine Umkehrabbildung ausgeführt, und dann die Inversenbildung Beispiel affiner Teil von S Das mult. Inverse von 0x25 = 00100101 ist 0x4D = 01001101. Das wird zum Input für die affine Abbildung: A 1 0 1 1 0 0 1 0 b = 0+1 0+1 1+0 1+0 1+0 0+1 1+1 0+0 = 1 1 1 1 1 1 0 0 (Achtung: von oben nach unten entspricht von rechts nach links, siehe Def.) Die affine Abb. bildet 01001101 auf 00111111 = 0x3F ab. Also ist S(0x25) = 0x3F (stimmt mit dem Tabelleneintrag überein) Bijektion ShiftRows Shift Rows – so, wie durch die Farben angedeutet Umkehrabbildung: entsprechende Rotation, nur in die andere Richtung Bijektion MixColumns a0 a1 a2 a3 b0 b1 b2 b3 L (lin. Abb. in GF(28)) Lineare Bijektion L a0 a1 a2 a3 L : b0 b1 b2 b3 ● ● ● b0 = 2a0 + 3a1 + a2 + a3 b1 = a0 + 2a1 + 3a2 + a3 b2 = a0 + a1 + 2a2 + 3a3 b3 = 3a0 + a1 + a2 + 2a3 Operationen spaltenweise (es sind 4 Spalten) Addition + ist bit-weises EXOR Multiplikation 2a und 3a ist byte-weise in GF(28) mit dem bekannten irred. Polynom r = x8 + x4 + x3 + x1 + x0 (es ist 2 = x1 und 3 = x1 + 1) Umkehrfunktion MixColumns a0 a1 a2 a3 b0 b1 b2 b3 L : b0 = 2a0 + 3a1 + a2 + a3 b1 = a0 + 2a1 + 3a2 + a3 b2 = a0 + a1 + 2a2 + 3a3 b3 = 3a0 + a1 + a2 + 2a3 L-1 : a0 = Eb0 + Bb1 + Db2 + 9b3 a1 = 9b0 + Eb1 + Bb2 + Db3 a2 = Db0 + 9b1 + Eb2 + Bb3 a3 = Bb0 + Db1 + 9b2 + Eb3 L ist bijektiv, weil L-1(L(a0,a1,a2,a3)) = a0,a1,a2,a3 AES128 Rundenschlüssel Erzeugung 128 bit Schlüssel …. R0 R1 R2 R3 R5 R4 R10 = Orig. Key vertical Rotation S-Box (SubBytes) + 04 + 00 00 + = = Columns 1,2,3: Ci-4 EXOR Ci-1 00 Columns 0: Ci-1 → vert. Rotation → SubBytes 01 02 04 08 10 20 40 80 1B 36 → EXOR Yk EXOR Ci-4 00 00 00 00 00 00 00 00 00 00 Video: https://www.youtube.com/watch?v=mlzxpkdXP58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Y1 Y2 Y10 Diffusion und Konfusion Verschleierungsziele für Chiffren Diffusion: Der Input x soll so verschleiert werden, dass er vom Output her nicht zu rekonstruieren ist. Konfusion: Der Schlüssel K soll so verschleiert werden, dass er vom Output her nicht zu rekonstruieren ist. (Eselsbrücke: Konfusion fängt mit K wie Key an, Diffusion mit D wie Daten.) Diffusion erreicht man bei DES und AES einfach durch das EXOR mit den Subkeys. Konfusion ist damit das wichtige Ziel bei den Blockchiffren DES, AES etc. Die Konfusion wird nicht von ShiftRows erzeugt, sondern von allem von MixColumns, zusammen mit dem nicht-linearen SubColumns u Zusammenfassung AES AES196 und AES 256 unterscheiden sich neben einer leicht modifizierten Subschlüsselerzeugung nur darin, dass im Hauptalgorithmus 13 bzw. 15 statt 11 Runden durchlaufen werden. Angreifbarkeit. AES konnte bislang praktisch nicht angegriffen werden (auch nicht AES128) – alle dokumentierten Angriffe sind weit weg von einer Aushebelung. Sie reduzieren beispielsweise die Laufzeit von O(2 128) auf O(2125) – das ist nicht relevant. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 7 phi(n) Zn * Zn ist die Menge der Zahlen 0,1,...,n-1. Die Operationen +, - und * auf Zn sind eindeutig definiert und einfach zu berechnen. Zn* := {x > 0 in Zn | ggT(x,n) = 1} Beispiele: Zp*= {1,...,p-1} für p Primzahl. Z15*= {1,2,4,7,8,11,13,14} Behauptung: Zn* = {x in Zn | x hat ein multiplikatives Inverses in Zn} Beweis: Wenn ggT(x,n) = 1, dann findet Extended-Euklid das multiplikative Inverse y. Wenn ggT(x,n) > 1 ist, dann ist jedes Vielfache a*x ein Vielfaches von ggT(x,n), und zwar auch mod n, und damit ungleich 1. q.e.d. Euler phi(n) Zn* ist abgeschlossen unter *. Das mult. Inverse von a*b ist b-1*a-1. Zn* ist ein Gruppe, und zwar die sogenannte Einheitengruppe des Ringes Z n Die Anzahl der Elemente von Zn* heißt phi(n). phi(p) = p-1 für Primzahl p. Denn ggT(x,p) = 1 für alle 1 < x < p. phi(p*q) = (p-1)(q-1) für Primzahlen p,q. Beweis. Die p+q−1 Zahlen 1, p, 2p, 3p, ... (q −1)p, q, 2q, 3q, ...(p-1)q sind die einzigen Zahlen, die nicht teilerfremd zu p*q sind, also phi(n) = p*q − (p+q-1) = (p − 1)(q − 1). Euler phi(n) Allgemein gilt für teilerfemde r,s: phi(r*s) = phi(r)*phi(s) Beweis. x < r*s ist nach CRT eindeutig beschrieben durch x = ar + bs mit a <s und b<r. Genau dann hat x einen gemeinsamen Teiler mit r*s wenn a einen gemeinsamen Teiler mit s hat, oder wenn b einen gemeinsamen Teiler mit r hat, oder beides. Also hat x in phi(s)*phi(r) Fällen keinen gemeinsamen Teiler mit r*s. phi(p2) = p(p-1) Allgemein: phi(pk) = pk-1(p-1). Beweis. Ein x < pk hat genau dann einen gemeinsamen Teiler mit pk wenn x durch p teilbar ist. Also hat ein Anteil von p-1 von p Zahlen in Z pk* keinen gemeinsamen Teiler mit pk. Zusammen mit phi(r*s) = phi(r)*phi(r) für teilerfemde r,s kann man also phi(n) aus der Faktorisierung von n bestimmen. Satz von Euler, Satz von Fermat Zn* := {x > 0 in Zn | ggT(x,n) = 1} = {x > 0 in Zn | ex. Inverses mod n} Satz (Euler): Für alle a in Zn* gilt aphi(n) = 1 Beweis (ohne Gruppentheorie/Satz von Lagrange) Sei Zn* = {n1,...,nphi(n)}. Die Zahlen a*n1 , … , a*nphi(n) müssen alle verschieden sein, denn wenn a*ni = a*nj , dann ist auch a-1 * a * ni = a-1 * a *nj , also ni = nj . Weil a in Zn* ist und Zn* unter * abgeschlossen ist, sind die Zahlen a*n1 , … , a*nphi(n) also eine Permutation von n1 , … , nphi(n) Also ist a*n1 * … * a*nphi(n) = n1 * … * nphi(n). Also ist aphi(n) * n1 * … * nphi(n)= n1 * … * nphi(n) . Sei c das Inverse von n1 * … * nphi(n) . Dann ist aphi(n) = aphi(n) * n1 * … * nphi(n) * c = n1 * … * nphi(n) * c = 1. q.e.d. Korollar (Fermat): Für alle 0 < a < p gilt ap-1 = 1 mod p. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 8 Primitivwurzeln Primitivwurzeln in Zn* Satz von Fermat: ax mod n zykelt modulo phi(n): a, a2, a3, ... , aphi(n) = 1, a, a2, a3, ... Ist dieser Zyklus maximal lang, also mit Länge phi(n), oder kürzer? Oder äquivalent: werden in dem Zyklus alle p-1 Elemente von Zn* erreicht, bevor es mit (1,) a, a2, ... wieder von vorn los geht? Def. für a in Zn* : <a> = {a, a2, a3, ... , aphi(n) = 1} Die 1 könnte aber schon eher erreicht werden als im Schritt phi(n) a, a2, a3, ..., 1, a, a2, a3, ..., 1, a, a2, a3, ..., 1 Vor der ersten 1 gibt es keine Periode: Sei a,... y,x ... z,x ... ,1 die erste Periode, mit x als Wiederholung. D.h. ya = za =x. Also yaa-1 = zaa-1. Also y=z. Widerspruch zur Annahme, dass x die erste Periode ist. Wenn x=a (also x in der ersten Position), dann setze y=1, es folgt z=1, und damit ist die 1 nicht die erste 1. |<a>| ist ein Teiler | Zn*|. Das ergibt sich aus dem Satz von Euler, denn die erste Periode a, a2, a3, ..., 1 ist eine Unterperiode von a, a2, a3, ... , aphi(n) = 1 und muss also genau m mal wiederholt werden, für ein m, sonst treffen sich die 1'en nicht. Also |<a>| * m = | Zn*| Ein Element a aus Zn* mit <a> = Zn* heißt Primitivwurzel (manchmal auch Generator). Gibt es immer Primitivwurzeln? wenn ja, kann man sie effektiv finden? Satz von Gauß über die Existenz von Primitivwurzeln Gauß (1799) Zn* enthält Primitivwurzeln ↔ n = 1,2,4, pk oder 2pk für Primzahl p>2. ↔ Zn* enthält phi(phi(n)) Primitivwurzeln. Korollar. Zp* Primzahl p>2 enthält phi(p-1) Primitivwurzeln. Beweis: Schwierige Gruppentheorie. Wird weggelassen. Beispiel: Z11* enthält phi(10) = phi(2*5) = 1*4 = 4 Primitivwurzeln 0 10, 1 10 1 1 9, 4, 3, 5, 1 9 2 8,9,6,4,10,3,2,5,7,1 8 3 7,5,2,3,10,4,6,9,8,1 4 7 6,3,7,9,10,5,8,4,2,1 6 5 2,4,8,5,10,9,7,3,6,1 3, 9, 5, 4, 1 4, 5, 9, 3, 1 5, 3, 4, 9, 1 Überprüfung und Finden von Primitivwurzeln Def. Eine maximaler Teiler t von n ist ein Teiler von y, für den es keinen Teiler m von y gibt mit t|m und t<m<y. Für Primfaktorzerlegung z = p1k1... piki sind also die i Teiler t1 = p1k1-1... piki , ... ti = p1k1... piki-1 die maximalen Teiler von y. Jeder echte Teiler von n ist Teiler eines maximalen Teilers von von n. Beispiele. ● die maximalen Teiler von 10 sind 2 und 5 ● die maximalen Teiler von 50 = 2*52 sind 10 und 25. ● die maximalen Teiler von 300 = 22*31*52 sind ● 21*31*52 = 150 ● 22*30*52 = 100 ● 22*31*51 = 60 Satz. g ist Primitivwurzel von Zn* gdw. für alle maximalen Teiler t von phi(n) gilt: xt != 1 Beweis. Wenn g Primitivwurzel ist, dann ist für t < phi(n) die Periode g, g2,..., gi bei i=t noch nicht zu Ende. Wenn g nicht Primitivwurzel ist, dann ist d = |<g>| ist ein echter Teiler von | Zn*| und damit ein Teiler eines maximalen Teilers t. Weil g, g2,..., gd = 1, ist auch g, g2,..., gd = 1, g,g2,..., g2d = 1, g,g2,..., gt = 1 qed. Finden von Primitivwurzeln Probabilistischer Algorithmus zum Finden von Primitivwurzeln in Zn* (Faktorisierung von phi(n) muss bekannt sein): Rate ein x in Zn* . Prüfe für alle maximalen Teiler t von phi(n) ob xt != 1 mod p ist; Falls ja RETURN x ist Primitivwurzel; Ansonsten wiederhole die Rate-Schleife. Die Korrektheit des Tests im prob. Algorithmus: Wenn für einen echten Teiler t von phi(n) gilt x t = 1 mod p, dann hat die von x erzeugte Menge nur t < phi(n) Elemente, denn der Zyklus geht schon hier beim t-ten erzeugten Element in eine Schleife (denn 1x = x). Umgekehrt muss die Anzahl z der von x erzeugten Elemente die Zahl phi(n) teilen (Satz von Euler). Wenn aber z die maximalen Teiler von phi(n) nicht teilt, und andererseits z die Zahl phi(n) teilen muss, muss also z = phi(n) sein. Dass es tatsächlich probabilistischer Algorithmus ist, in dem Sinne, dass man ihn nur wenige Male (Größenordnung 20 bis 200) ausführen muss, um erfolgreich zu sein und damit zu terminieren, liegt daran, dass es so viele – nämlich phi(phi(n)) - Primitivwurzeln gibt, siehe 3. Äquivalenz bei Gauss. phi(p-1) ist fast nie kleiner als 1/5 p-1, und auch bei den wenigen Ausnahmen davon (die man ja nach der Berechnung von phi(p-1) erkennt) ist es ein echter Anteil von 18, 15, 12, ... Prozent - nie eine “Nullmenge”. Der prob. Algorithmus läuft also in so einem Ausnahmefall im Durchschnitt etwas länger. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 9 PKI: RSA, ElGamal PKI Public Key Szenario m cKpub(m) Alice Bob Kpriv Kpub RSA Kryptoverfahren - 1977 - beruht auf Schwierigkeit von Faktorisierung, speziell die von Primzahlprodukten: Gegeben Primzahlprodukt p*q, was sind p und q? RSA Schlüsselpaar-Erzeugung Wähle zufällig zwei Primzahlen p und q, die ungefähr lang sind. Sei N = pq. Berechne phi(N) = (p-1)(q-1) Wähle eine zu phi(N) teilerfremde Zahl e < phi(N). Berechne d, für das gilt: ed = 1 mod phi(N) (via erweiterter Euklid) (e,N) ist öffentlicher Schlüssel, (d,N) der private. RSA RSA Public Key (e,N) Private Key (d,N) RSA Verschlüsselung Ein m aus {2,...,N-2} wird mit dem öffentlichen Schlüssel verschlüsselt zu c = me mod N RSA RSA Public Key (e,N) Private Key (d,N) RSA Entschlüsselung Ein Ciphertext c aus {1,...,N-1} wird mit dem privaten Schlüssel entschlüsselt zu cd mod N Verifikation: cd = (me)d = med = m1+ k*phi(N) = m1 = m mod N Euler RSA RSA Public Key (e,N) Private Key (d,N) Elgamal Kryptoverfahren - 1985 - Erweiterung von Diffie-Hellman Schlüsselaustausch - beruht auf Schwierigkeit von Diskreter Logarithmus (DL): Gegeben Primzahl p, and a und m aus {0,...,p-1}. Für welches x aus {0,...,p-1} gilt ax = m mod p ? - Sicherheit äquivalent zum DL Problem Elgamal Schlüsselpaar-Erzeugung Bestimme Primzahl p und Primitivwurzel g von Zp*. Wähle zufälliges a aus {0,...,p-2}. p, g, und a sind fest. Nur a bleibt geheim. Berechne A := ga mod p. Der öffentliche Schlüssel ist (p,g,A), der private ist a. Elgamal Elgamal Public Key (p,g,A) Private Key a Elgamal Verschlüsselung Ein m aus {1,..,p-1} wird mit dem öffentlichen Schlüssel zu einem Ciphertext (B,c) verschlüsselt: Wähle zufälliges b aus {1,...,p-1}. Sei B := gb mod p und c:= Abm mod p Der Ciphertext ist das Paar (B,c). Elgamal Elgamal Public Key (p,g,A) Private Key a Elgamal Entschlüsselung Ein Ciphertext (B,c) wird mit dem privaten Schlüssel entschlüsselt zu Bp-1-a c = m mod p Verifikation: Bp-1-ac = gb(p-1-a)Abm = gb(p-1-a)gab m = gb(p-1)g-abgab m = g(p-1)bm = m mod p Euler/Fermat Elgamal Elgamal Public Key (p,g,A) Private Key a Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 10 Signaturen, Diffie-Hellman Signatur Signatur s(m) einer Nachricht m m, s(m) Alice Bob Kpriv Kpub Kpub Signatur Signatur (Thema “Integrity”) Gegeben eine Nachricht/Information m. Eine Signatur s(m) von m hat folgenden Sinn: 1. Schutz gegen Manipulation von m durch Dritte 2. Nachweis, dass m durch denjenigen (und nicht jemand anders) gesendet/produziert/bestätigt wurde, der den geheimen Schlüssel besitzt 3. Nichtabstreitbarkeit: Nachweisbarkeit gegenüber dem Besitzer des geheimen Schlüssels, dass m vom ihm signiert wurde. Die 3. Eigenschaft entspricht am meisten dem Zweck einer üblichen Unterschrift unter einen Vertrag. Die 3. Eigenschaft kann nur mit asymmetrischen Signaturen (PKI) erreicht werden. RSA Signatur RSA Signaturerzeugung (mit dem privaten Schlüssel) Ein m aus {2,...,N-2} wird mit dem privaten Schlüssel signiert als s = md mod N s ist die Signatur von m signieren = verschlüsseln mit dem privaten Schlüssel RSA RSA Public Key (e,N) Private Key (d,N) RSA Signatur RSA Signaturprüfung (mit dem öffentlichen Schlüssel) Die RSA-Signatur s einer Nachricht m wird geprüft durch s =? me mod N Signatur prüfen = entschlüsseln mit dem öffentlichen Schlüssel RSA RSA Public Key (e,N) Private Key (d,N) Elgamal Signatur Elgamal Signaturerzeugung (mit dem privaten Schlüssel) Eine Nachricht m aus {1,..,p-1} soll signiert werden. Finde durch Raten zufälliges k, so dass ggT(k,p-1) = 1, und berechne k -1 mod p-1. Bestimme ● r = gk mod p ● s = (m – ar)k-1 mod p-1 Die Signatur von m ist das Paar (r,s) Elgamal Elgamal Public Key (p,g,A) Private Key a Elgamal Signatur Elgamal Signaturprüfung (mit dem öffentlichen Schlüssel) (r,s) sei die Signatur einer Nachricht m. Prüfe, ob gm =Arrs mod p Wenn die Signatur vom privaten Schlüssel erzeugt wurde, dann gilt ● s = (m – ar)k-1 mod p-1 ● <=> m = ar + ks mod p-1 ● gm = gar + ks = (ga)r (gk)s = Arrs mod p Euler/Fermat Auch bei Elgamal: Signieren ist ähnlich dem Verschlüsseln, jedoch mit dem privaten Schlüssel, und das Prüfen der Signatur ist ähnlich dem Entschlüsseln, jedoch mit dem öffentlichen Schlüssel. Elgamal Elgamal Public Key (p,g,A) Private Key a Symmetrische Signatur Signaturerzeugung (mit dem Schlüssel) Eine Nachricht m soll signiert werden: s = eK(m) (CBC Modus) Prüfung durch Empfänger: Gegeben m und s(m), bestimme ebenfalls s' = e K(m) (CBC Mode) und prüfe ob s' = s. Vorteil symmetrische Signatur: nur ein Teil von s reicht als Signatur, z.B. der letzte 16-Byte Block, oder auch nur ein paar Bytes des letzten Blocks, oder eine deterministische Umformung eines Teils von s(m): z.B. eine 6-stellige Nummer (TAN). Nachteile: 1. Zertifikate etc. sind nicht möglich. 2. Nichtabstreitbarkeit ist nicht erreicht Bijektivität der Verschlüsselung nicht notwendig --> Hash Funktion/MAC reicht (später) AES AES Schlüssel K Schlüssel K Authentisierung: Challenge/Response Challenge-Response („Zero Knowledge“) für symmetrischen Verfahren: User kündigt dem Server die Authentisierung an und schickt ID. Daraufhin wird vom Server ein Zufallsstring C (challenge) erzeugt und zum User geschickt. Der User verschlüsselt mit seinem geheimen Schlüssel K die challenge C und schickt den response R = eK(z) zurück. Der Server prüft die response R, indem er ebenfalls e K(C) berechnet und das mit R vergleicht. Auch hier gilt wie bei der symmetrische Signatur: Teil bzw. Abbild eines Teils des response – sagen wir ein 6-stelliges OTP (one-time-password) - reicht. Und es reicht hier ebenfalls eine (nicht-bijektive) Hash-Funktion (später). Das asysmmetrische challenge/response Verfahren verläuft genau so, außer dass der Server das Ergebnis prüft, indem er R mit dem öffentlichen Schlüssel entschlüsselt und das mit C vergleicht. Asymmetrisch geht challenge/response auch umgekehrt: der Zufallsstring wird vom Server verschlüsselt: nur der User kann ihn mit seinem privaten Schlüsseln entschlüsseln. Server User Schlüssel K geheimer Schlüssel K Privacy/Integrity/Authenticity Symmetrisch Asymmetrisch DES AES RSA Elgamal Privacy (Verschlüsseln/ Entschlüsseln) ja ja ja ja Integrity (Signatur) ja ja ja ja - Teil der Signatur reicht - Hash-Funktion reicht Authentisieren (Challenge/ Response) ja ja - Teil der Signatur reicht - Hash-Funktion reicht nicht abstreitbar Zertifikate möglich ja ja nicht abstreitbar Diffie-Hellman: Erinnerung Primitivwurzel p=11, Primitivwurzel r = 7 0 1 10 2 9 3 8 4 7 6 5 Der neue Zyklus mit p-1 Elementen irrt scheinbar zufällig in dem Kreis 1,...,p-1 hin und her. Für große Primzahlen p, z.B. p = 2*3132 + 1, ist das ein „9. Weltwunder“, dass dieser Zyklus diese gigantische garantierte Länge hat und jedes Element erreicht. Bewiesen von Gauss 1799 – ahead of time! Diffie-Hellman Schlüsselvereinbarung a, s = (gb)a A p, g, ga, gb B b, s = (ga)b 1. Einer der beiden legt eine Primzahl p und eine Primitivwurzel g fest und schickt p und g dem anderen. Das darf jeder sehen. 2. A erzeugt sich zufällig eine Zahl a<p und B eine Zahl b<p. Diese beiden Zahlen bleiben geheim. D.h., A wird b niemals kennen, und B a nicht. 3. A berechnet ga mod p und schickt ga mod p über den öffentlichen Kanal an B, und B schickt gb mod p an A. Reihenfolge spielt keine Rolle 4. A berechnet s= (gb)a mod p, und B berechnet s' = (ga)b mod p. s und s' sind wegen s = (gb)a = g(ba) = g(ab) = (ga)b = s' identisch und s=s' ist damit das gemeinsame Geheimnis, das A und B jetzt haben, aber niemand anders kennt. 5. Mit s als als symmetrischem Schlüssel, z.B. als AES256 Schlüssel, kann jetzt A verschlüsselte Nachrichten über den öffentlichen Kanal an B schicken, die B dann entschlüsseln kann, aber niemand anders, und umgekehrt. Schwächen Diffie-Hellman a, s = (gb)a p, g, ga, gb A B b, s = (ga)b 1. Wenn ein schneller Algorithmus für Diskreter Logarithmus gefunden wird, ist DH gebrochen. Genau genommen reicht sogar ein schneller Algorithmus für das folgende Berechnungsproblem: Gegeben p, g, ga mod p, gb mod p, was ist gab mod p? 2. Der Zufallsgeneratoren bei der Generierung von a und b müssen unvorhersehbar sein. 3. Größtes Problem von Diffie-Hellman ist der Man-in-the-Middle Angriff: a, s = (gz)a A p, g, ga, gz M p, g, gz, gb B b, t = (gz)b z, s = (ga)z , t = (gb)z Der Angreifer M setzt sich beim Schlüsselaustausch zwischen A und B, generiert eine Zufallszahl z<p und spielt dann A gegenüber B, und B gegenüber A. So tauscht M mit A einen Schlüssel s aus und mit B einen Schlüssel t. A und B bemerken die Anwesenheit von M nicht. Wenn dann A eine mit s verschlüsselte Nachricht an B schickt, entschlüsselt M die Nachricht mit s, verschlüsselt sie mit t, um sie dann an B weiterzuschicken, und umgekehrt. M kann also nicht nur alle Nachrichten abhören, sondern auch abändern. Einziger Trost, was diesen Angriff angeht: M muss dauerhaft den Kanal besetzen, um abzuhören bzw. zu manipulieren, denn A und B merken, dass etwas nicht stimmt, wenn M nicht mehr dazwischen ist bzw. sie sich auf einem anderen Kanal verschlüsselte Nachrichten zuschicken. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 11 Primzahltests: Fermat, Miller-Rabin Primzahltests Problem: Gegeben n. Ist n Primzahl? Naive Methoden: Ausprobieren: gehe der Reihe nach alle Zahlen t= 2, 3, 4, 5, … Wurzel(n) durch und teste per Division, ob n durch t ohne Rest teilbar ist. Verbesserung (Sieb des Eratosthenes). Gehe der Reihe nach alle Zahlen t= 2, 3, 5, 7, 11, ... Wurzel(n) durch, aber lasse die Vielfachen von schon durchgegangen t aus. Eratosthenes aus Cyrene, Lybien, ca. 200 v.Chr. Die naiven Tests scheitern schon bei relativ kleinen Zahlen, z.B. 100-stellige Dezimalzahlen (Wurzel ist halb so lang, also 50-stellig), auch bei parallelen Supercomputern. Fermat Primzahl-Test Problem: Gegeben n. Ist n Primzahl? Euler: Für alle a in Zn* gilt aphi(n) = 1 Korollar (Fermat): Für alle 0 < a < p gilt a p-1 = 1 mod p. Basierend darauf Fermat Primzahl-Test Für gegebenes n wähle a < n wenn ggT(a,n) > 1 mod n, gibt aus: n ist keine Primzahl; wenn an-1 > 1 mod n gebe aus: n ist keine Primzahl; Ansonsten gebe aus: n ist Primzahl; Problem ist: der Algorithmus ist nicht korrekt, er erklärt Nicht-Primzahlen zu Primzahlen: 1. Es gibt die sogenannten “Fermat-Pseudoprimzahlen n” bzgl. einer Basis a, d.h. teilerfemde n,a mit an-1 = 1 mod n. Beispiel: 1790 = 1 mod 91. (91 = 7 x 13) 2. Schlimmer: es gibt die sog. Carmichael Zahlen n, die keine Primzahlen sind, für die aber für alle teilerfremden a < n gilt: an-1 = 1 mod n. Kleinstes Beispiel: 341 = 3·11·17. 3. Noch schlimmer: es gibt unendlich viele Carmichael Zahlen und sie sind nach aktuellem Stand nicht durch einen effizienten Algorithmus als solche erkennbar. Primzahl-Tests Bitte beachten, dass beim Fermat-Test n-1 gerade ist und somit im Fall an-1 = 1 mod n gelten muss: a(n-1)/2 = 1 mod n oder a(n-1)/2 = -1 mod n und zwar wegen der 3. binomischen Formel: an-1 = 1 mod n => an-1 - 1 = 0 mod n => (a(n-1)/2 )2 - 12 = 0 mod n => (a(n-1)/2 - 1) (a(n-1)/2 + 1) = 0 mod n => a(n-1)/2 = 1 mod n oder a(n-1)/2 = -1 mod n (n-1)/2 Bem. Der sog. Solovay-Strassen Primzahl-Test schaut sich an, ob einer der beiden Fälle für a vorliegt, und vergleicht das Ergebnis auf Gleichheit mit dem sogenannten Jacobi-Wert von n und a. Schon der Solovay-Strassen schafft es, das Carmichael-Zahlen Problem mit einer begrenzten einseitigen Fehlerwahrscheinlich zu lösen. Weil der Test aber gegenüber dem folgenden Miller-Rabin-Test nur Nachteile hat (einseitige Fehlerwahrscheinlichkeit 50% statt 25% wie bei Miller-Rabin) und weil der Jacobi-Wert und dessen Berechnung eingeführt werden müssten, wird Solovay-Strassen hier nur erwähnt. Miller-Rabin Primzahl-Test Die folgende Verbesserung des Fermat Primzahl-Tests guckt sich den Exponenten n-1 genauer an. Miller-Rabin Primzahl-Test (1976) Für ein gegebenes n sei n – 1 = m*2d mit m ungerade. Wähle a < n zufällig. Wenn ggT(a,n) > 1, dann ist n keine Primzahl. Wenn folgendes Kriterium K erfüllt ist am = 1 mod n oder am = -1 mod n, m*2 m*2 oder a = -1 mod n, oder …, oder a dann gebe aus: n ist Primzahl Ansonsten gebe aus: n ist keine Primzahl; d-1 In dieser Folge muss vor einer 1 immer eine -1 kommen, egal ob Primzahl oder nicht, siehe Seite vorher. = -1 mod n, 25% Fehlerwahrscheinlichkeit 0% Fehlerwahrscheinlichkeit Rabin (1976): Für eine Nicht-Primzahl n ist das Kriterium K nur für max. ¼ aller a < n erfüllt. (ohne Beweis – ist schwierig) Das ergibt den folgenden probabilistischen Algorithmus: Wiederhole den Miller-Rabin Primzahl-Test k mal. Wenn er bis dahin nicht geantwortet hat “n ist keine Primzahl”, dann ist n mit Wahrscheinlichkeit 1- ¼k eine Primzahl Das reicht für praktische Belange: Wenn einem eine Fehlerwahrscheinlichkeit von sagen wir nicht mehr als 1 aus 2200 genügt, lässt man den Algorithmus 100 mal laufen, bevor man die Zahl n als Primzahl ansieht. AKS Primzahl-Test Im Jahr 2002 gab es eine mathematische Sensation durch 3 Inder (M. Agrawal, N. Kayal, N. Saxena): PRIMES in P. d.h., für das Primzahlproblem gibt es eine deterministischen (d.h. nicht-randomisierten) Algorithmus mit polynomieller Laufzeit (Inputlänge ist die Länge der Binärzahl). Anfangs war das Laufzeit-Polynom x7,5, und wurde dann auf x6 verbessert. Grundidee ist folgender Satz (wie beim Fermat-Test der Satz von Fermat): Sei ggT(a,n) = 1. Dann ist n Primzahl gdw. (X + a)n = Xn + a mod n (als Polynom) In der Praxis ist der AKS Primzahltest irrelevant, denn Miller-Rabin ist unschlagbar. Primzahldichte Sei für x aus N pi(x) die Anzahl der Primzahlen < x. ln(x) ist der natürliche Logarithmus zur Basis 2,71 ... (Gauss/Legendre/Hadamard/... etc.): Asymtotisch gilt pi(x) = x/ln(x). Abweichung nicht mehr als 5%. Beispiel: pi(2512) ~ 2512/350. Unter allen Zahlen mit höchstens 512 Binärstellen ist also ca. jede 350-te eine Primzahl. Wenn man nur die Zahlen mit genau 512 Stellen nimmt, sollte die Verteilung da auch fast so hoch sein. Unter 175 ungeraden 512-stelligen Binärzahlen ist also ca. 1 Primzahl. Der Teil-Algorithmus bei der Schlüsselerzeugung von RSA1024 zum Finden von 512-stelligen Primzahlen p ist also zweifach randomisiert: Rate solange ungerade 512-stellige Zahlen n, bis der Miller-Rabin-Test mit Fehlerwahrscheinlichkeit von sagen wir 2-200 mit dem Ergebnis “n ist Primzahl” hält. Wegen der hohen Primzahldichte kann man davon ausgehen, dass man nach nicht viel mehr als ln(n) (im Beispiel 350) Versuchen eine Primzahl gefunden hat. Praktisch (Erfahrung, aber kein Beweis!) sind die Primzahl so gut verteilt, dass man n nur einmal raten muss und dann n, n+2, n+4, ... auf Primality testet. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 12 Elliptische Kurven Elliptische Kurven im Reellen Punktmengen in R2 Elliptische Kurve y2 = x3 + ax + b Kreis y2 = b - x 2 Ellipse y2 = b - ax2 Elliptische Kurven im Reellen Punkt-Addition P+Q Punkt-Addition P+Q P+Q P P+Q Q P Q Wenn P und Q verschienen sind, gibt es in fast allen Fällen auf der Gerade durch P und Q einen 3. Punkt (spezielle Eigenschaft der elliptischen Kurven): dessen Spiegelpunkt an der x-Achse ist das Resultat P + Q. Elliptische Kurven im Reellen Punkt-Verdopplung 2P spezielle Punkt-Addition P+Q 2P P+Q P Q P Wenn P = Q, dann liegt in fast allen Fällen auf der Tangente durch P ein 2. Punkt. Dessen Spiegelpunkt an der x-Achse ist das Resutat P + P = 2P. Diese Definition kann man herleiten, indem man Q an P infinitesimal annähert: P+Q konvergiert gegen den “Grenzwert” 2P. Der Spezialfall, dass P auf der horizontalen Tangente des “lokalen Maximums” Q liegt. Das ist ebenfalls als “Grenzwert” herleitbar. Neutrales Element N Hier sind die verbleibenden Fälle, dass kein 3. Punkt auf der Geraden liegt (links), nämlich dann, wenn die x-Werte von P und Q gleich sind, bzw. dass auf der Tangente kein 2. Punkt liegt (rechts). In diesen Fällen definiert man das Ergebnis als “unendlichen” Punkt N, der formal ein Element der elliptischen Kurve wird (N wird das neutrale Element bei der Addition sein). P+Q=N 2P = N P P Q Skalarmultiplikation Skalarmultiplikation kP kP für k>0 und einen Punkt P der EC ist definiert durch 1P = P 2P = P + P 3P = P + P + P 4P = P + P + P + P ... kP = (k-1)P + P ... 2P 6P Man kann also k-1 mal eine Punktaddition durchführen, um den Punkt kP zu berechnen. Für k = 2100 wäre das z.B. aber nicht machbar. Man kommt für k = 2100 mit nur 100 Punktverdopplungen aus, indem man 100 mal den Punkt P verdoppelt. Die Zeichnung zeigt die Konstruktion von 6P, nicht durch 5 Punktadditionen, sondern durch 1 Punktaddition und zwei Punktverdopplungen P → 2P →2P + P = 3P →2 . 3P = 6P 3P P Diskrete Elliptische Kurven Gegeben sei ein endl. Primkörper Fp. Eine elliptische Kurve C ist die Menge von Paaren (x,y) aus Fp x Fp für die die Gleichung y2 = x3 + ax + b gilt, wobei a, b aus Fp vorgegeben sind mit 4a3 + 27b3 != 0 (Diskriminanten-Bedingung) Zur Menge kommt ein “neutrales Element” N dazu. Beispiel p=5, a=1, b=1. (Diskriminanten-Bed. erfüllt: 4a 3 + 27b2 = 31 = 1 != 0 mod 5). Welche Paare (x,y) aus F5 x F5 erfüllen die Gleichung y2 = x3 + x + 1? y/x 0 1 2 3 4 Hilfs-Tabellen y y x x 1 2 3 0 x x x 0 0 0 0 2 x 1 1 1 1 3 x 2 3 2 4 3 2 3 4 4 4 4 1 4 x x x C = {N, (0,1), (0,4), (2,1), (2,4), (3,1), (3,4), (4,2), (4,3)} ECC – Addition und Verdopplung Auf C wird eine Addition P + Q definiert: Wenn P = N oder Q = N ist, dann ist P + N = N + Q = N. Gegeben seien zwei verschiedene Punkte P = (x1,y1) und G = (x2,y2) der Kurve C. Wenn x1 = x2, dann P + Q := N. Ansonsten: s := y2 - y1 x2 - x1 x3 := s2 - x2 - x1 y3 := s(x2 - x3) - y2 Resultat: P + Q = (x1,y1) + (x2,y2)= (x3,y3) Wenn P = Q, dann wird die Punktverdopplung P + P = 2P = 2(x1,y1) definiert: 3x12 + a s := 2y1 (a ist Kurvenparameter) x3 := s2 - 2x1 y3 := s(x1 - x3) - y1 Resultat P + P = 2P = 2(x1,y1) := (x3,y3) (nur die Gleichung für s ist anders als oben) ECC – Beispiel Addition C = {N, (0,1), (0,4), (2,1), (2,4), (3,1), (3,4), (4,2), (4,3)} y\x 0 1 2 3 x x 4 0 1 x 2 x 3 x 4 x x x Beispiel (2,1) + (3,4) s = (4 – 1)(3 – 2)-1 = 3.1-1 = 3 mod 5 x3 = 9 – 3 – 2 = 4 mod 5 y3 = 3(3-4) – 4 = -7 = 3 mod 5 Also (2,1) + (3,4) = (4,3) x-1 mod 5 x x-1 0 - 1 1 2 3 3 2 4 4 Double-and-Add Mit den zwei Operation P+Q und 2P kann man für jedes ganzzahlige k und jeden Punkt P den Punkt kP berechnen, und zwar schnell, in dem man den Square-and-Multiply Algorithmus eins-zu-eins in einen Double-and-Add Algorithmus übersetzt: Square entspricht Verdopplung 2P, und Multiply entspricht Addition P+Q: Sei b die Binärdarstellung von k. Fange mit X := P an, gehe von links nach rechts durch die Binärdarstellung von k durch: wenn eine 0 kommt, verdopple X := 2X, wenn eine 1 kommt, verdopple und addiere: X = 2X + P. Beispiel k = 18 = 10010. X := P; X := 2X; X := 2X; X := 2X + P; X := 2X; Es gilt am Schluss: X = 18P. Generatoren Eine Punkt G einer diskreten elliptischen Kurve C heißt Generator von C, wenn durch Skalarmultiplikation mit G jeder Punkt der Kurve erreicht werden kann, also wenn {kG | k > 0} = C. Weil die Anzahl |C| der Elemente von C endlich ist, muss es also eine Periode G, 2G, 3G, ...., N, G, 2G, ... der Länge |C| sein. Dass das letzte Elemente der Periode das neutrale Element N ist, liegt daran, dass (wie bei Z n* ) die von G erzeugte Menge eine zyklische Untergruppe von (C,+) ist: wenn X + G = G, dann muss X das neutrale Element sein. Wegen der Untergruppen Eigenschaft hat man ebenso wie bei Zn* das folgende “Lagrange” Kriterium dafür, ob ein Punkt P ein Generator der Kurve C ist: P ist Generator von C gdw. für alle maximalen Teiler t von |C| ist tP ungleich N. Für dieses Kriterium muss man |C| kennen und faktorisieren können. Das erstere leistet ein effektiver Algortihmus von Schoof (1985), der in Linearzeit läuft (Speicherbedarf kubisch): Gegegen sei das p und die Gleichung für C. Dann lässt sich |C| effektiv berechnen. Wenn |C| eine Primzahl ist, ist nach dem Kriterium oben jeder Punkt von C außer N ein Generator. Bei Z p* war das nicht möglich, denn phi(p) ist durch 2 teilbar, aber bei elliptischen Kurven geht es, siehe z.B. die Bitcoin Kurve. Was Generatoren angeht, liegt also bei elliptischen Kurven praktisch die gleiche Situation vor wie bei Z p* , nur mit dem Unterschied, dass die Zyklus-Operation mit + notiert wird, nicht mit ., das ist aber nur eine Notationsfrage. Es gibt also wie bei Zp* die nachweislich exponentiell langen Zyklen, bei der jedes Element der Menge erreicht wird. Es liegt also nahe, das Diskrete Logarithmus Problem analog für EC's zu formulieren. Diskreter Logarithmus Problem bei ECC x = gy DLP Problem: fest: Primzahl p, Generator g von Zp* INPUT: x in Zp* OUTPUT: y > 0 so dass x = gy mod p Zp * g3 g2 g P = yG DL-ECC Problem: fest: diskrete elliptische Kurve C, Generator G INPUT: P in C OUTPUT: y > 0 so dass P = yG C 3G 2G G BitCoin Kurve Bitcoin Kurve (Name: secp256k1) Primzahl p: p = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1 = 115792089237316195423570985008687907853269984665640564039457584007908834671663 Kurvengleichung: y2 = x3 +7 Generator G: x = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 y = 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8 Ordnung von G = Länge des Zyklus = Anzahl der Elemente der Kurve: (ist eine Primzahl) 115792089237316195423570985008687907852837564279074904382605163141518161494337 ECC Verschlüsselung R,c(m) A kpriv B r kpub Gegeben (fest und öffentlich): elliptische Kurve C und Generator G für C Schlüsselpaarerzeugung durch A: Privater Schlüssel: Bestimme ein kpriv zufällig aus {2, ... ,|C|-1} Öffentlicher Schlüssel: kpub = kpriv G kpriv ist ein Integer, kpub ist ein Punkt. Verschlüsselung durch B: wähle Zufallszahl r und berechne R = rG und S = rkpub . Fasse S als symmetr. Schlüssel auf (z.B. AES) und verschlüssele damit die Nachricht m zu c(m). Schicke (R,c(m)) an A. Entschlüsselung durch A: Berechne kprivR = kprivrG = rkprivG = rkpub = S. Entschlüssele mit S die Nachricht m Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 13 Zertifikate, DLP: Shanks, Pohlig-Hellman Zertifikate Diffie-Helman Schlüsselvereinbarung zwischen Browser B und Webseite A www.uni-tuebingen.de a Browser ga A B b gb Fatales Problem: Man-in-the-middle a A ga gm M m gb gm B b Spezielle (einseitige) Situation ist das Aufrufen einer Webseite: wie kann B sicher sein, dass er tatsächlich auf der richtigen Webseite A ist? Erste Lösung: Signatur durch Authority Certification Authority Problem: A muss jedesmal CA bitten, zu signieren (“Standleitung”) CA kCA,priv kCA,pub s = ek CA,priv(ga,www.uni-tuebingen.de) a ga, s A B b gb a A ga g m M m gb g m geht schief B b B entschlüsselt mit kCA,pub die Signatur s Wenn alles stimmt, setzt er den Schlüsselaustausch fort Zweite Lösung: Zertifikat Certification Authority CA kCA,priv kCA,pub certA = < kA,pub, www.uni-tuebingen.de, ek CA,priv(kA,pub,www.uni-tuebingen.de) , CA> s = ek A,priv(ga) g , s, certA a a a kAA,priv A B b gb ga g m M m gb g m CA) und prüft dann mit kA,pub die Signatur s. Wenn alles stimmt, setzt er den Schlüsselaustausch fort B b Ein Zerfikat ist die Signatur eines Paares <k pub,ID> eines Teilnehmers mit ID in einer PKI durch eine CA. B prüft ID und CASignatur in certA (bei CA Hierarchie CA-top kCA-top,priv kCA-top,pub certCA1 = < kCA,pub, CA, ek CA-top,priv(kCA1,pub,CA) , CA-top> CA kCA,priv zusätzlich kCA,pub certA = < kA,pub, www.uni-tuebingen.de, ek CA,priv(kA,pub,www.uni-tuebingen.de), certCA1> s = ek A,priv(ga) a certA kAA,priv ga, s, certA gb B b B prüft certCA1 und certA TLS www.uni-tuebingen.de a Browser ga A B b gb TLS (“https”) besteht - aus Browsersicht - aus 3 Schritten. 1. Prüfe Zertifikat der Webseite (z.B. via ECC). 2. Vereinbare (z.B. via Diffie Helman) einen symmetrischen Schlüssel, aber nur wenn dabei von der Webseite die Nachrichten signiert werden. 3. Verschlüssele/Entschlüssele ab da den Rest der Kommunikation mit dem vereinbarten symmetrischen Schlüssel (z.B. AES). DLP Algorithmen Es folgen zwei Algorithmen für DLP: Giant-Step-Baby-Step und Pohlig-Helman Baby-Step-Giant-Step Algorithmus Baby-Step-Giant-Step Algorithmus zur Berechnung des Diskr. Logarithmus DL Fest vorgegeben: Primzahl p, Generator g. Problem: Gegeben x in Zp*, finde y mit gy = x mod p Sei r = kleinste ganze Zahl größer als Quadratwurzel von p, d.h., jedes y lässt sich darstellen als y = ryGiant + yBaby mit yGiant ,yBaby < r. (Eindeutigkeit unwesentlich) Es gilt: gy = x mod p ↔ g ry +y Giant Baby = x mod p ↔ g ry Giant g y Baby = x mod p ↔ y g Baby = xg -ry Giant Algorithmus. Finde y mit gy = x mod p Schritt 1: Lege eine 2-spaltige DB an mit den Einträgen (in,out) = (0,g0 mod p), (1,g1 mod p), (2,g2 mod p), …. ,(r-1,gr-1 mod p). Lege einen Index an zum schnellen Suchen in der 2. Spalte out. Schritt 2: Durchlaufe alle Möglichkeiten yGiant = 0, 1, …, r-1: Berechne s = xg -ry Giant mod p und prüfe, ob es einen DB-Eintrag (yBaby,s) gibt. Wenn ja, RETURN y = ryGiant + yBaby; Ansonsten gehe zum nächsten yGiant; y Korrektheit: Wenn Ausgabe ryGiant + yBabyerfolgt, dann g Baby = s = xg -ry Giant mod p, also gy = x mod p. Andererseits wird der Schritt 2 auch irgendwann den DL y erwischen, nämlich beim Durchlauf von y Giant. Komplexität: Der Algorithmus reduziert die Laufzeit eines Exhaustive Search von p auf Wurzel p (was erheblich ist), auf Kosten eines großen Speicherbedarfs. Bem. Das ist wieder ein Meet-in-the-middle Algorithmus, so wie der für 2-DES. Bem. Der Algorithmus wird auch nach seinem Erfinder Shanks Algorithmus genannt. Bem. Der Algorithmus zum Finden des multiplikativen Faktors k beim DL-ECC Problem ist identisch! mod p Pohlig-Hellman Algorithmus Pohlig-Helman Algorithmus zur Berechnung des Diskr. Logarithmus DL Fest vorgegeben: Primzahl p, Generator g. Problem: Gegeben x in Zp*, finde y mit gy = x mod p Teilalgorithmus A (teilerfremde Faktoren) Sei phi(p) = r.s mit r und s teilerfremd. Berechne g0.s , g1.s , g2.s , ... , g(r-1).s mod p, solange bis ein gi.s = xs mod p gefunden ist. Dieses i existiert, nämlich als i = y mod r, denn für y = i + z.r gilt Euler/Fermat xs = (g(i + z.r))s = g(i + z.r).s = gi.s . gz.r.s = gi.s . gz.phi(p) = gi.s mod p Bekannt ist damit also i = y mod r. Analog finden wir durch Ausprobieren von g0.r , g1.r , g2.r , ... , g(s-1).r mod p und jeweils den Vergleich gj.r = xr mod p ? den Wert j = y mod s. Damit sind die Voraussetzungen für CRT perfekt gegeben: y ergibt sich als eindeutige Lösung modulo r.s (r und s teilerfremd), für die gilt i = y mod r und j = y mod s. Es gilt dann: gy = x mod p Pohlig-Hellman Algorithmus Pohlig-Helman Algorithmus zur Berechnung des Diskr. Logarithmus Fest vorgegeben: Primzahl p, Generator g. Problem: Gegeben x in Zp*, finde y mit gy = x mod p Teilalgorithmus B (Primzahlpotenzen) Sei phi(p) = qh.s mit q (Primzahl) und s (“Restfaktor”) teilerfremd. Gesucht ist die Zahl j = y mod qh. Dafür schreiben wir fiktiv y = a0q0 + a1q1 + ... + ahqh mit 0 <= ai < q (ist eindeutig, wie z.B. Binärzahlen). h-1.s Zuerst wird a0 gefunden durch Ausprobieren/Berechnen von g0.q h-1.s solange bis ein gi.q xq h-1.s h-1s = (gy)q = xq = gy.q h-1.s h-1.s xq h-2.s h-2s = (gy)q h-2.s = xq h-1.s = g(a0 + a1q + ... + ah.q ).q h = gy.q h-2.s h-2.s h-1.s h-1.s , g2.q h-1.s , ... , g(q-1).q mod p, Euler/Fermat mod p gefunden ist. Dieses i existiert, nämlich i=a0: = ga0.q h-1.s . g(a1q + ... + ah.qh).q Mit a0 als bekannt, finde a1 durch Ausprobieren von g(a0 + 0.q).q das i mit g(a0 + i).q , g1.q h-2.s h-1.s h-1.s = ga0.q h-2.s , g(a0 + 1.q).q h . g(a1 + ... + ah.qh-1).q .s h-2.s , g(a0 + 2.q).q mod p. Es ist i = a1 aus dem analogen Grund wie bei a0: 2 + ... + a .qh).qh-2.s h = g(a0 + a1q + a2q h-2.s = g(a0 + a1q).q . g(a2 + ... + ah.qh-2).qh.s , ... , g(a0 + (q-1).q).q Euler/Fermat = g(a0 + a1q).q h-2.s mod p Mit a0 und a1 als bekannt, finde durch Ausprobieren von h-3.s g(a0 + a1q + 0.q ).q 2 , g(a0 + a1q + 1.q ).q 2 h-3.s h-3.s , ... , g(a0 + a1q + (q-1).q ).q 2 h-3.s ein i ( = a2) mit g(a0 + a1q+ i.q ).q 2 h-3.s = xq Mache das h mal, d.h., bestimme alle a0,..., ah-1. Wegen y = a0q0 + a1q1 + ... + ah-1qh-1 + ahqh gilt für j = a0q0 + a1q1 + ... + ah-1qh-1 , dass j = y mod qh. Diese Zahl j wurde gesucht. h-1.s = ga0q mod p. mod p h-2.s Pohlig-Hellman Algorithmus Pohlig-Helman Algorithmus zur Berechnung des Diskr. Logarithmus Fest vorgegeben: Primzahl p, Generator g. Problem: Gegeben x in Zp*, finde y mit gy = x mod p Gesamt-Algorithmus Sei phi(p) = q1h1 . q2h2 . ... . qnhn die Primfaktorzerlegung von phi(p). Bestimme für jede Primzahl qi das ji , so dass y = ji mod pihi Diese n Gleichungen haben mit CRT eine eindeutige Lösung y, für die gilt: g y = x mod p. Wenn phi(p) also in “kleine” Primfaktoren zerfällt, dann lässt sich DLP schnell lösen. Beispiel: p = 2.3132 + 1 Konsequenz aus Pohlig-Helman: Sophie-Germain Primzahlen p für DLP benutzen (p = 2q+1, mit q Primzahl. Beispiel p=47). Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 14 Faktorisierungsmethoden Faktorisierungsmethoden Kryptologie • Probedivision • ggT • Pollard rho Methode • Fermat Methode • Lucas Test Probedivision Gegeben n. Dividiere n systematisch durch Zahlen oder besser Primzahlen. Beispiel: Dividiere n durch 2, durch 3, durch 5, etc. bis zur Wurzel von n. Faktorisierungsmethode ggT Gegeben n. Nimm eine Zahl m, die schon viele Teiler hat und berechne ggT(n,m). Beispiel: Mit m = 2.3.5.7.11.13 = 30030 erhält man ggT(119,m) = 7 als Teiler von 119. rho PollardPollard rho Methode Gegeben n. Wähle zufällig a < n. Setze x := a und y:= a. Sei f(x) := x2 + 1. Iteriere x = f(x), y = f(f(y)), solange bis d = ggT(|y-x|,n) > 1. Wenn d = n, dann nochmal mit neuem a. Andernfalls ist d ein echter Teiler von m. Verifikation ist trivial: wenn d>1 dann ist d ein Teiler von n. Komplexität: Wegen Geburtstagsparadoxon und realistischer Annahme, dass f sich wie eine Zufallsfolge verhält und damit die Größe des Zyklus n1/2 ist, ist die erwartete Laufzeit von der Größenordnung n1/4 Geburtstagsparadoxon: Wenn eine Eigenschaft von Objekten a gleichverteilte Ausprägungen hat, dann reichen 1,2a 1/2 Objekte, so dass die Wahrscheinlichkeit, dass mindestens zwei davon die gleiche Ausprägung haben, > 50% ist. Beispiel: bei 22 Menschen ist die Wahrscheinlichkeit, dass zwei am gleichen Tag Geburtstag haben, > 50%. Bem.: Wenn die Ausprägung nicht gleichverteilt ist, dann reichen sogar weniger. Das bedeutet, dass ein Algorithmus, der iteriert zwei Zahlen a,b rät und auf ggT(|a-b|,n) testet, erwartet nur 1,2 p 1/2 Iterationen braucht, um den Teiler p zu finden, im Vergleich zu dem Algorithmus, der iteriert eine Zahl a rät und auf ggT(a,n) testet: der braucht erwartet p/2 Iterationen. Die Pollard Konstruktion mit den zwei “Zeigern” x und y in dem rho ist nur dazu da, den Zufall des Ratens der 2 Zahlen a,b auf Pseudozufall zu reduzieren (Pseudozufall ist weniger teuer/rechenintesiv als vom Betriebssystem generierter Zufall). Beispiel Pollard rho n = 187 a = 10 x y |y-x| ggT(|y-x|,187) 10 10 - - 101 104 3 1 104 94 10 1 158 61 97 1 94 138 44 11 48 61 169 138 158 48 f 94 f f f 158 f f Teiler gefunden 104 61 138 f 101 f 10 f 169 Fermat Methode Grundidee: wegen a2 – b2 = (a+b)(a-b) würde es für eine Faktorisierung von n genügen, n als Differenz a 2 – b2 von zwei Quadraten darzustellen, denn dann hätte man die zwei Faktoren (a+b) und (a-b). Gegeben n. Suche die kleinste Ganzzahl a, die größer ist als die Wurzel von n. Prüfe, ob a2 – n eine Quadratzahl ist. Wenn nein, setze a := a+1 und prüfe, ob a2 – n eine Quadratzahl ist. Mache das solange, bis a2 – n eine Quadratzahl ist oder a > n. Eine Optimierung besteht darin, anstatt (a+1)2 für den nächsten Schritt a2 + 2a + 1 zu berechnen. Der Algorithmus ist vollständig: wenn ein Ergebnis a2 – n = b2 gefunden wird, sind (a+b) und (a-b) Faktoren von n, wegen 3. binomische Formel a2 – b2 = (a+b)(a-b). Ist umgekehrt n = cd mit c>d, dann wird bei a = (c-d)/2 die Faktorisierung gefunden. Wenn n zu groß ist und die Faktoren weit voneinander entfernt sind, terminiert der Algorithmus möglicherweise nicht. D.h. der Algorithmus eignet sich eigentlich nur dann, wenn ein Faktor nicht weit von der Wurzel entfernt ist. Im worst case (n prim) terminert der Algorithmus erst nach n minus Wurzel-n Schritten. Beispiel. Gegeben n = 377. Wegen 192 = 361 und 202 = 400 ist 20 die kleinste Ganzzahl größer als die Wurzel aus 377. 202 - 377 = 23, was keine Quadratzahl ist. Also gehen wir zur nächsten Zahl 20 + 1 = 21: 212 - 377 = 441 – 377 = 64 = 82 . Also sind (21-8) = 13 und (21+8) = 19 Teiler von n. Lucas Primzahltest Lucas Primzahltest n ist Primzahl gdw. es gibt a < n, so dass an = 1 mod n und at != 1 mod n für alle maximalen Teiler t von n-1. Beweis wie der ähnliche Satz für Primitivwurzeln, d.h. die Umkehrung von Euler's Satz. Es gilt ebenso wie bei den Primtivwurzeln, dass ein solches a probabilistisch gesucht werden kann, denn ein fester Anteil von solchen a unter alle Zahlen y< p ist garantiert. Problem mit Lucas Primzahltest: man muss die Faktorisierung von n-1 kennen. Und Faktorisierung ist schwieriger als Primzahl-Testen. Beweis von Primality Wie beweist man, dass eine Zahl n keine Primzahl ist? Indem man eine Zerlegung ab = n angibt. Aber wie beweist man, dass eine Zahl n eine Primzahl ist? Pratt/Lucas: Man gibt die Primzahlzerlegung von n-1 an, und einen “Zeugen” a, so dass a t für die Maximalteiler t der Primzahlzerlegung ungleich 1 mod p ist. Man bezeichnet das als ein “Pratt Zertifikat” der Primality von n. Beispiel 11 ist Primzahl, denn 10 = 2 * 5, 2 und 72 = 5 != 1 mod 11, und 75 = 7 * (72) = 7 * 3 = 21 != 1 mod 11 Die Primzahlzerlegung 11-1 = 2 x 5 und der Zeuge a=7 sind ein Beweis für die Primalität von 11. Achtung: für jede Primzahl der Primzahlzerlegung muss rekursiv ein Beweis der Primality angegeben werden. Beispiel: 85 ist keine Primzahl, aber die Zerlegung 84 =6*14 mit dem Zeugen a=4 wäre ein Beweis für Primality von 85, wenn man nicht fordern würde, auch die Primality von 6 und 14 nachzuweisen. Denn 414 = 16 != 1 mod 85, und auch 46 = 16 != 1 mod 85. Größenordnungen Dezimaldarstellung vs. Binärdarstellung: wg. 210 = 1024 = ca. 103 gilt für die Länge der Darstellung einer Zahl: Länge Binärdarstellung/Länge Dezimaldarstellung = ca. 10/3, oder ganz grob: 3/1. Beispiel. 473930481 hat binär ca. die Länge 30. Länge der Wurzel einer Zahl: halb so lang, plusminus 1. Länge der Produkts von zwei Zahlen: Summe der Längen der beiden Zahlen, plusminus 1. 1080 ist eine obere Schranke für die Anzahl der Teilchen im sichtbaren Weltall (Eddington Zahl, 1923. Aktuelle Anerkennung unklar.) 1070 ist eine obere Schranke für die Anzahl der unterscheidbaren Zeitpunkte vom Urknall bis nochmal so lange in der Zukunft. Deshalb kann kein klassischer (getaktet und auf 0/1 basierender) Parallelcomputer mehr als 10 150 = ca. 2500 Möglichkeiten testen, egal wie schnell Computer in der Zukunft noch werden und wieviele Computer parallel wie lange an der vorgegebenen Aufgabe rechnen. Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 15 Hashfunktionen Hashfunktionen Eine Hashfunktion bildet beliebig lange Wörter auf Wörter einer bestimmten Länge ab. Dabei „vermischt“ sie möglichst gut die Eingabe, d.h. Wörter, die sich nur wenig oder nur ein bit unterscheiden, werden auf ganz verschiedene Wörter abgebildet. Auch soll die Hashfunktion nur schwer rückrechenbar sein, d.h. idealerweise kann man einen Urwert u eines Hashwerts h(u) nur so errechnen, indem man systematisch alle existierenden Wörter w daraufhin testet, ob h(w) = h(u). Eine Hashfunktion hatten wir schon kennengelernt: AES im CBC Modus mit dem letzten Block als Hashwert (Schlüssel fest). Die Länge dieser Hashwerte ist also 128. Es wurden schon viele Hashfunktionen entwickelt, nicht nur für kryptologische Zwecke. Kryptologische Hashfunktionen sind beispielsweise MD5, SHA, Tiger, und viele andere. Achtung: Hashfunktionen wie hier definiert haben eine endlichen Wertebereich. Davon zu unterscheiden sind die “kryptografischen Hashfunktionen” mit unendlichem Wertebereich, siehe z.B. Hauck Script. Kollisionsresistenz Hashfunktion h {0,1}* (alle bitstrings) {0,1}s (bitstrings der Länge s, z.B. s=160) Einwegfunktions-Eigenschaft: Es ist praktisch unmöglich, zu einem gegebenen Ausgabewert einen Eingabewert zu finden, der auf diesen Ausgabewert abgebildet wird. Schwache Kollisionsresistenz: es ist praktisch unmöglich, für einen gegebenen Eingabewert einen davon verschiedenen zu finden, der denselben Hashwert ergibt. Starke Kollisionsresistenz: es ist praktisch unmöglich, zwei verschiedene Eingabewerte zu finden, die denselben Hashwert ergeben. stark kollisionsresistent → schwach kollisionsresistent SHA1 Hashfunktion SHA1 bildet jeden bitstring (bis Länge 264) (in Blöcken von 512 bits) auf einen 160 bit langen bitstring ab. Rechts der Pseudocode (Quelle Wikipedia) Motto: „wildes iteriertes Shiften, XORen und Addieren“ (genau das sollte man von einem HashAlgorithmus erwarten) // Initialisiere die Variablen: var int h0 := 0x67452301 var int h1 := 0xEFCDAB89 var int h2 := 0x98BADCFE var int h3 := 0x10325476 var int h4 := 0xC3D2E1F0 // Vorbereitung der Nachricht 'message': var int message_laenge := bit_length(message) erweitere message um bit "1" erweitere message um bits "0" bis Länge von message in bits ≡ 448 (mod 512) erweitere message um message_laenge als 64-Bit big-endian Integer // Verarbeite die Nachricht in aufeinander folgenden 512-Bit-Blöcken: für alle 512-Bit Block von message unterteile Block in 16 32-bit big-endian Worte w(i), 0 ≤ i ≤ 15 // Erweitere die 16 32-Bit-Worte auf 80 32-Bit-Worte: für alle i von 16 bis 79 w(i) := (w(i-3) xor w(i-8) xor w(i-14) xor w(i-16)) leftrotate 1 // Initialisiere den Hash-Wert für diesen Block: var int a := h0 var int b := h1 var int c := h2 var int d := h3 var int e := h4 // Hauptschleife: für alle i von 0 bis 79 wenn 0 ≤ i ≤ 19 dann f := (b and c) or ((not b) and d) k := 0x5A827999 sonst wenn 20 ≤ i ≤ 39 dann f := b xor c xor d k := 0x6ED9EBA1 sonst wenn 40 ≤ i ≤ 59 dann f := (b and c) or (b and d) or (c and d) k := 0x8F1BBCDC sonst wenn 60 ≤ i ≤ 79 dann f := b xor c xor d k := 0xCA62C1D6 wenn_ende temp := (a leftrotate 5) + f + e + k + w(i) e := d d := c c := b leftrotate 30 b := a a := temp // Addiere den Hash-Wert des Blocks zur Summe der vorherigen Hashes: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d h4 := h4 + e digest = hash = h0 append h1 append h2 append h3 append h4 //(Darstellung als big-endian) SHA1 SHA1: block-weise Verarbeitung Input x 512 bits 160 bits konstante Werte SHA1 Block 512 bits SHA1 Block Auffüllung mit bits 1000...000 64 bits Länge von x (binär) 512 bits SHA1 Block SHA1 Block Output = h(x) 160 bits Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 16 Anwendungen Hashing Anwendung Hashing: Gehashte Passwörter Das Benutzername/Passwort Verfahren (Faktor Wissen) ist mit weitem Abstand das gängigste Authentisierungsverfahren, insbesondere im Internet, aber auch in lokalen Netzen. Passwörter können bei der Übertragung abgehört werden, insbesondere bei der Eingabe auf dem Endgerät (Keylogger) – dort ist praktisch keine Abwehr möglich (zumindest nicht ohne einen weiteren Faktor Haben). Bei der Übertragung durch das Netz zum Server schützt aber die Verschlüsselung der Sitzung (TLS/https, siehe AbschnittZertifikate). Um sich gegen Diebstahl der Identitäten (=Benutzername+Passwort) beim Server zu schützen, werden die Passwörter beim Server fast überall gehasht abgespeichert (Defintion hashen ein paar Folien später). So muss der Dieb der Passwort-Datei die Passwörter zumindest ent-hashen, was bei guten Passwörtern (zufällig gewählt und aktuell so ab Länge 10) schwer bis unmöglich ist. Für die Überprüfung des vom Benutzer eingegebenen Passworts reicht dem Server die Speicherung des Hashwerts, denn das aktuell empfangene Passwort wird gehasht und dann mit dem gespeicherten Hashwert verglichen. Um die Verwendung von Tabellen mit hash(Passwort)-->Passwort (sog. rainbow tables) zu vemeiden, wird oft ein “Salz” s vor dem Hashen des Passworts hinzugefügt, also z.B. hash(s|Passwort). Das Salz kann für alle User das gleiche sein, aber auch für jeden User verschieden, z.B. der Benutzername. Ein wirksamer Schutz gegen das Enthashen von zu kurzen/einfachen Passwörtern ist auch das Salz nicht. Anwendung Hashing: Challenge/Response Verfahren c c Login r r Der Authentisierungs-Server produziert ein nur kurzfristig geltendes Zufallswort (challenge) und es schickt über das Netz zum Endgerät, z.B Kartenlesegerät. Der Benutzer hält seine Karte an das Lesegerät. Die challenge wird von der Karte gelesen und mit dem gespeicherten Schlüssel verschlüsselt. Der Output, auch response genannt, wird an das Kartenlesegerät zurückgegeben, und dieses schickt die response an den Server. Der Server, der auch den Schlüssel gespeichert hat, vergleicht die response mit seinem Verschlüsselsergebnis und gibt bei Übereinstimmung den Zugang frei. Der Schlüssel wird nicht preisgegeben, der Server kann aber dennoch eindeutig (bis auf die Ratewahrscheinlichkeit, abhängig von der response-Länge) bestimmen, ob sich der Kartenbesitzer authentisiert hat. Das Verfahren ist auch mit assymmetrischen Schlüsseln möglich. Wegen der Rechenressourcen-Belastung sollte aber vorzugsweise mit einer Hash-Funktion anstatt einer Verschlüsselungsfunktion gearbeitet werden: Die Eingabe für die Berechnung des Hashwerts (=response) ist dabei eine Konkatenation kc des Schlüssels k und der challenge c. Verschlüsselung statt Hashen ist over-engineered: die Entschlüsselbarkeit bringt nichts, kostet aber meistens mehr Rechenressourcen, asymmetrische Verschlüsselung am meisten. Aber Vorteil asymmetrische Verschlüsselung: Nachweisbarkeit des Authentisierungs-Vorgangs von Seite des Servers. Anwendung Hashing: Pseudo-Random-Folge Wie erzeugt man mit einer Hashfunktion h aus wenigen bits Zufall beliebig viele bits Pseudozufall? ? r 128 bits Zufall Die folgende Konstruktion muss in jedem bit zufällig aussehen (ansonsten hat die Hashfunktion h ein Problem): praktisch beliebig lang h(r,0) h(r,1) h(r,2) h(r,0) r 0 h(r,3) h(r,1) r 1 h(r,4) alternativ: h(r) h(r,h(r)) h(r,h(r,h(r))) … falsch: h(r) h(h(r)) h(h(h(r))) … Signieren via Hashfunktion Sei h eine Hashfunktion. Gegeben sei ein Sender A und Empfänger B, die eine gemeinsames geheimes Wort k ausgetauscht haben. k wird auch hier oft Schlüssel genannt, auch wenn mit k gar verschlüsselt werden wird („seed“ ist besserer Name dafür). 1. Der Sender berechnet den Hashwert h = h(kN) der Konkatention von k und der Nachricht N, und schickt <N,h> an B. k A <N,h(kN)> B prüft beim Empfang die mitgeschickten Hashwert h dahingehend, ob h = h(kN). Die Nachricht kann von Dritten praktisch nicht gefälscht werden. B k HMAC Symmetrische Signatur (MAC Message Authentication Code) A m, H(K|m) K B K - wenn K mit der Blocklänge der Hashfunktion H inferiert könnte es Probleme geben - z.B. wenn H nicht das Ende der Eingabe absichert, könnte ein Angreifer H(K|m|y) für jedes my berechnen Auch wenn diese Probleme für z.B. H = SHA1 nicht direkt gegeben sind, macht man trotzdem eine Absicherung mit folgender Grundidee: Anstatt H(K|m) als MAC nimm man H(K|H(K|m)) (“HMAC”): HMAC(K,m) = H(K'+opad| H(K'+ipad|m)) K' := K von links mit 0'en gepadded opad ist die konstante Blockauffüllung 0x5c5c...5c ipad ist die konstante Blockauffüllung 0x3636...36 + ist EXOR Das ist eine Art Standard, auch für MACs mit SHA1. Nachteil: 2 mal H ausführen Online Banking: Signieren via Hashfunktion Beispiel: Display-TAN der Univ. Tübingen k k k k k A N = <nonce~Konto~Betrag> A 1. Berechnung TAN' = h(kN) 2. Vergleich TAN = TAN' ? TAN = h(kN) B B k Berechnung h(kN) k Es wird bei Display-TAN tatsächlich ein HMAC mit SHA1 verwendet - der 160 bit Hashwert wird dann noch deterministisch gekürzt auf 8 Ziffern (OCRA RFC-Standard). Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 17 Quantencomputer, Postquantum Kryptographie Shor's Algorithmus (klassischer Teil) Shor's Algorithmus zur Faktorisierung - Teilalgorithmus (der Teil ohne Physik) Sei n = pq gegeben (p,q Primzahl). Jedes des phi(n) Elemente a aus Zn* hat eine Ordnung ord(a), nämlich die Größe der Menge {a, a2, ..., aord(a) = 1}. ord(a) muss phi(n) = (p-1)(q-1) teilen, weil es eine Untergruppe ist. Für 3/4 der a aus Zn* ist ord(a) gerade. Das kann man beweisen (Gruppentheorie) - man kann es sich plausibel machen dadurch, dass 2 ja schon zweimal als Teiler von phi(n) vorkommt und somit für viele Untergruppen ein Teiler ihrer Ordnung ist. Für max. ¼ der a aus Zn* gilt, dass a gerade Ordnung r hat und dabei ar/2 = -1 gilt. Insgesamt haben also mind 50% der Elemente a aus Zn* die Eigenschaft, dass die Ordnung von a gerade ist und ar/2 != -1 gilt. Wenn man zu so einem a die gerade Ordnung r = ord(a) bekommt, dann kann man n = pq faktorisieren (3. Binomische Formel) ar - 1 = (ar/2 - 1)(ar/2 + 1) ungleich 0 mod n wg. Def. von r: dann wäre ja schon bei r/2 ein Zyklus von a da auch ungleich 0 mod n, denn solche a hatten wir ausgeschlossen (nur ein ¼ aller a) n ist Teiler von ar – 1 wegen ar = 1 mod n <--> ar - 1 = 0 mod n. Weil aber beide Faktoren oben rechts ungleich 0 mod n sind, müssen die Teiler p und q von n sich auf die beiden Faktoren oben rechts verteilen. Damit kann man mit ggT(n, ar/2 – 1) (oder auch ggT(n, ar/2 + 1)) einen der zwei Primfaktoren finden. a ai mod 21 ord gerade ar/2 != -1=20 1 1 1 - 2 2, 4, 8, 16, 11, 1 6 + + + 3 - 4 4, 16, 1 3 - - - 5 5, 4, 20, 16, 17, 1 6 + - - 6 - 7 - 8 8,1 2 + + + 9 - 10 10, 12, 15, 13, 4, 19, 1 7 - 11 11, 16, 8, 4, 2, 1 6 + + + 12 - (113 – 1)(113 +1) = 7 * 9 (mod 21) 13 13, 1 2 + + + 14 - (13 – 1)(13 +1) = 12 *14 15 - 16 16, 4, 1 3 - + - 17 17, 16, 20, 4, 5, 1 6 + - - 18 - 19 19, 4, 13, 16, 10, 1 6 + + + 20 20,1 2 + - - beides - - Beispiel 21 = 3*7 (23 – 1)(23 +1) =7*9 (81 – 1)(81 +1) = 7 *9 (193 – 1)(193 +1) = 12 *14 (mod 21) Orakel Teilalgorithmus Mit einem “Orakel”, das einem zu einem Zn* und einem a die Ordnung ord(a) gäbe, wäre also der folgende probabilistische Algorithmus zur Faktorisierung von n erfolgreich, jedesmal mit 50%: Gegeben n= pq. 1. Rate ein a aus Zn; 2. Prüfe ob a in Zn* via ggT(a,n). Falls ggT > 1 ist Teiler gefunden --> fertig. 3. Lass Dir vom Orakel r = ord(a) geben 4. Wenn ord(a) nicht gerade ist oder ar/2 = -1, dann gehe zu 1 zurück 5. Ansonsten wird ggT(n,ar/2 -1) > 1 einen nicht-trivialen Teiler von n liefern. Physiker-Idee: Das Orakel könnte ein sog. Quanten-Computer sein. a n Qubits, Q Circuits, FourierTransform ord(a) Quantenrechner a r Qubits, Q Circuits, FourierTransform ord(r) 1) Initialize the registers. This initial state is a superposition of Q states. 2) Construct f(r) as a quantum function and apply it to the above state This is still a superposition of Q states. 3) Apply the quantum Fourier transform to the input register. 4) Perform measurements, and output with high probablity Post-Quantum Kryptographie Der Fortschritt bei den Quantencomputern ist bei genauer Betrachtung eher bescheiden (vor allem in der Extrapolation ernüchternd): 1996 stellt P. Shor den Quantencomputer-Faktorisierungsalgorithmus vor 2001 verkündet IBM, man habe die Zahl 15 mit einem Quantencomputer faktorisiert 2012 verkündet die Univ. Bristol, man habe die Zahl 21 mit einem Quantencomputer faktorisiert Deshalb/dennoch: Post-Quantum Kryptographie: Symmetric key Code-based cryptography Lattice-based cryptography Multivariate cryptography und viele andere mehr Hash-based cryptography Auch/vor allem aus dem Grund: Faktorisierung oder Diskr. Logarithmus könnte mathematisch gelöst werden (“indischer Doktorand” mit einer neuen Formel für die ganzen Zahlen...) Basierend auf Schwierigkeit von math. Problemen, also so wie RSA, DH etc. Teilweise sind die math. Probleme NP-hart, was verdächtig ist, denn bislang haben sich alle auf NP-harten Problemen basierenden Verfahren als unbrauchbar erwiesen. Hoffnungsträger, weil nicht auf math. Annahmen basierend. Nachteile: 1. große Schlüssel mit dynamischer Verwaltung nötig. 2. nur Signieren und Authentisieren möglich, Verschlüsseln nicht. Forward secrecy (als Eigenschaft eine Verschlüsselungsverfahrens): Auch wenn das Verfahren gebrochen wird, können die verschlüsselten Nachrichten der Vergangenheit nicht entschlüsselt werden. Weak forward secrecy: Wenn das Verfahren gebrochen wird, können die verschlüsselten Nachrichten aus der Vergangenheit nur dann entschlüsselt werden, wenn beim Versenden der Nachricht schon aktiv/vorbereitend abgehört wurde. Lamport One-Time PKI Schlüsselerzeugung. A erzeugt 2n zufällige Strings s1,0,s1,1, s2,0,s2,1, …, sn,0, sn,1 - alle von einer gewissen Länge l. Diese geordnete Liste (s1,0,s1,1, s2,0,s2,1, …, sn,0, sn,1) ist kpriv. Mit einer Hash-Funktion h erzeugt A die 2n Hashwerte h1,0= h(s1,0),h1,1= h(s1,1), …, hn,1= h(sn,1), die alle Strings einer Länge m sind. Diese geordnete Liste (h1,0,h1,1, h2,0,h2,1, …, hn,0, hn,1) ist kpub. Alice Bob Kpriv Kpub B kann jetzt B einen Text a = a1...an der Länge n (die ai sind bits) an A schicken und sich von A signieren lassen. Das macht A, indem er den string c = c1...cn der Länge n*m erzeugt, wobei der substring ci = si,ai ist (d.h., ci ist entweder si,0 oder si,1 , je nachdem,ob ai 0 oder 1 ist). B kann nachprüfen, ob die Signatur korrekt ist, denn er berechnet, ob für alle i gilt h(si,ai) = ci . Niemand anders als A kann aber die h-Ur-Werte der ci gewusst oder berechnet haben. Also hat A die Nachricht tatsächlich signiert. Die Signatur ist nicht abstreitbar. Nachteile: 1. Nur Signatur und Authentication, aber keine Verschlüsselung möglich. 2. Wie beim One-Time-Pad ist der Schlüssel nur einmal verwendbar → viel Speicherplatz für kpub Vorteil: Dieses PKI baut nicht auf der Schwierigkeit eines mathematischen Problems auf (und wäre damit ein Kandidat für den Ersatz für RSA etc. im Ernstfall “Postquantum Kryptographie”). Merkle-Tree Signature Lamport One-time Signature kpub kpriv H1= h(P1) H2 = h(P2) P2 P1 H3 = h(P3) P3 H1,2,3,4 = h(H1,2|H3,4) H1,2 = h(H1|H2) P1 P4 Vorteil gegenüber Lamport: öffentl. Schlüssel kpub ist klein. Merkle-Tree One-time Signature H1= h(P1) H4 = h(P4) = kpub H3,4 = h(H3|H4) H2 = h(P2) P2 H3 = h(P3) P3 H4 = h(P4) P4 = kpriv Merkle-Tree Verfikation H1,2,3,4 = h(H1,2|H3,4) H1,2 = h(H1|H2) H3,4 = h(H3|H4) von rechts von links H1= h(P1) P1 H2 = h(P2) H3 = h(P3) P2 P3 H4 = h(P4) P4 Das bit “1” wird mit dem ersten Blatt-Paar signiert. Weil das bit 1 ist, wird das rechte Blatt P2 genommen. (links/rechts ist ein flag, damit der Verifizierer weiß, von Die Signatur ist: <P2, H1 links, H3,4 rechts> welcher Seite dieser Hash-wert konkateniert werden muss) Der Verfizierer prüft: 1. berechne H2 = h(P2) 2. berechne H1,2 = h(H1|H2) 3. berechne H1,2,3,4 = h(H1,2|H3,4) 4. wenn H1,2,3,4 = kpub, dann ist die Signatur in Ordnung. Warum kann niemand anderes eine gültige Signatur schicken? - niemand kann andere Werte als H1,2 und H3,4 angeben, so dass kpub = H1,2,3,4 = h(H1,2|H3,4) - niemand kann andere Werte als H1 und H2 angeben, so dass H1,2 = h(H1|H2) - niemand anderes als der, der den privaten Schlüssel hat, kann ein P2 angeben, so dass h(P2) = H2 ist. könnte aber abgehört worden sein kann nicht abgehört worden sein – hier zum ersten Mal veröffentlicht Merkle-Tree mit pseudo-random Urwerten Verbesserung Merkle-Tree One-time Signature. H1,2,3,4 = h(H1,2|H3,4) H1,2 = h(H1|H2) H1= h(P1) = kpub H3,4 = h(H3|H4) H2 = h(P2) P1 P2 h <s|0> h <s|1> H3 = h(P3) P3 H4 = h(P4) P4 h h <s,2> <s,3> s = kurzes Geheimnis (“seed”) Vorteil: Auch der private Schlüssel reduziert sich praktisch auf ein kurzes Geheimnis s. Zwar muss am Anfang, d.h. zur Generierung des public key, der gesamte Baum aufgebaut und durchgerechnet werden, aber ab dann kann man durch entsprechende Baum-Verwaltung mit einem nur logarithmisch großen Teil des Baumes den Baum effektiv traversieren (nur ab zu und muss wieder gerechnet werden, in der Summe noch einmal der ganze Baum) Kryptologie Bernd Borchert Univ. Tübingen SS 2017 Vorlesung Teil 18 Geheimnisteilungsschemata Motivation Geheimnisteilungsschemata Geheimnisteilungsschema Geheimnis Schliessfach 652, PIN 290172 ASCII 11 ...............................01 Aufteilen in zwei zufällige Strings 01 ...............................10 10 ...............................11 Keiner der beiden Strings hat eine Information. Nur beide zusammen: 11 ...............................01 ASCII Schliessfach 652, PIN 290172 Beobachtung: Es würde reichen, zu wissen, wie man das für ein bit macht. Für Bit-Strings macht man es dann bitweise. Geheimnisteilungsschemata Ein bit i (0 oder 1) Information sei gegeben. Es soll so in zwei Teilgeheimnisse A und B aufgeteilt werden, dass keins der beiden Teilgeheimnisse allein etwas von der Information i preisgibt, aber beide zusammen i vollständig erschließen lassen. Lösung: A bekommt ein bit a gleichverteilt zufällig (Münzwurf), und B bekommt b = a EXOR i. 1. Warum kann man mit A und B zusammen auf i schließen? i = a EXOR b, denn a EXOR b = a EXOR a EXOR i = 0 EXOR i = i. 2. Warum kann man mit A allein nicht auf das Geheimnis i schließen? Weil a zufällig vergeben wurde und gar nichts über i enthält. 3. Warum kann man mit B allein nicht auf das Geheimnis i schließen? Folgende Argumentation ist die einfachste: Sei i=0. Dann ist die Wahrscheinlichkeit, dass b=0 ist, 50%, denn die Wahrscheinlichkeit, dass a=0 ist, ist 50%.(b = a EXOR i) Sei i=1. Dann ist die Wahrscheinlichkeit, dass b=0 ist, ebenfalls 50%, denn die Wahrscheinlichkeit, dass a=1 ist, ist 50%. Also ist die Wahrscheinlichkeit, dass b=0 ist, in beiden möglichen Fällen 50% (unabhängig von i). Also ist b gleichverteilt zufällig (so wie a). Also kann man mit b nicht auf i schließen. qed. Verbindung/Ähnlichkeit zum one-time-pad: Es ist quasi die umgekehrte Richtung: Es wird beim Geheimnisteilungsschema nicht b mit a zu i verschlüsselt, sondern es wird i in a und b zerlegt. Entsprechend wird ein BitString a = a1...ak aus {0,1}k durch k unabhängige Münzwürfe in zwei Teilgeheimnisse (beides bitstrings der Länge k) aufgeteilt, die jeweils keine Information über a preisgeben, aber die zusammen a vollständig rekonstruieren lassen. Dies sind 2-aus-2 Geheimnisteilungsschemata, als Spezialfall von m-aus-n Geheimnisteilungsschemata für m <= n. Definition davon: Es gibt n Teilgeheimnisse, m-1 Teilgeheimnisse geben nichts über das Geheimnis preis, aber m Teilgeheimnisse lassen das Geheimnis vollständig rekonstruieren. n-aus-n Geheimnisteilungsschema Ein bit b soll auf n Teilgeheimnisse verteilt werden: Dazu reicht ein bit bi für jedes Teilgeheimnis: n-1 Teilgeheimnisse b1, ..., bn-1 werden zufällig bestimmt. Das letzte Teilgeheimnis bnwird als EXOR(b1, ..., bn-1, b) bestimmt. Also kann b als EXOR(b1, ..., bn-1, bn) bestimmt werden, aber keine Teilmenge von n-1 oder weniger Teilgeheimnissen reicht alleine aus. Beweis: wie für n=2. Wörtern mit m bits können also für ein Geheimnisteilungsschema n-aus-n in n Teilgeheimnisse mit je m bits aufgeteilt werden. 2-aus-n Geheimnisteilungsschema Ein bit i soll auf 8 Teilgeheimnisse verteilt werden, so dass ein einzelnes Teilgeheimnis keine Information hat, aber aus 2 Teilgeheimnissen das bit i zu rekonstruieren ist. Dazu reichen 3 bits b1b2b3 für jedes Teilgeheimnis: Wenn das bit i = 0 ist, wird eine 3-bit Sequenz b1b2b3 geraten und jeder der 8 Teilnehmer bekommt das als Teilgeheimnis. Wenn das bit i = 1 ist, werden die 8 3-stelligen bit-Folgen den 8 Teilnehmern gleichverteilt zufällig zugeordnet. Aus einen Teilgeheimnis b1b2b3 kann also keine Information über i gewonnen werden. Aber aus 2 verschiedenen Teilgeheimnissen b1b2b3 und c1c2c3 kann man i rekonstruieren: wenn sie gleich sind, dann ist i = 0, und ansonsten ist i = 1. Wörtern mit m bits können also für ein Geheimnisteilungsschema 2-aus-2j in 2j Teilgeheimnisse mit je j.m bits aufgeteilt werden. Wenn n keine 2er-Potenz ist: Ein m-aus-n Geheimnisteilungsschema ist natürlich immer auch ein m-aus-k Geheimnisteilungsschema für alle k mit k>= m und k < n, indem man n-k Teilgeheimnisse „wegwirft“. Shamir Geheimnisteilungsschema Ein anderes Geheimnisteilungsschema ist das von Shamir 1979: Es nutzt das Phänomen, dass ein Polynom p(X) vom Grad n erst durch n+1 Punkte (x,p(x)) vollständig bestimmt ist. Mit anderen Worten: wenn n Punkte bekannt sind, ist das Polynom bzw. dessen Koeffizienten noch unbestimmt. Das Geheimnis ist also Polynom von Grad n bzw. ein gewisser Koeffizient davon (z.B. der erste für x0) und die n+1 Teilgeheimnisse sind n+1 verschiedene Punkte (x,p(x)). n dieser Punkte lassen noch nicht auf das Polynom bzw. dessen Koeffizient schließen, nur alle n+1 zusammen. Visuelle Kryptographie (2-aus-2 Schema) Originalbild v 1.Folie Teilgeheimnis 1 (Zufall) 2. Folie Teilgeheimnis 2 Rekonstruktion: übereinanderlegen