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