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.