Stefan Lucks Diskrete Strukturen (WS 2009/10) 3: Zahlentheorie / Primzahlen 3: Zahlentheorie / Primzahlen – 96 – Stefan Lucks Diskrete Strukturen (WS 2009/10) – 97 – Definition 37 (Teiler, Vielfache, Primzahlen, zusammengesetzte Zahlen) Seien a, b ∈ N. a ist ein Teiler von b (“a|b”), falls es ein k ∈ N gibt mit a ∗ k = b. Die trivialen Teiler von b sind 1 und b. Ist a ein Teiler von b, dann ist b ein Vielfaches von a. X ∈ N heisst Primzahl, wenn X durch genau zwei natürliche Zahlen teilbar ist, nämlich die trivialen Teiler. Die Zahl X ∈ N heist zusammengesetzt, wenn X durch mehr als zwei natürliche Zahlen teilbar ist. Die 1 ist keine Primzahl. Für alle a, b, c ∈ N gilt: I I a|b ⇒ a|bc. Transitivität: a|b und b|c ⇒ a|c. 3: Zahlentheorie / Primzahlen Stefan Lucks Diskrete Strukturen (WS 2009/10) 3.1: Wichtige Ergebnisse der Zahlentheorie Chinesischer Restsatz (ohne Beweis) Seien m1 , . . . , mk : paarweise teilerfremde natürliche Zahlen, m = m1 ∗ · · · ∗ mk und a1 , . . . ak : ganze Zahlen. Für 1 ≤ i ≤ k gelte Mi = m/mi und yi = Mi−1 mod mi . Dann gilt für ! X x≡ ai yi Mi mod m : 1≤i≤k x ≡ a1 mod m1 , x ≡ a2 mod m2 , . . . , und x ≡ ak mod mk . 3: Zahlentheorie / Primzahlen 3.1: Wichtige Ergebnisse der Zahlentheorie – 98 – Stefan Lucks Diskrete Strukturen (WS 2009/10) – 99 – Folgerung 38 (Fingerabdrucksatz) Seien p, q teilerfremd, xp ∈ Zp , xq ∈ Zq . Dann gibt es genau ein x ∈ Zpq mit x ≡ xp (mod p) und x ≡ xq (mod q). (Folgt aus dem Chinesischen Restsatz) Satz 39 (Kleiner Satz von Fermat) Sind p eine Primzahl und a eine natürliche Zahl, dann gilt ap ≡ a (mod p). Ist p kein Teiler von a, gilt insbesondere ap−1 ≡ 1 (mod p). 3: Zahlentheorie / Primzahlen 3.1: Wichtige Ergebnisse der Zahlentheorie Stefan Lucks Diskrete Strukturen (WS 2009/10) 3.2: Anwendung: RSA (Public-Key Kryptographie und Digitale Unterschriften) I I I I Briefkasten Schaufenster Schloss mit zwei Schlüsseln In der modernen Kryptographie: I Erzeuge Gesamt-Schlüssel, bestehend aus I I I Verschicken einer vertraulichen Nachricht: I I I einem öffentlichen und einem geheimen Schlüssel(-teil) öffentliche Operation zum Verschlüsseln geheime Operation zum Entschlüsseln Digitales Unterschreiben einer Nachricht: I I geheime Operation zum Erzeugen einer Signatur öffentliche Operation zum Verifizieren der Signatur 3: Zahlentheorie / Primzahlen 3.2: Anwendung: RSA – 100 – Stefan Lucks Diskrete Strukturen (WS 2009/10) PK Kryptographie (Geschichte) ca. 1971 Ein Mitarbeiter des britischen Geheimdienstes erfindet die “non-secret” Kryptographie (wurde bis Ende der 90-er Jahre geheim gehalten) 1974 „Merkle Puzzles“ 1976 Diffie und Hellman 1977 Rivest, Shamir, Adleman (RSA) seit ≈ 1990 zunehmende kommerzielle Bedeutung der asymmetrischen Kryptographie 3: Zahlentheorie / Primzahlen 3.2: Anwendung: RSA – 101 – Stefan Lucks Diskrete Strukturen (WS 2009/10) Das RSA Kryptosystem I Schlüsselerzeugung: 1. Wähle zufällig große Primzahlen p und q; 2. berechne n = pq und ϕ(n) = (p − 1)(q − 1); 3. wähle e ∈ Z∗ϕ(n) , d.h., ggT(e, ϕ(n)) = 1; berechne d mit ed ≡ 1 mod ϕ(n); 4. Schlüssel: Tripel (e, d, n); davon öffentlich: (e, n). I Öffentliche Operation E (“encrypt”): (Z.B. Verschlüsseln einer Nachricht: x ∈ Zn ) E(e,n) (x) = xe mod n. I Geheime Operation D (“decrypt”): D(e,d,n) (y) = yd mod n 3: Zahlentheorie / Primzahlen 3.2: Anwendung: RSA – 102 – Stefan Lucks Diskrete Strukturen (WS 2009/10) Ein Beispiel in kleinen Zahlen I I I I I Wir wählen p = 13, q = 11 und berechnen n = pq = 143. Es ist ϕ(n) = (p − 1)(q − 1) = 120. Wir wählen e = 7; insbesondere: ggT(7, 120) = 1. Für d = 103 gilt: ed = 721 = 6 ∗ 120 + 1 ≡ 1 mod 120. (Man kann d mit Hilfe des Erweiterten Euklidischen Algorithmus berechnen.) Verschlüsseln des Klartextes 5: E(5) ≡ 57 ≡ 78127 ≡ 47 mod 143. I Entschlüsseln von 47: D(47) ≡ 47103 ≡ 5 mod 143. 3: Zahlentheorie / Primzahlen 3.2: Anwendung: RSA – 103 – Stefan Lucks Diskrete Strukturen (WS 2009/10) – 104 – Die Korrektheit des RSA Kryptosystems I I Wenn ich eine Nachricht verschlüssele und dann wieder entschlüssele, erwarte ich, dass ich wieder die gleiche Nachricht erhalte. Signieren analog: Sei S = D(M) die Unterschrift unter eine Nachricht M. Wir verifizieren eine unterschriebene Nachricht (M, S), indem wir E(S) = M überprüfen. Satz 40 (Korrektheit von RSA) Für alle x ∈ Zn gilt: D(e,d,n) (E(e,n) (x)) = x und E(e,n) (D(e,d,n) (x)) = x. (Mit Hilfe des kleinen Satzes von Fermat.) 3: Zahlentheorie / Primzahlen 3.2: Anwendung: RSA Stefan Lucks Diskrete Strukturen (WS 2009/10) – 105 – Effizienz und Sicherheit von RSA Sicherheit: Man kennt keinen effizienten Algorithmus, um geeignet gewählte große zusammengesetzte Zahlen zu faktorisieren. Effizienz: Man kennt effiziente Algorithmen, um zufällig große Primzahlen zu erzeugen. 3: Zahlentheorie / Primzahlen 3.2: Anwendung: RSA Stefan Lucks Diskrete Strukturen (WS 2009/10) – 106 – 3.3: Faktorisieren & Primzahlen finden Primzahl testen: Gegeben eine Zahl n. Ist n prim? Primzahlen finden: Gegeben Werte a und B mit a < B − 1. Finde eine zufällige Primzahl p mit p ≥ a und p < B. (Typisch: a = 2n , B = 2a = 2n+1 .) Faktorisieren: Gegeben eine Zahl n, die nicht prim ist. Finde einen Teiler a|n, 1 < a < n. Vollständiges Faktorisieren: Gegeben eine Zahl n. Finde alle Primteiler von n. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) – 107 – Faktorisierung großer ganzer Zahlen Das Faktorisieren großer ganzer Zahlen gilt als extrem schwierig. Dies überrascht, da die Multiplikation und sogar der Primzahltest vergleichsweise einfach sind. Anekdote: Frank Cole widerlegt 1903 eine fast 200 Jahre alte Vermutung von Mersenne: Obwohl er die Sonntage dreier Jahre benötigte, um die Faktoren von 267 − 1 zu finden, konnte er innerhalb weniger Minuten, ohne weitere Worte darüber zu verlieren, ein großes Publikum davon überzeugen, dass diese Zahl keine Primzahl war, indem er einfach die Arithmetik der Berechnungen aufschrieb: 267 − 1 = 193707721 ∗ 761838257287. Stand der Forschung: Ist n das Produkt zweier zufälliger 1000-bit Primzahlen, kennt man keinen Algorithmus, um n innerhalb einiger Jahrhunderte zu faktorisieren. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) Primzahlen finden Aufgabe: Gegeben Werte a und B mit a < B − 1. Finde eine zufällige Primzahl p mit p ≥ a und p < B. (Typisch: a = 2n , B = 2a = 2n+1 .) Lösung: Wiederhole: 1. wähle eine Zufallszahl z ∈ {a, . . . B − 1}, 2. teste, ob z prim ist oder zusammengesetzt, bis z eine Primzahl ist. Gib z aus. Frage: Wie effizient ist dieses Verfahren? I Wie oft wird die Schleife durchlaufen? (Häufigkeit der Primzahlen) I Kann man effizient testen, ob z eine Primzahl ist? 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden – 108 – Stefan Lucks Diskrete Strukturen (WS 2009/10) Wie viele Primzahlen gibt es? Satz Es gibt unendlich viele Primzahlen. (Haben wir bewiesen!) Das reicht uns nicht! Wir wollen das genauer wissen! Wir schreiben π(x) für die Anzahl der Primzahlen ≤ x. Bsp.: π(1) = 0, π(3) = 2 = π(4) = 2, . . . , π(124) = 30. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden – 109 – Stefan Lucks Diskrete Strukturen (WS 2009/10) Wie viele Primzahlen gibt es? (Genauer) Satz 41 (Primzahlsatz (Ohne Beweis)) Sei π(x) die Anzahl Primzahlen ≤ x. Für alle x ≥ 17 gilt: x x <π(x)<1.255006 ∗ . ln x ln x Für Informatiker, die gerne zur Basis 2 logarithmieren, folgt 0.69 ∗ 3: Zahlentheorie / Primzahlen x x <π(x)<0.88 ∗ . log2 x log2 x 3.3: Faktorisieren & Primzahlen finden – 110 – Stefan Lucks Diskrete Strukturen (WS 2009/10) – 111 – Primzahlen testen I I I I Schön, dass es “genug” Primzahlen gibt. Aber wenn wir nicht effizient faktorisieren können, wie können wir dann effizient feststellen, ob eine Zahl prim ist? Es gibt effiziente probabilistische Primzahltests (z.B. “Miller-Rabin”), die wir in dieser Vorlesung aber nicht genauer analysieren werden. Das Grundidee können wir aber einem “alten Bekannten” abschauen, dem kleinen Satz von Fermat. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) – 112 – Primzahl-Test mit dem Kleinen Fermat Fermat-Zeugen und Lügner Sei ein ungerader Primzahlkandidat n gegeben. Wir bezeichnen eine natürliche Zahl a < n als Zeugen dafür, dass n nicht prim ist, wenn die folgende Ungleichung gilt: an−1 6≡ 1 (mod n) Ist n zusammengesetzt und gilt trotzdem an−1 ≡ 1 (mod n), dann nennen wir a einen Fermat-Lügner. Ist n > 1, dann sind 1 und n − 1 triviale Fermat-Lügner. (1 ist klar – aber warum eigentlich lügt n − 1?) 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) Der Fermat-Test Fermat-Test mit k Wiederholungen Eingabe n > 3. 1. wähle zufällig a1 , . . . ak ∈ {2, . . . n − 2} 2. und berechne bi := ain−1 mod n. Ist eines der bi 6= 1, dann gib “ganz sicher zusammengesetzt” aus. Sonst gib “vermutlich prim” aus. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden – 113 – Stefan Lucks Diskrete Strukturen (WS 2009/10) – 114 – Teilerfremdheit und Fermat-Zeugen I I Ist an−1 ≡ 1 (mod n), dann ist a ∗ an−2 ≡ 1, also ist an−2 das multiplikative Inverse von a mod n. Folgerung: Wenn a < n und n nicht teilerfremd sind, dann 1. ist n nicht prim und 2. kann a kein Fermat-Lügner sein. I Anders ausgedrückt: Es gibt “Kronzeugen” a < n mit ggT(a, n) > 1. Alle Kronzeugen sind Fermat-Zeugen. Aber wenn man einen Kronzeugen hat, kann man n auch ohne Fermat-Test als zusammengesetzt entlarven. . . . Die Berechnung des ggT reicht vollkommen . . . Definition 42 Sei n eine zusammengesetzte Zahl. Wir nennen einen Zeugen a < n normal, wenn ggT(a, n) = 1 gilt. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) Erfolgswahrscheinlichkeit Satz 43 (Ohne Beweis) Ist n ≥ 3 ungerade und zusammengesetzt, und gibt es mindestens einen normalen Fermat-Zeugen für n, dann sind mehr als die Hälfte aller Zahlen in {2, . . . , n − 2} Fermat-Zeugen. (Der Beweis ist nicht schwierig, braucht aber doch mehr mathematische Werkzeuge, als wir im Moment kennen.) Folgerung 44 Ist n ≥ 3 ungerade und zusammengesetzt, und gibt es mindestens einen normalen Fermat-Zeugen für n, dann ist die Wahrscheinlichkeit, dass der Fermat-Test mit k Wiederholungen fälschlich “vermutlich prim” ausgibt, < 1/2k . 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden – 115 – Stefan Lucks Diskrete Strukturen (WS 2009/10) Beispiele (k = 2, a1 = 2 und a2 = 3) I Es ist 214 ≡ 4 (mod 15), also ist 15 keine Primzahl. I Es ist 212 ≡ 1 (mod 13). Und es ist 312 ≡ 1 (mod 13). Vermutlich ist 13 prim. I Es ist 21104 ≡ 1 (mod 1105). Und es ist 31104 ≡ 1 (mod 1105). Vermutlich ist 1105 prim. Falsch! Die Zahl ist nicht prim: 1105 = 5 ∗ 13 ∗ 17. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden – 116 – Stefan Lucks Diskrete Strukturen (WS 2009/10) – 117 – Gibt es perfekte Verbrecher? Gibt es ungerade zusammengesetzte Zahlen, für die keine normalen Fermat-Zeugen existieren? Leider ja: Definition 45 Eine Carmichael-Zahl ist eine zusammengesetzte natürliche Zahl c, wenn für alle zu c teilerfremden a < n gilt: ac−1 ≡ 1 (mod c). Die kleinste Carmichael-Zahl ist 561 = 3 ∗ 11 ∗ 17. (Sie wurde 1910 von R. D. Carmichael gefunden.) Es gibt unendlich viele Carmichael-Zahlen. (Das wurde lange vermutet, aber erst nach 1990 bewiesen.) (Wir verzichten auf den Beweis.) 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) – 118 – Primzahlsuche in der Praxis I I I Statt des Fermat-Tests verwendet man meistens eine Weiterentwicklung, den Primzahltest von Miller und Rabin. Ein Durchlauf des Miller-Rabin-Tests kann jede zusammengesetzte Zahl n mit mindestens der Wahrscheinlichkeit 3/4 entlarven – selbst wenn n eine Carmichael-Zahl sein sollte. Um die Primzahl-Suche effizienter zu gestalten: I I Teste zuerst Teilbarkeit durch kleine Primzahlen (z.B., durch alle Primzahlen < 1000). Wende den eigentlichen Primzahltest nur auf die übriggebliebenen Primzahlkandidaten an. 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden Stefan Lucks Diskrete Strukturen (WS 2009/10) – 119 – Eine besondere Klasse von Algorithmen http://de.wikipedia.org/wiki/Randomisierter_Algorithmus: Ein randomisierter Algorithmus (auch stochastischer oder probabilistischer Algorithmus) verwendet – im Gegensatz zu einem deterministischen Algorithmus – Zufallsbits um seinen Ablauf zu steuern. Es wird nicht verlangt, dass ein randomisierter Algorithmus immer effizient eine richtige Lösung findet. Randomisierte Algorithmen sind in vielen Fällen einfacher zu verstehen, einfacher zu implementieren und effizienter als deterministische Algorithmen für dasselbe Problem. Sind der Fermat- bzw. der Miller-Rabin-Test Las-Vegas oder Monte-Carlo Algorithmen? Lesen Sie nach bei Wikipedia! 3: Zahlentheorie / Primzahlen 3.3: Faktorisieren & Primzahlen finden