Algoritmes en Priemgetallen

advertisement
Algoritmes en Priemgetallen
Hoe maak je een sleutelpaar voor RSA?
Het recept van RSA
• Kies 𝑝 ≠ 𝑞 priemgetallen en bepaal 𝑁 = 𝑝𝑞
• Kies 𝑒 ∈ 𝑍𝑁∗ (publieke sleutel)
• Bepaal 𝑑 ≡ 𝑒 −1 𝑚𝑜𝑑 𝜙 𝑁
• 𝑥
𝑒𝑑
≡ 𝑥 𝑘𝜙
𝑁 +1
(privésleutel)
≡ 𝑥 𝑚𝑜𝑑 𝑁
• Maar…. Hoe kom je aan 𝑝 en 𝑞?
WOW!
Priemzeven – Zeef van Eratostenes
• Manier om priemgetallen ≤ 𝑁 te berekenen
• Maak tabel 2 … 𝑁
• Herhaal: markeer eerste getal als priem,
streep alle veelvouden ervan weg
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Priemzeven – Zeef van Eratostenes
• Manier om priemgetallen ≤ 𝑁 te berekenen
• Maak tabel 2 … 𝑁
• Herhaal: markeer eerste getal als priem,
streep alle veelvouden ervan weg
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Priemzeven – Zeef van Eratostenes
• Manier om priemgetallen ≤ 𝑁 te berekenen
• Maak tabel 2 … 𝑁
• Herhaal: markeer eerste getal als priem,
streep alle veelvouden ervan weg
2
3
7
5
9
13
17
15
19
23
11
21
26
Priemzeven – Zeef van Eratosthenes
• Voor ieder priemgetal 𝑝 bekijk je
van dat getal
•
𝑁
𝑝≤𝑁 𝑝𝑟𝑖𝑒𝑚 𝑝
𝑁
𝑝
veelvouden
= 𝑂 𝑁 log log 𝑁
• Afhankelijk van of je voor optellen 𝑂(1) of
𝑂(log 𝑁) telt dus 𝑂 𝑁 log log 𝑁 of
𝑂 𝑁 log log 𝑁 ∗ log 𝑁
• Merk op:
•
𝑝 𝑝𝑟𝑖𝑒𝑚
1
𝑝
1+ +
(neem links en rechts log en doe wat trucjes)
1
𝑝2
+⋯ =
1
𝑛𝑛
Verbetering: wielzeven
• In je tabel zet je onnodig 2-vouden neer,
beschouw alleen getallen v.d. vorm 2𝑘 + 1
• Factor 2 sneller!
• 3-vouden zijn ook zinloos. Bekijk 6𝑘 ± 1
• Factor 3 sneller
Verbetering: wielzeven
• In je tabel zet je onnodig 2-vouden neer,
beschouw alleen getallen v.d. vorm 2𝑘 + 1
• 3-vouden zijn ook zinloos. Bekijk 6𝑘 ± 1
• Sneller: bekijk getallen v.d. vorm 30𝑘 + 𝑎,
𝑎 ∈ 1,7,11,13,17,19,23,29
• Meer dan 4 × sneller!
Verdere verbetering
• Met nog slimmer wielzeven kan je naar
𝑂( 𝑁) geheugen en 𝑂 𝑁 log 𝑁 tijd
• Atkins doet het nog sneller: 𝑂
𝑁 log 𝑁
log log 𝑁
tijd
• Truucje: kwadraatvrije 𝑛 ≢ 1 𝑚𝑜𝑑 4 is
priem desda 4𝑥 2 + 𝑦 2 = 𝑛 een oneven aantal
gehele oplossingen heeft.
Zeven is niet de oplossing
• Als wij snel een lijst van priemgetallen kunnen
maken kan een aanvaller dat ook!
• Nieuwe strategie: genereer random getal 𝑛 en
test of het priem is
• Priemgetal dat ongeveer 𝑁 groot is maken: ~1 op
de log 𝑁 getallen is priem dus verwacht log(𝑁)
keer proberen
Priemtesten - naïef
• Probeer een getal 𝑁 te delen door alle
getallen ≤ 𝑁
• Voor 𝑘-bits 𝑁 moeten we alle 𝑘/2-bits
getallen proberen 𝑂 2𝑘/2 = 𝑂(𝑁)
• Het delen kost tijd 𝑘 2 dus we zitten aan
𝑂
𝑁𝑙𝑜𝑔2 𝑁
• Duurder dan zeven! (en exponentieel!)
Priemtesten - Fermat
• Stelling v. Fermat: als 𝑝 priem is en 𝑎 ∈ ℕ dan
𝑎𝑝−1 ≡ 1 (𝑚𝑜𝑑 𝑝)
Priemtesten - Fermat
• Stelling v. Fermat: als 𝑝 priem is en 𝑎 ∈ ℕ dan
𝑎𝑝−1 ≡ 1 (𝑚𝑜𝑑 𝑝)
PriemTest(n)
a = RandInt()
als 𝑎𝑛−1 ≢ 1 (𝑚𝑜𝑑 𝑛) RETURN false
RETURN true
Priemtesten - Fermat
• Stelling v. Fermat: als 𝑝 priem is en 𝑎 ∈ ℕ dan
𝑎𝑝−1 ≡ 1 (𝑚𝑜𝑑 𝑝)
PriemTest(n)
a = RandInt()
als 𝑎𝑛−1 ≢ 1 (𝑚𝑜𝑑 𝑛) RETURN false
RETURN soort-van-true
Priemtesten - Fermat
• Bijna-ware-stelling: als 𝑛 niet priem is en
𝑎 ∈ [1, … , 𝑛] willekeurig dan
𝑎𝑛−1 ≢ 1 (𝑚𝑜𝑑 𝑛)
met kans 𝑃 =
1
.
2
Consequentie: als PriemTest(𝑛) 𝑘 keer bijna-true
geeft dan is 𝑛 priem met kans 1 −
1 𝑘
2
10 keer testen geeft al 99,9% kans op goed
antwoord!
Carmichaelgetallen
• Er zijn helaas getallen die niet priem zijn en
waarvoor toch 𝑎𝑛−1 ≡ 1 (𝑚𝑜𝑑 𝑛) voor alle 𝑎.
• De kleinste is 561, de volgende 1105
1
3
• Ze zijn zeldzaam, maar er zijn er 𝑂(𝑁 )
• Er zijn asymptotisch meer priemgetallen, dat
zijn er 𝑂
𝑁
log 𝑁
Miller-Rabin
• Gebruikt een iets andere stelling
• Het idee is hetzelfde: kies random getal 𝑎 en
draai dit door de stelling
• Geen carmichaelgetallen: als een getal 𝑛 niet
priem is dan bewijst 75% v.d. getallen uit
[0, … , 𝑛] dat 𝑛 niet priem is.
Miller-Rabin en Fermat
• Ze draaien in 𝑂(log 3 𝑁)
• Monte-Carlo: een niet-priem-antwoord is
altijd correct maar een priem-antwoord is heel
soms fout
• Fermat heeft last van Carmichaelgetallen,
Rabin niet
AKS-test
• “PRIMES is in P”, paper uit 2002
• Eerste polynomiale én deterministische
priemtest
• Sterkere stelling: een getal 𝑛 is priem desda
𝑥 − 𝑎 𝑛 ≡ 𝑥 𝑛 − 𝑎 𝑚𝑜𝑑 𝑛 voor alle 𝑛
met gcd 𝑎, 𝑛 = 1
AKS-test
• Sterkere stelling: een getal 𝑛 is priem desda
𝑥 − 𝑎 𝑛 ≡ 𝑥 𝑛 − 𝑎 𝑚𝑜𝑑 𝑛 voor alle 𝑛
met gcd 𝑎, 𝑛 = 1
• Dit kost te veel tijd om te checken
• Het is voldoende als het modulo het
polynoom 𝑥 𝑟 − 1 geldt
• Alleen checken voor bepaalde combinaties
van 𝑎 en 𝑟!
AKS-test
• De looptijd is 𝑂(log12 𝑁) en misschien ook
𝑂(log 6 𝑁) (nog onbewezen vermoeden)
• Voor een 1024-bits getal ben je in het
gunstigste geval 36 jaar bezig (bij 1 GHz)
• Theoretisch van groot belang, niet echt
geschikt voor real-life
Genereren van een priemgetal
• Dictaat Cryptografie – “er is geen algoritme
bekend dat rechtstreeks uit random bits een
priemgetal genereert”
• Strategie die door de Amerikaanse overheid
(NIST) wordt aangeraden:
– Maak random getal 𝑛 van 𝑘 bits
– Draai 40 iteraties van Miller-Rabin en test of 𝑛
priem is
– Herhaal tot je een priemgetal hebt gevonden
Genereren van een priemgetal
• Strategie die door de Amerikaanse overheid
(NIST) wordt aangeraden:
– Maak random getal 𝑛 van 𝑘 bits
– Draai 40 iteraties van Miller-Rabin en test of 𝑛 priem
is
– Herhaal tot je een priemgetal hebt gevonden
• 1 op log(𝑁) getallen is priem, verwacht log(𝑁)
keer proberen
• In verwacht 𝑂(log 4 𝑁) tijd heb je een
waarschijnlijk priemgetal
Genereren van een priemgetal
• De kans dat het fout is is superklein (10−24 )
• 2048-bits key in ~2 minuten
Deterministische priemgetalgeneratie
• Stel nu dat je zeker wilt weten dat het goed is
• Vervang Miller-Rabin door AKS => te sloom
Deterministische priemgetalgeneratie
• Stel nu dat je zeker wilt weten dat het goed is
• Vervang Miller-Rabin door AKS => te sloom
• Maurer’s algoritme: genereert een bewijsbaar
priemgetal in verwacht 𝑂
• (sneller dan Miller-Rabin!)
log4 𝑁
log log 𝑁
tijd
Stelling van Pocklington
Zij 𝑝 een priemgetal en kies 𝑅 zodat 𝑞 ∤ 𝑅.
Bepaal 𝑛 = 𝑞 𝑘 𝑅 + 1. Als er een getal 𝑎 ∈ ℕ
bestaat met de eigenschappen
1. 𝑎𝑛−1 ≡ 1 (𝑚𝑜𝑑 𝑛)
2. gcd 𝑎
𝑛−1
𝑞
,𝑛 = 1
dan is iedere priemfactor 𝑝 van 𝑛 van de vorm
𝑝 = 𝑞 𝑘 𝑟 + 1, waarbij 𝑟 ∈ [1, … , 𝑅].
Idee van Maurer
• Om een 𝑘-bits priemgetal te maken:
– Maak recursief een 𝑘/2-bits priemgetal 𝑞
– Kies 𝑅 random 𝑘/2-bits getal en maak 𝑛 = 2𝑅𝑞 + 1
– Probeer een 𝑎 te vinden die aan het lemma van
Pocklington voldoet (probeer zonodig met een nieuwe
1
𝑅). De kans dat dit lukt is gigantisch (> 1 − ).
𝑞
– Dan geldt dat iedere priemdeler van 𝑛 van de vorm
𝑞 𝑘 𝑟 + 1 is. 𝑞 > 𝑛 dus iedere priemdeler is > 𝑛
maar er kan alleen een (echte) priemdeler > 𝑛 zijn
als er ook een < 𝑛 is
Maurer’s Algoritme
• Maurer beveelt nog wat optimalisaties aan
• Het loopt in verwacht 𝑂
log4 𝑁
log log 𝑁
tijd
• Gegarandeerd een kloppend priemgetal
Samenvatting
• Fermat-test: Monte-Carlo (kleine kans op fout),
heeft last van Carmichaelgetallen
• Miller-Rabin-test: ook Monte-Carlo, 𝑂(log 3 𝑁)
• AKS-test: deterministisch, 𝑂 log12 𝑁 , misschien
𝑂 log 6 𝑁
• Priemgetallen maken met Miller-Rabin
– 𝑂(log 4 𝑁)
– Levert waarschijnlijk een goed priemgetal
• Priemgetallen maken met Maurer
– Verwacht 𝑂
log4 𝑁
log log 𝑁
tijd
– Levert gegarandeerd een goed priemgetal
Download