IT-Security Teil 14: Primzahltest

Werbung
IT-Security
Teil 14: Primzahltest
ITSec – SS 2017 – Teil 14/Primzahltest
08.05.17 1
Literatur
[14-1]
Willems, Wolfgang: Codierungstheorie und Kryptographie. Mathematik
Kompakt, Birkhäuser, 2008
[14-2]
Socher, Rolf: Algebra für Informatiker. Hanser, 2012
[14-3]
https://de.wikipedia.org/wiki/Fermatscher_Primzahltest
[14-4]
https://en.wikipedia.org/wiki/Euler's_criterion
[14-5]
https://de.wikipedia.org/wiki/Miller-Rabin-Test
[14-6]
https://de.wikipedia.org/wiki/Eulersche_Pseudoprimzahl
[14-7]
https://de.wikipedia.org/wiki/Fermatscher_Primzahltest
https://de.wikipedia.org/wiki/Fermatsche_Pseudoprimzahl
[14-8]
https://de.wikibooks.org/wiki/Pseudoprimzahlen
[14-9]
https://de.wikibooks.org/wiki/Pseudoprimzahlen
https://de.wikipedia.org/wiki/Pseudoprimzahl
[14-10] https://de.wikipedia.org/wiki/Starke_Pseudoprimzahl
ITSec – SS 2017 – Teil 14/Primzahltest
2
Übersicht
•
•
•
•
Deterministisches Verfahren
Verfahren nach Fermat
Verfahren nach Euler
Verfahren nach Miller-Rabin
ITSec – SS 2017 – Teil 14/Primzahltest
3
Begriffe
• Primzahl = Natürliche Zahl > 1, die nur durch sich selbst und
durch 1 ganzzahlig teilbar ist
• Eine Zahl ist prim, wenn sie eine Primzahl ist.
• Pseudoprimzahl = Natürliche Zahl > 1, die trotz mehrfacher
Prüfungen fälschlicherweise als Primzahl angesehen wird
• Primzahltest = Anwendung eines Verfahrens zur Prüfung, ob eine
Zahl prim ist
• Zeugen = witness = Ganze Zahl, die bei einer Prüfung, ob eine
andere Zahl prim ist, nachweist, dass sie es nicht ist
ITSec – SS 2017 – Teil 14/Primzahltest
4
Aufgabe der Primzahltests
• Gegeben ist eine Zahl n ∊ ℕ, die größer als 2 ist
• Es wird nun ein Verfahren angewendet, das in akzeptabler Zeit
– entweder exakt entscheidet
– oder heuristisch vermutet,
dass n eine Primzahl ist oder nicht.
• Die probabilistischen Verfahren arbeiten nach einer Monte CarloMethode, indem sie zufällige Stichproben nehmen und anhand
deren Ergebnisse eine Vermutung liefern.
Siehe: https://de.wikipedia.org/wiki/Monte-Carlo-Algorithmus
• Die deterministischen Verfahren liefern exakt ein Ergebnis, das
wahr ist.
ITSec – SS 2017 – Teil 14/Primzahltest
5
Wahl des Kandidaten
• Es wird per Zufall eine natürliche Zahl größer 2 ausgewählt und
anschließend auf prim getestet.
• Damit dieses Verfahren praktikabel ist, muss es nicht nur sehr
viele Primzahlen in dem praktikablen Bereich (100 bis 200
Stellen) geben, sondern sie müssen auch einigermaßen gleich
verteilt nebeneinander liegen, so dass eine hohe Wahrscheinlichkeit für einen zufälligen Treffer besteht.
• Zum Glück gibt es genügend relativ dicht beieinander liegende
Primzahlen, so dass dieses Verfahren praktikabel ist.
• Siehe:
– http://www.michael-holzapfel.de/themen/primzahlen/pz-anzahl.htm
– https://de.wikipedia.org/wiki/Primzahlsatz
ITSec – SS 2017 – Teil 14/Primzahltest
6
Beispiele für deterministische Tests I - Probedivision
• Systematische Modulo-Prüfung (probeweise Division)
• Es wird der Kandidat n durch 2 bis √n ganzzahlig dividiert und
der Rest bestimmt:
– Ist der Rest ein einziges Mal 0, so ist n keine Primzahl.
– Ist der Rest immer ungleich 0, so ist n eine Primzahl.
func bool testPrime(nat n) {
if n=0 or n=1 { return false; }
if n=2
{ return true; }
if even(n)
{ return false; }
return not witness(n>2);
}
ITSec – SS 2017 – Teil 14/Primzahltest
Hier die
Rahmenroutine,
die witness()
aufruft.
7
Beispiele für deterministische Tests II - Probedivision
func bool widness(nat n>1)
limit:= floor(sqrt(n));
for divisor in 3..limit
if n mod divisor = 0
return true;
}
}
return false;
}
{
// truncate
step 2 {
{
• Diese Routine ist nur mit dem Aufruf aus testPrime() korrekt,
d.h. nur ungerade Werte für n>1 werden übergeben.
• floor() rundet zur nächsten kleineren ganzen Zahl ab.
• Die Berechnung nach diesem Verfahren dauert für die Praxis viel
zu lange, so dass sich diese Tests nur für kleine Zahlen eignen.
ITSec – SS 2017 – Teil 14/Primzahltest
8
Beispiele für deterministische Tests III - Wilson
• Berechnung nach dem Satz von Wilson, mit n>2:
(n-1)! ≡
(n-1)! ≡
-1 (mod n)
n-1 (mod n)
n ist genau dann eine Primzahl, wenn n beide Gleichungen erfüllt.
• Berechnung nach dem Satz von Leibniz, mit n>2:
(n-2)! ≡
(n-2)! ≡
-1 (mod n)
n-1 (mod n)
n ist genau dann eine Primzahl, wenn n beide Gleichungen erfüllt.
• Die Berechnung nach diesen Sätzen dauert für die Praxis viel zu
lange, so dass sich diese Tests nur für kleine Zahlen eignen.
ITSec – SS 2017 – Teil 14/Primzahltest
9
Probabilistische Tests
• Test nach Fermat
• Test nach Euler
• Test nach Miller-Rabin
Diese Tests liefern nur Vermutungen, keine exakten Ergebnisse.
ITSec – SS 2017 – Teil 14/Primzahltest
10
Globales Verfahren
• Es wird vorher eine Anzahl k von Tests festgelegt; wenn der
Kandidat n diese Anzahl von Tests besteht, dann ist n eine
Primzahl mit hoher Wahrscheinlichkeit.
• Die Funktion witness() wird jeweils entsprechend dem Verfahren
gewählt. Hierzu gibt es mehrere Möglichkeiten.
func bool testPrime(nat n,nat k>0) {
if n=0 or n=1 { return false; }
if n=2
{ return true; }
if even(n)
{ return false; }
for k times {
if witness(n>2) {
return false;
}
}
return true;
}
ITSec – SS 2017 – Teil 14/Primzahltest
11
Fermat-Test I
• Dieser Test beruht auf dem kleinen Satz von Fermat:
an-1
≡ 1 (mod n), mit a>0, ggT(a,n)=1 und n als Primzahl
Wenn n eine Primzahl ist, dann kommt bei der Potenzierung immer
eine 1 heraus; wenn es aber keine Primzahl ist, dann kommt bei
der Potenzierung manchmal eine 1 heraus.
Jedenfalls wenn ggT(a,n)=1 gilt, d.h. wenn a<n ist.
• Der kleine Satz von Fermat ist ein notwendiges, aber kein
hinreichendes Kriterium für die prim-Eigenschaft einer Zahl.
• Um die Prüfung von ggT(a,n)=1 zu sparen, wird die andere Form
des Satzes benutzt:
an
≡ a (mod n), mit a>0 und n als Primzahl
• Oder das a<n wird vorher mit einer Probedivision n mod a<>0
geprüft. Die eine zusätzliche Multiplikation ist wohl effizienter.
ITSec – SS 2017 – Teil 14/Primzahltest
12
Fermat-Test II
• Mit n als dem Primzahlkandidaten wird ein a aus dem Intervall
[3:n-2] zufällig ausgewählt und an-1 berechnet:
– Ist an-1 mod n ungleich 1, so ist n sicher keine Primzahl.
a wird dann Zeuge genannt.
– Ist an-1 mod n gleich 1, so kann n eine Primzahl sein.
– n=2 wird ignoriert (siehe Routine testPrime()).
• Warum ist die obere Grenze für a n-2?
– a=n verletzt ggT(a,n)=1
– a=n-1 führt grundsätzlich zum Bestehen des Tests, wenn n ungerade
ist, denn
(n-1)n-1 mod n = (n-1)2*(n-1)n-3 mod n = (n-1)(n-1) mod 2 mod n
da n-1 gerade ist, gilt (n-1)n-1 mod n = 1
ITSec – SS 2017 – Teil 14/Primzahltest
13
Fermat-Test III - Beispiele
func bool witness(nat n>2) {
if n>3 {
a:= select randomly in [2..n-2];
return powerMod(a,n,n)<>a;
}
return false; // 3 is prime
}
• Beispiel
n=6 und a=2: 25 ≡ 32 (mod 6) ≡ 2 (mod 6)
also ist 2 ein Zeuge gegen 6
ITSec – SS 2017 – Teil 14/Primzahltest
14
Fermat-Test IV - Beispiele
n=15 und alle a in [2..n-1]
ap ≡ a (mod p)
ap-1 ≡ 1 (mod p)
Basis
Zeuge Basis
Zeuge
ggT()=1
2**15 mod 15 = 8
ja
2**14 mod 15=
4
ja
3**15 mod 15= 12
ja
3**14 mod 15=
9
ja
Nein
1
4**15 mod 15=
4
4**14 mod 15=
5**15 mod 15=
5
5**14 mod 15= 10
ja
Nein
6**15 mod 15=
6
6**14 mod 15=
6
ja
Nein
7**15 mod 15= 13
ja
7**14 mod 15=
4
ja
8**15 mod 15=
2
ja
8**14 mod 15=
4
ja
9**15 mod 15=
9
9**14 mod 15=
6
ja
Nein
10**15 mod 15=10
10**14 mod 15=10
ja
Nein
11**15 mod 15=11
11**14 mod 15= 1
Nein
12**15 mod 15= 3
ja
12**14 mod 15= 9
ja
13**15 mod 15= 7
ja
13**14 mod 15= 4
ja
14**15 mod 15=14
ITSec – SS 2017 – Teil 14/Primzahltest
14**14 mod 15= 1
Eine Prüfung mit
a= 4, 11 und 14
würde 15 als
Primzahl vermuten
Nie Zeuge
15
Bemerkungen
• Bei der 1. Form (ap ≡ a (mod p)) reicht a<p,
bei der 2. Form (ap-1 ≡ 1 (mod p)) muss ggT(a,n)=1 sein.
• Wenn nur die Nicht-Primzahlen betrachtet werden, so ist die
Trefferwahrscheinlichkeit der Basen für einen Zeugen etwa gleich.
• Bei ungeraden nicht-Primzahlen unter 20.000 gibt es bei der 1. Form
99,1% und der 2. Form 99,4% Zeugen, jeweils in [2..n-2], bis
100.000 sind es 99,6% bzw. 99,8%.
• Die zweite Form ist wegen der ggT()-Prüfung empfindlicher, denn
jeder Wert des ggT() ungleich 0 zeigt einen Zeugen an.
func bool witness(nat n>2) {
if n>3 {
a:= select randomly in [2..n-2];
if ggT(a,n)<>0 { return true; }
return powerMod(a,n-1,n)<>1;
}
return false; // 3 is prime
}
ITSec – SS 2017 – Teil 14/Primzahltest
16
Leider...
• gibt es zusammengesetzte Zahlen, die den Fermat-Test fast immer
bestehen: z.B. die Carmichael-Zahlen.
• Eine Carmichael-Zahl c hat folgende Eigenschaften:
– Sie hat mindestens 3 unterschiedliche Primfaktoren
– Für jeden Primteiler p von c gilt: p-1|c-1
• Ist n eine Carmichael-Zahl, so ist für alle a, die teilerfremd zu n
sind, die Kongruenz an-1 ≡ 1 (mod n) erfüllt.
D.h. der Fermat-Test irrt sich hier meistens.
• Beachten Sie, dass dies keine Widerlegung des Satzes von Fermat
ist, sondern eine dessen Umkehrung.
• Wenn n eine Primzahl ist, dann ist die Potenz immer 1; aber es gibt
auch nicht-Primzahlen für n, deren Potenz fast immer 1 ist,
nämlich dann, wenn die gewählte Probe a teilerfremd zu n ist.
• Derartige Zahlen werden Fermat-Pseudoprimzahlen genannt, diese
brauchen keine Carmichael-Zahlen zu sein; es gibt noch mehr.
ITSec – SS 2017 – Teil 14/Primzahltest
17
Carmichael-Zahlen
• Die Carmichael-Zahlen kommen selten vor. Im Zahlenbereich bis
1017 existieren nur 585.355 Carmichael-Zahlen.
Dies hat für die Praxis wenig Bedeutung, da in der Kryptographie
Primzahlen mit 200 bis 300 Stellen gesucht werden.
• Das bedeutet aber auch, dass die Wahrscheinlichkeit per Zufall
eine Carmichael-Zahl zu treffen bei ca. 10-11 liegt.
• Und für die Nicht-Carmichael-Zahlen, die auch FermatPseudoprimzahlen sind, liegt die Wahrscheinlichkeit bei ca. 10-50.
561 3*11*17
1105 5*13*17
1729 7*13*19
41041 7*11*13*41
ITSec – SS 2017 – Teil 14/Primzahltest
Ein paar Beispiele
für Carmichael-Zahlen.
18
Bemerkungen
• Es wurden folgende Carmichael-Zahlen untersucht:
561, 1105, 1729,2465, 2821, 6601, 8911, 10585, 15841, 29341,
41041, 46657, 52633, 62745, 63973, 75361
• Bei der 1. Form (ap ≡ a (mod p)) versagten alle Basen, bei der 2.
Form (ap-1 ≡ 1 (mod p)) gab es nur Zeugen mit ggT()<>1, das sind
25%.
• Daher sollte der ggT() immer vorher berechnet werden, um im
Falle eines Wertes ungleich 1 einen Zeugen zu erkennen.
• Bei weiteren Nicht-Carmichael-Zahlen versagt der Fermat-Test nur
bei bestimmten Basen, z.B. Basis 8 bei den Zahlen 9, 21, 45, 63,
65, 105. Wenn aber alle Basen zugelassen werden, gibt es bei
diesem Beispiel 82,5% bzw. 87% Zeugen.
• Bei einer größeren Datenbasis erniedrigen sich die Werte auf
80,8% bzw. 85,4%.
ITSec – SS 2017 – Teil 14/Primzahltest
19
Euler-Test I
• Der Euler-Test beruht auf folgender Formel:
a(n-1)/2 ≡ ±1 (mod n)
• Falls n eine Primzahl>2 ist, dann gilt immer die obige Kongruenz.
Aber auch hier muss ggT(a,n)=1 sein.
• Wenn der Kandidat n eine ungerade Primzahl ist, dann gibt es für
die Quadrat-Wurzel zwei Lösungen – jeweils mod n: +1 und -1.
• Wenn a(n-1)/2 mod n weder +1 noch -1 ist, dann ist a ein Zeuge für
die nicht-prim-Eigenschaft.
• Bei der Quadrat-Wurzel wird der Index halbiert. (n-1)/2 ist immer
eine ganze Zahl, da n ungerade ist.
ITSec – SS 2017 – Teil 14/Primzahltest
20
Leistung I
• Der Euler-Test findet alle Pseudoprimzahlen des Fermat-Tests.
Der Euler-Test findet mehr nicht-Primzahlen als der Fermat-Test.
• Aber es gibt Zahlen, bei denen der Euler-Test bei bestimmten aWerten, die Basen genannt werden, versagt, z.B. 341.
• Derartige Zahlen werden Euler-Pseudoprimzahlen genannt.
Es gibt Tabellen dieser Euler-Pseudoprimzahlen zur Basis a:
https://de.wikibooks.org/wiki/Pseudoprimzahlen:_Tabelle_Eulersch
e_Pseudoprimzahlen
Z.B. für a=2 sind es 341, 561, 1105, 1729, 1905, 2047, 2465
• Abgeschätzt gilt, dass der Euler-Test ca. die Hälfte der
Pseudoprimzahlen vom Fermat-Test hat.
• Eine Eulersche Pseudoprimzahl erfüllt die Kongruenz
a(n-1)/2 ≡ ±1 (mod n)
für einige a mit ggT(a,n)=1 und n ist keine Primzahl.
ITSec – SS 2017 – Teil 14/Primzahltest
21
Leistung II
• Dann gibt es leider noch Zahlen, bei denen der Euler-Test bei fast
allen a versagt: absolute Euler-Pseudoprimzahlen, z.B. 1729 zur
Basis 3.
• Auch hier gibt es Tabellen:
– https://de.wikibooks.org/wiki/Pseudoprimzahlen:_Tabelle_Absolute_eul
ersche_Pseudoprimzahlen
– https://oeis.org/A033181
• Eine absolute Eulersche Pseudoprimzahl erfüllt die Kongruenz
a(n-1)/2 ≡ ±1 (mod n)
für alle a mit ggT(a,n)=1, wobei n keine Primzahl ist.
• Alle Basen a mit ggT(a,n)≠1 und a im Intervall [3,n-1] sind immer
Zeugen.
ITSec – SS 2017 – Teil 14/Primzahltest
22
Euler-Test - Beispiel
n=15 und alle a in [2..n-1]
Basis
a(n-1)/2 ≡ ±1 (mod n)
Zeuge
ggT()=1
2
8 ja
3
12 ja
4
4 ja
5
5 ja
Nein
6
6 ja
Nein
7
13 ja
8
2 ja
9
9 ja
Nein
10
10 ja
Nein
11
11 ja
12
3 ja
13
7 ja
14
ITSec – SS 2017 – Teil 14/Primzahltest
14
Nein
Zum Bestehen muss das
Ergebnis 1, -1 oder n-1
sein.
Ist der ggT() nicht 1, so
liegt ein Zeuge vor.
Nein
Nie Zeuge
23
Bemerkungen
• Bei ungeraden nicht-Primzahlen unter 20.000 gibt es beim EulerTest 99,6% Zeugen, jeweils in [2..n-2], ist also etwas besser als
Fermat. Bis 100.000 ist der Anteil der Zeugen 99,9%.
• In einem direkten Vergleich bei ungeraden nicht-Primzahlen
unter 20.000 schneidet der Euler-Test um 0,2% besser als der
Fermat-Test ab (0,2% Zeugen mehr als bei Fermat).
• Allerdings lagen beide bei 0,4% falsch, d.h. die Wahrscheinlichkeit bei beiden Tests zusammen, richtige Basen zu wählen, liegt
bei ca. 0,996.
ITSec – SS 2017 – Teil 14/Primzahltest
24
Euler-Test II
func bool witness(nat n>3) {
a:= select randomly in [3..n-1];
if ggT(a,n)=1 {
tmp:= powerMod(a,(n-1)/2,n);
return not(tmp= 1 or -1 or n-1);
} else {
return true;
}
}
Für das Arbeiten mit positiven Modulen n gilt: -1 ≡ n-1 (mod n).
ITSec – SS 2017 – Teil 14/Primzahltest
25
Miller-Rabin-Test I – die Idee
• Die Idee dazu liegt darin, dass eine Zahl d gesucht wird, deren
mehrfache Quadrierungen n-1 ergibt.
• Beginnend mit dieser Zahl wird eine Folge berechnet, deren letztes
Element eine Potenz von n-1 hat.
• Nach dem kleinen Fermat'schen Satz an-1 ≡ 1 (mod n) muss das letzte
Element dieser Folge 1 sein, wenn n eine Primzahl ist. Die Prüfung
dieses letzten Elements ist also der Fermat-Test.
• Die Berechnung des vorletzten Elements ist a(n-1)/2 mod n, was dem
Euler-Test entspricht: hier sollte -1 oder 1 herauskommen.
ad
ad*2
ad*4
Beginn mit der Zahl d
deren Verdoppelungen
am Ende n-1 ergeben
ITSec – SS 2017 – Teil 14/Primzahltest
ad*8
ad*16
ad*32
...
a(n-1)/2
EulerTest
an-1
FermatTest
26
Miller-Rabin-Test II – die Idee
• Damit entstehen drei mögliche Folgen für den Fall einer Primzahl:
– (
1,1,1,..,1)
– (?,?,..,-1,1,1,..,1) mit ? für beliebige Zahl
– (
-1,1,1,..,1)
• Die Berechnung des nächsten Elements der Folge kann abgebrochen
werden, wenn
– das erste Element 1 oder
– das erste Element oder ein späteres -1 ist,
denn danach haben alle restlichen Elemente den Wert 1.
• Warum?
– 1 oder -1 quadriert ergibt immer 1; daher beginnt die 1er-Reihe mit 1
oder -1.
– Der Vorgänger einer 1 in der Folge ist immer kongruent zu 1 oder -1.
– Der Vorgänger einer -1 in der Folge ist nie 1 oder -1.
ITSec – SS 2017 – Teil 14/Primzahltest
27
Miller-Rabin-Test III – die Idee
• Es wird also die folgende Folge berechnet:
ad,ad*2,ad*4,ad*8,ad*16,ad*32,...,a(n-1)/2,an-1
• Das gelingt, wenn n-1=d*2s gewählt wird, denn dann kann s-mal
die Quadratwurzel gezogen werden, was jedes Mal zur
Halbierung des Exponenten und zu einem ganzzahligen
Exponenten führt.
• Dies führt zu folgenden notwendigen Kriterium für die primEigenschaft:
Entweder ist ad gleich 1 oder es kommt einmal -1 vor.
• Ist dieses Kriterium verletzt, liegt mit a ein Zeuge vor.
• Nach dem Feststellen der Erfüllung dieses Kriteriums wird die
Berechnung der Folge abgebrochen.
ITSec – SS 2017 – Teil 14/Primzahltest
28
Miller-Rabin-Test IV
• Der Miller-Rabin-Test beruht auf folgendem Satz:
Wenn n eine ungerade Primzahl ist und wenn n-1=d*2s (d ist
ungerade) und ggT(a,n)= 1 gilt, dann ist
1) entweder ad = ad*2**k ≡ 1 (mod n), mit k=0
2) oder es gibt einen Exponenten k in [0:s-1] mit ad*2**k ≡ -1 (mod p).
• n ist die zu prüfende Zahl, a ist die Probe bzw. Basis, die zum Zeugen
werden kann.
• Wenn aber ein Element berechnet wird, das 1 ist und als Vorgänger
weder -1 oder 1 hat, dann liegt ein Zeuge vor, denn eine -1 muss
vorhanden sein und aus einer 1 wird nie eine -1 berechnet.
• Die Folgen (?,..,?,1,..,1) und (?,..,?) zeigen daher einen Zeugen an.
ITSec – SS 2017 – Teil 14/Primzahltest
29
Miller-Rabin-Test V
• Mit n ist als ungeraden Kandidaten wird s bestimmt:
s = max{r ∊ ℕ | 2r teilt n-1}
damit ist 2s ist größte Potenz, die n-1 teilt,
also 2r mod (n-1) = 0 und r>0
• Nun werden d berechnet:
d = (n-1)/2s
compute n-1= d*2**s, d is odd:
d:= n-1;
// d is now even
s:= 0;
while even(d) {
d:= d/2; // right shift
s:= s+1;
}
ITSec – SS 2017 – Teil 14/Primzahltest
30
Miller-Rabin-Test VI
• Wenn n-1 eine durch k*2m darstellbare Zahl ist, dann hat die
Miller-Rabin-Folge m+1 Elemente.
Oder anders: wenn n-1 in der Binärdarstellung hinten m Nullen
hat, dann kann aus n-1 m-Mal die 2. Wurzel ganzzahlig durch
ein Shift nach rechts gezogen werden.
• Bei m=1 wird der Euler- und der Fermat-Test durchgeführt, also
bei allen Zahlen, die binär aussehen: x..x11 mit x=0 oder 1
x..x101 führt zu m=2 etc.
Beispiel:
n= 1*****...*****1000001 mit * ist 0 oder 1, m=5
ITSec – SS 2017 – Teil 14/Primzahltest
31
Leistung und Beispiel I
• Der Fermat-Test scheitert an der kleinsten Carmichael-Zahl 561,
da bei a=2: 2560 ≡ 1 (mod 561) ist.
• Für Miller-Rabin ist a=2 ein Zeuge gegen 561 als Primzahl:
s=4 und d= (561-1)/24= 560/16= 35
Berechnung der Folge
–
–
–
–
235
22*35
24*35
28*35
≡ 263 (mod 561)
≡ 166 (mod 561)
≡ 67 (mod 561)
≡
1 (mod 561)
ITSec – SS 2017 – Teil 14/Primzahltest
32
Leistung und Beispiel II
• Der Euler-Test scheitert an der Zahl 1729 zur Basis 3.
• Für a=671 wird s und d berechnet:
1729-1 = 26*27, also s=6 und d=27
– 6711*27 ≡ 1084 (mod 1729)
– 6712*27 ≡ 1065 (mod 1729)
– 6714*27 ≡ 1
(mod 1729)
• Also ist nach Miller-Rabin 1729 keine Primzahl, jedenfalls wenn
für die Probe a der Wert 671 gewählt wird.
ITSec – SS 2017 – Teil 14/Primzahltest
33
Leistung und Beispiel III
• Ist 3.057.601 eine Primzahl?
d=47.775, da n-1 = 26*47.775 ist
es wird gewählt: a=99.908 und damit entsteht folgende Folge:
– a47.775
≡ 1193206 (mod 3.057.601)
– a2*47.775 ≡ 2286397 (mod 3.057.601)
– a4*47.775 ≡ 235899 (mod 3.057.601)
– a8*47.775 ≡ 1
(mod 3.057.601)
• Also ist 3.057.601 keine Primzahl.
ITSec – SS 2017 – Teil 14/Primzahltest
34
Leistung und Beispiel IV
• Zusammengesetzte Zahlen, die den Miller-Rabin-Test
überstehen, werden starke Pseudoprimzahlen zur Basis a
genannt, wenn a die Probe ist.
Z.B. für a=2 sind es: 2047, 3277, 4033, 4681, 8321 oder zur
Basis 5: 781, 1541, 5461, 5611, 7813
• Alle starken Pseudoprimzahlen zur Basis a sind auch EulerPseudoprimzahlen (dies liegt am Test).
• Es gibt Tabellen dieser starken Pseudoprimzahlen:
– https://de.wikibooks.org/wiki/Pseudoprimzahlen:_Tabelle_Starke_Ps
eudoprimzahlen
– https://de.wikibooks.org/wiki/Pseudoprimzahlen:_Starke_Pseudopri
mzahlen
ITSec – SS 2017 – Teil 14/Primzahltest
35
Leistung und Beispiel V
• Die Wahrscheinlichkeit, dass der Test eine Pseudo-Primzahl als
wahrscheinliche Primzahl bestimmt, hängt von k – der Anzahl
der Proben - ab:
• Fehlerwahrscheinlichkeit = 0,25k
– Mit k=5 ist dieser Wahrscheinlichkeit ca. 0,1%
– Mit k=7 ca. 0,01%
– Mit k=10 ca. 0,0001%, also ca. 10-6
• Es sollte ein k von 20 in der Praxis ausreichen...
ITSec – SS 2017 – Teil 14/Primzahltest
36
Miller-Rabin-Test - Pseudocode
func bool witness(nat n>4) {
a:= select randomly in [2..n-2];
if ggT(a,n)<>1 { return true; }
compute n-1= d*2**s, d is odd
if powerMod(a,d,n)= 1 or -1 or n-1 {
return false;
} else {
for i in 1..s-1 {
val:= powerMod(a,d*2**i,n);
if val = -1 or n-1 { return false; }
if val = 1 { return true; }
od
return true;
}
}
Hinweis: Für das Arbeiten mit (positiven) Resten gilt: -1 ≡ n-1 (mod n).
ITSec – SS 2017 – Teil 14/Primzahltest
37
Miller-Rabin-Test – Pseudocode (Verbessert)
func bool witness(nat n>4) {
a:= select randomly in [2..n-2];
if ggT(a,n)<>1 { return true; }
compute n-1= d*2**s, d is odd
val:= powerMod(a,d,n);
if val = 1 {
return false;
} else {
for s-1 times {
if val = n-1 or -1 { return false; }
val:= val*val mod n;
if val =
1 { return true; }
}
return true;
}
}
ITSec – SS 2017 – Teil 14/Primzahltest
38
Bemerkung
func bool witness(nat n>4) {
a:= select randomly in [2..n-2];
...
}
Warum wird nicht mit a=n-1 geprüft?
[1]
[2]
[3]
[4]
[5]
an-1 mod n = ? (Fermat)
(n-1)n-1 mod n = (n-1)*(n-1)*(n-1)n-3 mod n
(n-1)*(n-1) mod n = n2-2*n+1 mod n = 1
(n-1)n-1 mod n = (n-1)(n-1) mod 2 mod n
Da n-1 immer gerade ist: (n-1)(n-1) mod 2 mod n = 1
n besteht bei der Basis a=n-1 immer den Fermat-Test.
Ganz analog verhält es sich beim Euler-Test.
ITSec – SS 2017 – Teil 14/Primzahltest
39
Deterministische Version des MRT I
Für die folgenden Zahlenbereiche reicht es aus, die angegeben a-Werte
für eine sichere Feststellung der prim-Eigenschaft zu benutzen.
n <
a-Werte
2.047
2
1.373.653
2,3
9.080.191
31,73
25.326.001
2,3,5
3.215.031.751
2,3,5,7
4.759.123.141
2,7,61
1.122.004.669.633
2,13,23,1662803
2.152.302.898.747
2,3,5,7,11
3.474.749.660.383
2,3,5,7,11,13
341.550.071.728.321
2,3,5,7,11,13,17
3.825.123.056.546.413.051
2,3,5,7,11,13,17,19,23
264
2,3,5,7,11,13,17,19,23,29,31,37
ITSec – SS 2017 – Teil 14/Primzahltest
40
Deterministische Version des MRT II
• Diese Werte stammen aus:
https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test
•
Oder das Original:
http://primes.utm.edu/prove/prove2_3.html
ITSec – SS 2017 – Teil 14/Primzahltest
41
Praktische Vorgehensweise
• Anhand einer Tabelle von kleinen Primzahlen wird als erstes mit
der Probedivision auf prim-Eigenschaft geprüft.
• Dann wird mit dem Miller-Rabin-Verfahren mindestens 20x
geprüft. Das BSI empfiehlt 50 Runden.
• Eine Zahl, die beide Phasen als Kandidat übersteht, wird als
Primzahl geglaubt.
• Wenn die Primzahlen für das RSA-Verfahren bestimmt wurden,
wird als Teil der Schlüsseldefinition mit einem festen String eine
Probever- und Entschlüsselung durchgeführt. Die
Entschlüsselung sollte bei einer zusammengesetzten Zahl
scheitern (wegen der Benutzung des Euler-Satzes).
ITSec – SS 2017 – Teil 14/Primzahltest
42
Links zum eigenen Ausprobieren
http://www.javascripter.net/math/primes/millerrabinprimalitytest.htm
http://www.javascripter.net/math/calculators/primefactorscalculator.htm
http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm
http://leemon.com/crypto/BigInt.html
ITSec – SS 2017 – Teil 14/Primzahltest
43
Nach dieser Anstrengung etwas Entspannung....
Auch ein nicht so einfach zu durchquerender Sumpf...
ITSec – SS 2017 – Teil 14/Primzahltest
44
Herunterladen