GIN1b – Exkurs: Primzahlen Prof. Dr. Wolfram Conen WS 04/05, 18.10.2004 Angenommen, Sie haben Geheimnisse... ... und wollen mit einer Bekannten EMails austauschen, ohne dass jemand deren Inhalt entziffern kann Für die Übertragung der Emails steht ihnen nur „normales“ SMTP und „normales“ POP zur Verfügung (d.h. alles geht im „Klartext“, also so, wie sie es verschicken, über das Internet) Anmerkung: Bei POP, dem Post-Office-Protokoll, mit dem die meisten Email-Programme ihre Post beim Server abholen, gilt das auch für ihr Passwort! Was tun Sie? Angenommen, Sie haben Geheimnisse... Eine gute Idee: Sie verschlüsseln ihre Nachrichten Nehmen wir an, Sie heißen Bob und ihre Gesprächspartnerin Alice Wie kriegen Sie es nun hin, dass sie gegenseitig ihre verschlüsselten Nachrichten lesen können? Erste Idee: Sie einigen sich auf EINEN „geheimen“ Schlüssel Nicht so toll: Sie wohnen in Gelsenkirchen, Alice in Australien...wie tauschen sie den geheimen Schlüssel „sicher“ aus? Das nennt man übrigens „symmetrische Verschlüsselung“ bzw. Private-Key-Kryptographie Angenommen, Sie haben Geheimnisse... Zweite Idee: Jeder von Ihnen hat ein Schlüsselpaar (m,m‘), nämlich mBOB,m‘BOB,mALICE,m‘ALICE Es gelte, dass eine Nachricht, die mit dem Schlüssel m verschlüsselt wird, NUR mit m‘ entschlüsselt werden kann UND UMGEKEHRT! Einen seiner Schlüssel hält jeder geheim Bob hält m_{BOB} geheim, Alice m_{ALICE} Die anderen Schlüssel schicken sich Bob und Alice „einfach so“ über‘s Internet, z.B. per Email Und nun? Angenommen, Sie haben Geheimnisse... Jetzt kann Bob Nachrichten an Alice mit ihrem öffentlichen Schlüssel verschlüsseln Er kann außerdem zuerst die Nachricht mit seinem geheimen Schlüssel verschlüsseln dann kommt sie wirklich von ihm! (mit Einschränkungen...) ...und Alice kann das Gleiche tun. Voila! Ihr Problem ist (fast) gelöst! Diese kann Alice dann mit ihrem geheimen Schlüssel entschlüsseln Das ist asymmetrische Verschlüsselung bzw. Public-Key-Kryptographie Sie ist leider deutlich langsamer, als „sichere“ symmetrische Verschlüsselungen Aber auch ziemlich universell, man kann sie auch für digitale Signaturen nutzen (Unterzeichnen von Dokumenten) Ein Problem zu Beginn bleibt allerdings hier noch: Ist Bob wirklich Bob und Alice wirklich Alice? Ein sogenannter „Man in the Middle“ könnte zu Beginn beide öffentlichen Schlüssel „einkassieren“ und jeweils eigene weiterleiten – er könnte (müßte) dann den kompletten EMail-Verkehr mitlesen ohne aufzufallen! ... Das klingt doch schon ganz gut, aber wie findet man solche Schlüsselpaare? Wie viele Primzahlen gibt es? Natürliche Zahlen: N = {0,1,2,3,4,...} Ganze Zahlen: Z = {...,-3,-2,-1,0,1,2,3,...} Primzahlen: P = {2,3,5,7,11,...} Primzahlen sind natürliche Zahlen größer als 1, die nur durch die 1 und sich selbst teilbar sind. Eigentlich müssten wir noch „teilen“ und „teilbar“ für natürliche Zahlen definieren Wie viele Primzahlen gibt es? Gegeben: eine beliebige endliche Menge P‘ = {p1,...,pr} von Primzahlen. es sei m = p1p2...pr und n = m+1 es sei p ein Primteiler von n Angenommen, p ∈ P‘. Dann wäre p ein Primteiler von m, denn es käme ja als Faktor in p1p2...p...pr vor. Also würde p sowohl n als auch m teilen Wenn eine Zahl z aber zwei Zahlen k1, k2 teilt, dann teilt sie auch die Differenz der beiden Zahlen: z.B. k1 = z*r1, k2 = z*r2, r1 < r2 ⇒ k2-k1 = (r2-r1)*z, etwa 15=3*5, 35=7*5, 20 = 35-15 = 4*5 = (7-3)*5 Unsere Differenz ist aber 1, d.h. p würde 1 teilen. p ist aber größer als 1...das ist also unmöglich! Also kann p nicht Element von P‘ sein! Beachten Sie, dass P‘ beliebig gewählt wurde – also kann es keine endliche Menge von Primzahlen geben, die alle Primzahlen enthält (denn mindestens unser p würde immer fehlen!) Dieser Beweis dafür, dass es unendlich viele Primzahlen gibt, stammt von Euklid (ein Grieche, der auch Vater der euklidischen Geometrie ist) Wie viele Primzahlen gibt es? Im Beweis werden einige Dinge verwendet: Die natürlichen Zahlen wachsen ins Unendliche Jede natürliche Zahl n ≥ 2 hat einen Primteiler Aus diesen beiden Tatsachen kann man auf viele verschiedene Arten folgern, dass P unendlich ist. Faktorisierung: Man kann jede natürliche Zahl auf eindeutige Weise als Produkt von Primzahlen (ihren Primfaktoren) darstellen (Fundamentalsatz der Arithmetik, erster vollständiger „moderner“ Beweis von Gauß): z.B. 2*3*7 = 35 Für Primzahlen besteht das Produkt nur aus der Zahl selbst Wie findet man Primzahlen? Sieb_des_Eratostenes(n): Zweck: Bestimmen der Primzahlen zwischen 2 und n. Eingabe: n ∈ N Lege eine Tabelle der Zahlen von 2 bis n an z←2 Solange z2 · n tue Falls die Zahl z in der Tabelle nicht durchgestrichen ist, gib z+“ist eine Primzahl“ aus Streiche jedes Vielfache von z in der Tabelle durch z ← z+1 Heute macht man das etwas effizienter. Wie findet man Primzahlen? Erst vor 2 Jahren fanden übrigens drei Inder (Agraval, Kayal, Saxena) einen deterministischen Test auf die Primzahleigenschaft, der „nur“ polynomialen Aufwand erfordert (allerdings in der Originalversion mit 12 potenziert) Mit diesem (und ähnlichen, oft probabilistischen Test) kann man für eine gegebene Zahl n prüfen, ob sie eine Primzahl ist oder nicht. Zurück zur Suche nach Schlüsselpaaren... Ron Rivest, Adi Shamir und Leonard Adleman entwarfen den RSA-Algorithmus Denken Sie daran: wir brauchen ein Schlüsselpaar! Zuerst wähle zwei Primzahlen p und q. Bestimme n = p*q Mti Hilfe dieses n finden wir gleich zwei Zahlen d und e, die gemeinsam mit dem „Modulus“ n die Schlüssel (d,n) und (e,n) bilden. Wie wird dann ver- und entschlüsselt? m soll verschlüsselt werden, m · n Chiffre c = me mod n (Chiffre bzw. Geheimtext) c entschlüsseln: m = cd mod n Das Ganze funktioniert dann, wenn med mod n = m Anmerkung: Hier wird die „Modulo“-Operation (% in Java) verwendet „Modulo“ gibt uns den ganzzahligen Rest einer Division, z.B. ist 3 mod 3 = 0, 4 mod 3 = 1, 5 mod 3 = 2, und wieder 6 mod 3 = 0 Wie finden wir aber nun diese beiden Zahlen d und e? Zurück zur Suche nach Schlüsselpaaren... Kleiner Satz von Fermat: Ist n prim und m kein Vielfaches von n (also insbesondere m < n), so gilt mn-1 mod n = 1 Beispiel: n = 7, m = 4, 46 = 4*4*4*4*4*4 = 642 = 212 = 4096 / 7 = 585 Rest 1 Verallgemeinerung von Euler: mTF(n) mod n = 1; hier ist TF(n) die Anzahl der Zahlen kleiner n, die keinen gemeinsamen Teiler > 1 haben. Wieviele zu n teilerfremde Zahlen < n gibt es nun? Sei n = 3*5 = 15, dann gibt es 8 teilerfremde Zahlen: 1,2,4,7,8,11,13,14 (die Eins zählt man mit...) Ist k eine Primzahl, so hat sie natürlich k-1 teilerfremde Zahlen (alle kleineren Zahlen) Unser n = p*q hat zwei Primfaktoren, was wissen wir dann über die Anzahl der teilerfremden Zahlen? In Frage kommen alle Zahlen kleiner als n, also (n-1) Zahlen. Davon müssen wir aber alle Vielfachen von p und alle Vielfachen von q abziehen (Beachte: Vielfache von p und q fallen natürlich erstmals bei n zusammen. Fände das vorher statt, wären p und q beides Primfaktoren dieser Zahl, diese müsste also mindestens p*q in ihrer Faktorzerlegung haben, wäre also mindestens so groß wie n) Beispiel: 21 = 3*7. 3,6,9,12,15,18 sind nicht teilerfremd zu 21 (also 7-1 = 6) und 7,14 (also 3-1 = 2), insgesamt also (21-1) – 6 – 2 = 12 (nämlich 1,2,4,5,8,10,11,13,16,17,19,20). Generell also (n-1) – (p-1)-(q-1) = (p*q-1)-(p-1)-(q-1) = p*q – p – q + 1 = (p-1)*(q-1) Da unsere n‘s immer so aussehen, ist die Anzahl teilerfremder Zahlen hier immer (p-1)*(q-1) = TF(n) Also gilt in unserem Fall m(p-1)(q-1) mod n = mTF(n) mod n = m Hilft uns das? Zurück zur Suche nach Schlüsselpaaren... Ja, denn wenn wir zwei Zahlen d und e so bestimmern, dass ed mod TF(n) = 1 gilt... (ed steht für e*d) ...dann können wir mit Hilfe der Sätze von Fermat, Fermat und einiger Rechnerei zeigen, dass tatsächlich med mod n = m gilt, denn mit ed mod TF(n) = 1 folgt ed = k*TF(n)+1 für ein k ∈ N Erinnerung: TF(n) = (p-q)(q-1) und n=pq Nach dem Satz von Euler gilt nun mk*TF(n)+1 mod n = m für alle m < n und k ∈ N (Obiger Satz modifiziert) e und n bilden den öffentlichen Schlüssel, d und n den privaten Schlüssel (p und q kann man jetzt „vernichten“) Es geht dann folgendes: Zur Erinnerung: c = me mod n ist das Chiffre cd mod n = (me mod n)d mod n = med mod n = mk*TF(n)+1 mod n = m Zurück zur Suche nach Schlüsselpaaren... Wie werden e und d bestimmt? Man kann e z.B. fest wählen, etwa die vierte Fermatzahl (eine Primzahl), 216+1 = 65537 d kann man nun z.B. mit dem erweiterten euklidischen Algorithmus bestimmen Wie funktioniert der „einfache“ Euklid? Eingabe Ausgabe: Methode: int ggt(int a, int b) { Zahlen a ∈ N0, b ∈ N Größter gemeinsamer Teiler ggt(a, b) if (b==0) return a; else return ggt(b, a%b); } Das Zeichen % steht in Java für die mod-Operation. Die Rekursion terminiert, da a mod b stets kleiner als b ist; der zweite Parameter der Funktion wird also irgendwann 0. (Den Algo und weitere Details finden Sie auf den informativen Seiten von H.W. Lang, Fh Flensburg) Zurück zur Suche nach Schlüsselpaaren... Beispiel: p = 7, q = 13, also n = 7*13 = 91 TF(91) = (7-1)(13-1) = 6*12 = 72 Zu 72 teilfremdes e wählen: 77 d bestimmen, so dass e*d mod 72 = 1 ist Umformen: x*72 + d*77 = 1 GGT von 72 und 77 ist 1, Bestimmung (mit Euklid) Und rückwärts: (mit „erweiterem“ Euklid) 77 mod 72 = 5 (77 = 1*72 + 5) 72 mod 5 = 2 (72 = 14*5 + 2) 5 mod 2 = 1 (5 = 2*2 + 1) 2 mod 1 = 0 (2 = 2*1 + 0) 1 = 5-2*2 = 5-2*(72-14*5) = -2*72 + (1+2*14)*5 = 29*5-2*72 =29*(77-72)-2*72 = 29*77 – 29*72 – 2*72 = 29*77-31*72 Unser d ist also 29. Kontrolle: 77*29 = 2233 = 2232 + 1 = 31*72 + 1 Zurück zur Suche nach Schlüsselpaaren... Beispiel: n = 91, e = 77 ist der öffentliche Schlüssel n = 91, d = 29 ist der geheime Schlüssel Unsere Nachricht sei nun m = 10 (muß · 91 sein) Chiffre c = me mod n = 1077 mod 91 = 82 Da muss man Modular-Arithmetik beherrschen, sonst werden die Zahlen schnell zu groß Und funktioniert auch unsere Entschlüsselung? Klartext m = cd mod n = 8229 mod 91 = 10 [Das kann man effizient rechnen! Wenn sie das jetzt schon wissen wollen, schauen Sie nach „Modularen Potenzen“ oder „Modulare Exponentiation“] Zurück zur Suche nach Schlüsselpaaren... Wesentlich für die Korrektheit des Verfahrens ist, dass med mod n = m gilt, s. oben Warum ist das Verfahren sicher? Es ist schwer, große Zahlen in Primfaktoren zu zerlegen (es ist zumindest noch kein effizientes Verfahren bekannt, sonst könnte man p und q bestimmen und damit aus e auch d!) Für große Schlüssel (>= 512 Bit) wird es „derzeit praktisch unmöglich“ Allerdings ist die Faktorisierung kein „anerkannt hartes Problem“, es konnte nicht gezeigt werden, dass es NP-komplett ist (was das ist, hören wir erst später) – vielleicht finden sie einen effizienten Algo? Schlußbetrachtung Über die Kryptographie findet die Mathematik (insbesondere die sogenannte Zahlentheorie) viele direkte Anwendungen in der Informatik Wenn Sie beginnen wollen, Public-Key-Kryptographie für ihre Emails zu verwenden, dann schauen sie hier: The International PGP Home Page (www.pgpi.org) Zu symmetrischer Kryptographie gibt es einen relativ neuen, öffentlichen US-Standard: AES. Infos zum Algo: Rijndeal Insgesamt ein spannendes Thema, zu dem man ein kleines bisschen wissen sollte – vielleicht schauen sie sich zu solchen Stichworten wie RSA, DES, AES usw. mal im Netz um. (RSA ist auch der Name einer wichtigen Kryptographiefirma, die unter anderem Wettbewerbe für das Brechen ihrer Codes ausschreibt: http://www.rsasecurity.com/rsalabs/node.asp?id=2093 – wenn sie eine mit einem 2048-Bit-Schlüssel verschlüsselte Nachricht knacken, gibt es z.B. 200.000 US-$)