Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 1 von 11 Primzahlen. In der modernen Kryptologie spielen (insbesondere "große") Primzahlen eine zentrale Rolle. Dabei stehen die folgenden zwei Fragen im Vordergrund: 1. Wie findet man eine große Primzahl in einem gegebenen Bereich ? 2. Wie erkennt man, ob eine gegebene große Zahl eine Primzahl ist ? Das älteste allgemein bekannte Verfahren um festzustellen, welche Zahlen unterhalb einer gegebenen natürlichen Zahl N prim sind, ist das "Sieb des Eratosthenes". Es basiert auf der Idee, aus der anfangs betrachteten Menge M = { n | n N, n>1 und n N } beginnend mit n = 2 alle (echten) Vielfachen von n zu entfernen und dieses Verfahren iterativ mit dem nächsten, nicht gestrichenen n so lange fortzusetzen, bis die Menge M durchlaufen ist. Die dann verbleibende Restmenge enthält genau alle Primzahlen zwischen 2 und N . Der Sieb-Algorithmus kann nur zur Bestimmung aller Primzahlen unterhalb einer gegebenen natürlichen Zahl N benutzt werden; es sei denn, man verwendet als Initialisierung eine Tabelle aller bereits bekannten Primzahlen unterhalb eines gewissen N1 < N . In diesem Falle lassen sich natürlich auch alle Primzahlen zwischen N1 und N ermitteln. Um den Aufwand abzuschätzen, der benötigt wird, um nach diesem Konzept von einer "grossen" Zahl festzustellen, ob sie prim ist, kann man den Primzahlsatz verwenden, der hier ohne Beweis angegeben wird: Satz 3a.1 (Primzahlsatz): Für die Anzahl (N) der Primzahlen unterhalb einer natürlichen Zahl N gilt asymptotisch (also für N ): ( N ) N N . ln N Der Aufwand zur Bestimmung einer neuen Primzahl mit dem Sieb-Algorithmus ist proportional der Anzahl der bereits gefundenen Primzahlen, und daher, wie der Primzahlsatz zeigt, zur Bestimmung "großer" Primzahlen nicht geeignet. Hierfür werden "Primzahltests" verwendet. Ein Primzahltest ist ein Test darauf, daß eine vorgelegte natürliche Zahl keine Primzahl ist: Wenn eine Zahl N einen Primzahltest "besteht", dann kann N eine Primzahl sein; wenn N eine ganze Reihe von Primzahltests besteht, dann ist N sehr wahrscheinlich eine Primzahl. Besteht N andererseits einen einzigen Primzahltest nicht, dann ist N definitiv zusammengesetzt. Damit wird jedoch die Frage nach den Primfaktoren von N nicht beantwortet. Im allgemeinen ist es sehr viel aufwendiger, Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 2 von 11 eine große Zahl zu faktorisieren, wenn man weiß, daß sie zusammengesetzt ist, als eine Primzahl der gleichen Größenordnung zu finden (dies ist kein Satz, sondern eine empirische Feststellung: Die Sicherheit des RSA-Systems beruht auf der Annahme, daß es viel einfacher ist, zwei große Primzahlen p und q zu finden, als die Zahl n = p*q zu faktorisieren). Der erste, hier vorgestellte Primzahltest beruht auf dem (kleinen) Satz von FERMAT: Wenn p eine Primzahl ist, dann gilt für jedes b mit ggT(b,p) = 1, daß b p-1 1 mod p (*) ist. Wenn p keine Primzahl ist, dann ist es möglich (aber nicht sehr wahrscheinlich), daß (*) ebenfalls gilt (z.B. sind im Bereich 3 n < 2000 nur die Zahlen 341, 561, 645, 1105, 1387, 1729 und 1905 Pseudoprimzahlen zur Basis 2 und die Zahlen 91, 121, 671, 703, 949, 1105, 1541, 1729 und 1891 Pseudoprimzahlen zur Basis 3). Falls jedoch für eine Zahl p mit einem einzigen teilerfremden b die Relation (*) nicht gilt, dann ist p mit Sicherheit zusammengesetzt. Dies führt zu der Definition 3a.2: Eine ungerade zusammengesetzte Zahl p, die für eine teilerfremde Basis b die Relation (*) erfüllt, heißt Pseudoprimzahl zur Basis b . (Eine Pseudoprimzahl ist also eine Zahl, die durch Erfüllen der Relation "vorgibt", eine Primzahl zu sein.) (*) Beispiel: Die Zahl 91 = 7 13 ist Pseudoprimzahl zur Basis 3 (390 mod 91 = 1) , nicht aber zur Basis 2 (290 mod 91 = 64 1). Leider gibt es – wenn auch sehr vereinzelt – zusammengesetzte Zahlen, die Pseudoprimzahlen zu jeder erlaubten Basis sind: Definition 3a.3: Eine zusammengesetzte Zahl, die zu jeder erlaubten Basis Pseudoprimzahl ist, heißt Carmichael-Zahl (die kleinste Carmichael-Zahl ist 561 = 3 11 17; auch die Zahlen 1105 = 5 13 17 und 1729 = 7 13 19, von denen wir oben gesehen haben, daß sie Pseudoprimzahlen zu den Basen 2 und 3 sind, sind beispielsweise CarmichaelZahlen). Die ersten zehn davon sind 561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841 und 29341. Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 3 von 11 Es ist nicht bekannt, ob es unendlich viele Carmichael-Zahlen gibt; es wird jedoch vermutet. Sie sind allerdings sehr selten; unterhalb von 25 10 9 gibt es lediglich 2163 Carmichael-Zahlen. Carmichael-Zahlen widersprechen also am stärksten der Umkehrbarkeit des kleinen Satzes von FERMAT. Für Carmichael-Zahlen gelten folgende Aussagen (Beweise dazu vgl. z.B. Koblitz, N: "A Course in Number Theory and Cryptography", Springer 1987): Satz 3a.4: Eine ungerade zusammengesetzte Zahl n ≥ 3 ist genau dann eine Carmichael-Zahl, wenn gilt a) n ist quadratfrei, d.h. n enthält keinen mehrfachen Primteiler, b) Für jeden Primfaktor p | n gilt p – 1 | n – 1 . Satz 3a.5: Eine Carmichael-Zahl muß das Produkt von mindestens drei Primfaktoren sein. Im Zusammenhang mit der Frage, "mit welcher Wahrscheinlichkeit" eine Pseudoprimzahl tatsächlich Primzahl ist, ist der folgende Satz von Bedeutung: Satz 3a.6: Sei n eine zusammengesetzte Zahl. (a) Falls n pseudoprim zu den zueinander und zu n teilerfremden Basen b1 und b2 ist, dann ist n auch pseudoprim zu den Basen b1 b2 und b1 b2-1 , wobei b2-1 die Inverse zu b2 modulo n ist. (b) Falls n den Test (*) für eine einzige Basis b nicht besteht, dann besteht n den Test nicht für mindestens die Hälfte der möglichen Basen. Beweis: (a) folgt unmittelbar aus den Rechengesetzen in Restklassenringen. Zum Beweis von (b) sei {b1 , b2 , . . . bk } die Menge aller Basen, für die n pseudoprim ist. Sei b eine feste Basis, für die n nicht pseudoprim ist. Wäre nun n pseudoprim für irgend eine Basis b bi , dann wäre nach (a) n auch pseudoprim für die Basis (b bi) bi-1 = b im Widerspruch zur Annahme. Daher erfüllt n die Relation (*) nicht für die Basen {bb1, bb2, . . . b bk}. Also gibt es mindestens ebenso viele Basen, für die n nicht pseudoprim ist wie solche, für die n pseudoprim ist. Wenn also n zusammengesetzt ist und nicht für jede mögliche Basis b die Relation (*) erfüllt, dann wird bei zufällig gewähltem b mit ggT(b,n) = 1 die Wahrscheinlichkeit dafür, daß n nicht pseudoprim zu dieser Basis ist, mindestens 50% Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 4 von 11 betragen. Diese Überlegung ist die Grundlage einer Strategie zur Beantwortung der Frage, ob eine gegebene natürliche Zahl n zusammengesetzt ist (leider versagt die Argumentation bei den Carmichael-Zahlen, die die Relation (*) für jede mögliche Basis erfüllen): Angenommen, wir wollen herausfinden, ob eine große ungerade natürliche Zahl n eine Primzahl ist. Dazu wählen wir zunächst ein zufälliges natürliches b mit 0 < b < n und bestimmen d = ggT(b,n). Ist d > 1, dann ist n zusammengesetzt und d | n . Ist d = 1, dann berechnen wir z = b n-1 mod n. Ist z 1, dann ist n zusammengesetzt, andernfalls besteht eine Chance dafür, daß n eine Primzahl ist. Um diese Chance zu vergrößern, wiederholen wir das Verfahren maximal k mal. Erfüllt n für sämtliche zufälligen b i , i = 1, 2, ... k die Relation (*), dann ist die Wahrscheinlichkeit dafür, daß n zusammengesetzt und keine Carmichael-Zahl ist, höchstens gleich 1 / 2 k (vgl. hierzu auch die Anmerkung am Ende des Arbeitsblatts). Die geschilderte Idee führt auf den folgenden Algorithmus zur Beurteilung dessen, ob eine vorgelegte Zahl n wahrscheinlich Primzahl (oder Carmichael-Zahl) ist oder nicht: Algorithmus 3a.7: 0. Setze k = 0 , wähle ein natürliches k0 > 1. 1. Wähle eine zufällige Zahl b mit 0 < b < n . Bilde d = ggT(b,n). Setze k = k+1. 2. Falls d > 1, gib aus: "n ist zusammengesetzt" und beende den Algorithmus. 3. Bilde z = bn-1 . Falls z 1 mod n , gib aus: "n ist zusammengesetzt" und beende den Algorithmus. 4. Falls k < k0 , gehe zu Schritt 1, andernfalls gib aus: "n ist mit Wahrscheinlichkeit größer als 1 - 1 / 2k eine Primzahl oder eine Carmichael-Zahl" und beende den Algorithmus. Ein solcher Test wird, da er die Primalität von n nicht mit Sicherheit nachweisen kann, als "probabilistischer Primzahltest" bezeichnet (in diesem Fall ist er allerdings, streng betrachtet, kein Primzahltest, sondern ein Test darauf, ob die vorgelegte Zahl Prim- oder Carmichael-Zahl ist). Eine Implementierung dieses Pseudoprimzahl-Tests in C++ kann etwa wie folgt aussehen (dabei wurde die Zahl k0 = 10 gewählt)1: // Test auf Pseudo-Primalitaet implementiert in C++ 1 Da in C++ kein elementarer Datentyp für beliebig große Integers existiert, muß der benutzerdefinierte Datentyp langzahl über die Quelldatei langzahl_mfc.cpp eingeführt werden. Langzahlen können dann als Zeichenketten definiert und ansonsten wie Integers behandelt werden. Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 5 von 11 #include <iostream.h> #include <stdio.h> #include <string.h> #include "langzahl_mfc.cpp" #define k0 10 langzahl plrand(langzahl lseed) // erzeugt große Zufallszahlen { langzahl xl, b = "4294967296"; langzahl zl = "6364136223846793005"; xl = (lseed * zl + 1) % (b*b); return xl; } int main() { char s[101]; for (int i=0; i<101; i++) s[i] = ' '; unsigned long t; double tinvers; langzahl z, seed, p, a, zero; CString pstr, tstr; cout << "Eingabe Zahl: "; cin >> s; cout << endl; pstr = s; p = cstring2lang(pstr); seed = 3551; if ((p % 2) == zero) { cout << pstr << " ist keine Primzahl" << endl; getchar(); Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 6 von 11 return 0; } t = 2; for (int k=0; k<k0; k++) { wieder: a = plrand(seed); seed = a; a = a % p; if (ggT(a,p) != 1) goto wieder; z = expo(a, p-1, p); if (z == 1) { if (k == k0-1) { tinvers = 1-1/(double)t; tstr.Format("%f",tinvers); cout << pstr << " ist mit Wahrscheinlichkeit> " << tstr; cout << " Primzahl oder Carmichael-Zahl" << endl; } t = 2*t; continue; } if (z != 1) { cout << pstr << " ist keine Primzahl" << endl; getchar(); return 1; } t = 2 * t; } getchar(); return 0; } Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 7 von 11 Der Schönheitsfehler des Pseudoprimzahl-Tests, der darin liegt, daß man (wegen der nur sporadisch vorkommenden Carmichael-Zahlen allerdings mit geringer Wahrscheinlichkeit) bei positivem Ausgang eine Carmichael-Zahl statt einer Primzahl erwischen kann, führt zur Forderung nach anderen Tests, bei denen lediglich die Alternative besteht, daß sich n entweder mit Sicherheit als zusammengesetzt oder aber mit beliebig vorgegebener Wahrscheinlichkeit als tatsächlich prim erweist. Zu diesem Zweck definieren wir eine EULER-Pseudoprimzahl: Definition 3a.8: Eine ungerade zusammengesetzte Zahl n heißt EULER-Pseudoprimzahl zur Basis b, wenn ggT(n,b) = 1 ist und die Relation b b( n 1) / 2 mod n n (**) gilt. Dabei ist das sogenannte JACOBI-Symbol bn gleich 0, wenn n | b , gleich 1, wenn b ein quadratischer Rest modulo n ist, gleich −1, wenn b ein quadratischer Nicht-Rest modulo n ist. Zunächst gilt: Satz 3a.9: Ist n eine Primzahl, dann ist die Relation (**) für jedes b Z erfüllt. Beweis: Falls n | b, sind beide Seiten von (**) gleich Null. Falls b ein quadratischer Rest modulo n ist, ist also b = r 2 mod n für eine ganze Zahl r. Dann folgt b( n 1) / 2 r n 1 1 mod n nach dem Satz von FERMAT. Sei g eine Primitivwurzel mod n . Für das Element y: = g (n-1)/2 gilt y 1 mod n , aber y 2 1 mod n. Da im Restklassenkörper modulo n die Gleichung x 2 = 1 nur die beiden Lösungen 1 hat, folgt y −1 mod n . Sei jetzt b eine zu n teilerfremde ganze Zahl, die kein quadratischer Rest modulo n ist. Dann gilt b = g s mod n mit einem ungeraden s. Da s(n 1) / 2 (n 1) / 2 mod (n 1) ist, folgt Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 8 von 11 b( n 1) / 2 g s ( n 1) / 2 g ( n 1) / 2 1 mod n . Satz 3a.10: Ist n eine EULER-Pseudoprimzahl zur Basis b, dann ist n eine Pseudoprimzahl zur Basis b. Beweis: Quadrieren der Relation (**) liefert die Relation (*). Anmerkung: Die Umkehrung von Satz 3a.10 ist falsch (Beispiel: 91 ist Pseudoprimzahl zur Basis 3, nicht aber EULER-Pseudoprimzahl zu dieser Basis). Wir notieren nun, daß der oben angegebene Primzahltest entsprechend modifiziert auf EULER-Pseudoprimzahlen für Carmichael-Zahlen nicht versagt, d.h. diese Zahlen als zusammengesetzt ausweist. Dazu formulieren wir: Satz 3a.11: Für eine zusammengesetzte Zahl n erfüllen mindestens die Hälfte aller b (Z / nZ)* nicht die Relation (**). Beweisskizze: Zunächst beweist man: Erfüllt ein b1 die Relation (**) und ein b2 nicht, dann erfüllt auch b1 b2 die Relation nicht. Erfüllt also nur ein einziges b die Relation nicht, dann ist die Anzahl der b's , die sie nicht erfüllen, mindestens so groß wie die der b's , die sie erfüllen (die Argumentation ist analog zu der im Beweis von Satz 3a.6). Da mithin für ein beliebiges zusammengesetztes n die Relation (**) für mindestens die Hälfte der möglichen Basen b nicht erfüllt ist, gibt es auch kein Analogon zu den Carmichael-Zahlen bei diesem Test (die Relation (**) kann nicht für alle erlaubten Basen erfüllt sein!). Der Algorithmus des nach SOLOVAY und STRASSEN benannten Tests auf Nicht-Primalität einer gegebenen Zahl n verläuft also ganz genau so wie der Algorithmus 3a.7 mit der entsprechenden Modifikation in Schritt 3. Dort b ist allerdings das JACOBI-Symbol ni zu berechnen, worauf hier nicht eingegangen werden soll (dazu muß festgestellt werden, ob das gewählte bi ein quadratischer Rest modulo n ist oder nicht). Ein Algorithmus zur Berechnung des JACOBI-Symbols findet sich an vielen Stellen in der Literatur, z.B. in Forster,O:"Algorithmische Zahlentheorie", Vieweg 1996. Dort finden sich auch weitere Primzahltests: Einer der bekanntesten ist der sogenannte strenge Pseudoprimzahl-Test, der den Vorteil hat, daß das JACOBISymbol nicht berechnet werden muß. Dazu sieht man sich den kleinen Satz von FERMAT etwas genauer an: Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 9 von 11 Ist p eine ungerade Primzahl und b teilerfremd zu p, dann ist also b p-1 1 mod p. Da p ungerade ist und p | b p-1 – 1 ist mithin b( p 1) / 2 1 mod p . Diese Überlegung können wir wiederholen, so lange wir nochmals ohne Rest durch 2 teilen können. Wir schreiben also p = 2s r + 1 mit ungeradem r. Sei nun 0 t s die kleinste Zahl, so daß t b 2 r 1 mod p ist. Falls t ≥ 1, ist wie oben t p | (b2 r 1) (b2 t 1 r 1)(b2 t 1 r 1), also, da t minimal gewählt war: b2 t 1 r 1 mod p . Damit haben wir folgende Verallgemeinerung des kleinen Satzes von FERMAT bewiesen: Satz 3a.12: Sei n ≥ 3 prim und n = 2 s r + 1 mit ungeradem r. Dann gilt für ein zu n teilerfremdes b entweder b r 1 mod n , (***) t oder es gibt ein 0 t s mit b 2 r 1 mod n . Wir definieren nun Definition 3a.13: Sei n ≥ 3 ungerade, zusammengesetzt und ggT(b,n) = 1. Dann heißt n eine strenge Pseudoprimzahl zur Basis b, wenn (***) gilt. Man kann zeigen, daß n eine Primzahl ist, wenn n strenge Pseudoprimzahl zu allen erlaubten Basen ist. Damit gibt es keine Analoga zu den Carmichael-Zahlen, diese können keine strengen Pseudoprimzahlen sein. Da man außerdem beweisen kann, daß eine ungerade zusammengesetzte Zahl eine strenge Pseudoprimzahl zu höchstens ¼ aller erlaubten Basen sein kann, lässt sich ein probabilistischer Primzahltest angeben, der analog wie im Falle des einfachen Pseudoprimzahl-Tests argumentiert und das Ergebnis liefert, daß eine ungerade Zahl Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 10 von 11 n mit einer Wahrscheinlichkeit von mehr als 1 − (1/4) k tatsächlich eine Primzahl ist, falls die Relation (***) für k zufällig gewählte Basen erfüllt ist: Den Algorithmus für diesen (am häufigsten benutzten) probabilistischen Primzahltest von MILLER und RABIN stellen wir hier ohne Beweis vor: Algorithmus 3a.14 (MILLER und RABIN): 0. Wähle die ungerade zu testende Zahl n, k = 0, k0 > 1 und bestimme q und t mit n−1 = 2t q, q ungerade. 1. Wähle ein zufälliges a mit 1 < a < n . Setze e = 0, b = a q mod n . Falls b = 1 und k = k0 , gehe zu Schritt 4. Ist b = 1 und k < k 0 , setze k = k+1 und gehe zu Schritt 1. 2. So lange gilt b 1 mod n und e < t − 1, setze b = b2 mod n und e = e + 1. Falls b n – 1 mod n, gib aus "n ist zusammengesetzt" und beende den Algorithmus. 3. Ist k < k0 , setze k = k + 1 und gehe zu Schritt 1. Ist k = k0 , gehe zu Schritt 4. 4. Gib aus "n ist mit Wahrscheinlichkeit größer als 1 - 1 / 4k eine Primzahl" und beende den Algorithmus. Anmerkung zum probabilistischen Primzahltest. Ist n eine Primzahl oder eine Carmichael-Zahl ? Die beiden Ereignisse A: n ist zusammengesetzt und keine Carmichael-Zahl, A': n ist Primzahl oder Carmichael-Zahl partitionieren den Ereignisraum. Bei willkürlicher Wahl einer natürlichen Zahl n ist P(A) = P(A') = ½ . Das Ereignis B sei: Ein k-maliger Test mit willkürlich gewählten erlaubten Basen liefert bi n-1 = 1 mod n für i = 1 bis k. Die Wahrscheinlichkeit P(A | B) ist dann P( A | B) P( B | A) P( A) . P( B | A) P( A) P( B | A' ) P( A' ) Die auf der rechten Seite auftretenden bedingten Wahrscheinlichkeiten sind: Prof. Dr. Gerhard Berendt SS 2005 Mathematische Grundlagen der Codierung / Endliche Strukturen Arbeitsblatt 3a / S. 11 von 11 P(B | A) < (½) k , da – wenn A zutrifft – nach Satz 3a.6 mindestens genau so viele Basen existieren, die den Test nicht erfüllen wie solche, die den Test erfüllen, und die einzelnen Tests stochastisch unabhängig sind, P(B | A') = 1, da – wenn A nicht zutrifft – jede erlaubte Basis den Test erfüllt. Damit folgt P(A | B) < (½) k wie behauptet.