Kryptologie

Werbung
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.
Herunterladen