MI-MPI, Přednáška č. 11 Karel Klouda karel.klouda@fit.cvut.cz c KTI, FIT, ČVUT v Praze 18. dubna, letní semestr 2010/2011
RSA potřiapadesáté šifrování Co potřebuje k zašifrování zprávy x: číslo n, které je součinem dvou prvočísel n = pq, exponent e, který je nesoudělný s ϕ(n), tyto dvě čísla tvoří veřejný klíč k pub = (n, e) Šifrování: y x e (mod n) kde šifrovaná zpráva x musí být ze Z n, tzn. musíme vzít n dostatečně velké anebo x rozdělit na více částí, zašifrovaná zpráva y pak nutně vyjde také jako prvek Z n.
RSA potřiapadesáté šifrování Co potřebuje k dešifrování zprávy y: soukromý klíč k pr = d, který má tuto speciální vlastnost: pro všechna z Z n (z e ) d = z ed z (mod n) Dešifrování: x = y d x ed (mod n) To, že vyjde opět šifrovaná zpráva x nám zaručuje výše uvedená speciální vlastnost pro z = x.
RSA potřiapadesáté příklad šifrovaná zpráva x = 4, veřejný klíč k pub = (n, e), kde n = 33 = 3 11 a e = 3 (nesoudělné s ϕ(33) = 20), soukromý klíč d = 7. Šifrování: y x e (mod n) = 4 3 (mod 33) = 31, tedy zašifrovaná zpráva je y = 31. Dešifrování: y d = 31 7 = 27512614111 4 (mod 33). Tedy skutečně získáváme původní zprávu!
RSA potřiapadesáté dílčí problémy Co potřebujeme: vygenerovat dvě veliká prvočísla p a q, aby n = pq bylo dostatečně vysoké: n by mělo mít více jak 1024 bitů, tedy p a q musí mít kolem 512 bitů!! vhodně zvolit e nesoudělné s ϕ(n) = (p 1)(q 1), najít soukromý klíč d s požadovanou vlastností nutnou k dešifrování, umět rychle mocnit x e a y d modulo n, bez takového rychlého mocnění by RSA bylo k ničemu!
RSA potřiapadesáté dílčí problémy Co potřebujeme: vygenerovat dvě veliká prvočísla p a q, aby n = pq bylo dostatečně vysoké: n by mělo mít více jak 1024 bitů, tedy p a q musí mít kolem 512 bitů!! později testování prvočíselnosti vhodně zvolit e nesoudělné s ϕ(n) = (p 1)(q 1), najít soukromý klíč d s požadovanou vlastností nutnou k dešifrování, umět rychle mocnit x e a y d modulo n, bez takového rychlého mocnění by RSA bylo k ničemu! umíme pomocí square & multiply
Volba e Hledání n = pq se budeme věnovat později, nyní se zaměřme na druhou složku veřejného klíče, exponent e. Toto číslo je veřejné, takže není třeba, aby bylo neuhodnutelné. Jediné kritérium je, aby se při znalosti e, n a y nedalo zjistit x z rovnice y x e (mod n). Tomuto problému se obecně říká root finding (hledání odmocniny).
Root finding modulární odmocnina Pro neprvočíselné n je problém nalezení odmocniny už pro e = 2 (druhá odmocnina) stejně těžký jako faktorizace n. To že jsou stejně těžké znamená, že existuje (v tomto případě pravděpodobnostní) polynomiální algoritmus, který převádí jeden z těchto problémů na ten druhý. Vyřešit rovnici y x e (mod n). pro známé e, n a y umíme efektivně pouze pro případ, že n je prvočíslo nebo mocnina jednoho prvočísla.
Druhá odmocnina a kvadratická rezidua Naznačíme si, jak hledat druhou odmocninu pro n = p prvočíslo, kde navíc p 3 (mod 4). Hledáme x tak, aby pro dané y y x 2 (mod p).
Druhá odmocnina a kvadratická rezidua Naznačíme si, jak hledat druhou odmocninu pro n = p prvočíslo, kde navíc p 3 (mod 4). Hledáme x tak, aby pro dané y y x 2 (mod p). Aby řešení mohlo vůbec existovat, musí být y kvadratické reziduum a to platí právě když je Legendrův symbol roven 1, tedy y p 1 2 1 (mod p). Bud p = 4k + 3, potom (y k+1 ) 2 = y 2(k+1) = y p+1 2 y (mod p). a hledané x = y k+1 (mod p).
Druhá odmocnina a kvadratická rezidua příklad Bud p = 683 = 170 4 + 3, tedy k = 170. Necht y = 120, hledáme x tak, že 120 x 2 (mod 683). Je 120 kvadratické reziduum (tj. existuje vůbec řešení)? 120 683 1 2 = 120 341 1 (mod 683) a tedy 120 je kvadratické reziduum a řešení existuje. Položme x = 155 120 171 (mod 683), potom skutečně 155 2 = 24025 = 35 683 + 120!
Volba e pro RSA Jelikož na velikosti e nezáleží (je to těžké už pro e = 2), volí se e v RSA tak, aby se co nejvíce zkrátilo šifrování (mocnění na e) y = x e (mod n). To probíhá (samozřejmě) pomocí algoritmu square & multiply. Obvyklé volby jsou v násl. tabulce: veřejný klíč e binární zápis počet operací v S&M alg. 3 11 3 17 10001 5 2 16 + 1 1 0000 0000 0000 0001 17 Musí být stále splněno gcd(e, ϕ(n)) = 1!! To se kontroluje pomocí EA (Eukl. algoritmu), pokud to neplatí, musíme zvolit jiné e a opět otestovat pomocí EA.
Soukromý klíč d Volba soukromého klíče d závisí na volbě e. Chceme, aby pro všechna x Z n platilo x ed x (mod n) tj. musí jít dešifrovat jakákoli zpráva x. Takové d vždy existuje a získá se z této rovnice: e d 1 (mod ϕ(n)).
Soukromý klíč d trocha teorie Víme, že Z m \ {0} tvoří grupu pouze pokud je m prvočíslo. V takovém případě má každý prvek e inverzi d = e 1 tak, že e d 1 (mod m).
Soukromý klíč d trocha teorie Víme, že Z m \ {0} tvoří grupu pouze pokud je m prvočíslo. V takovém případě má každý prvek e inverzi d = e 1 tak, že e d 1 (mod m). Není-li ale m prvočíslo, Z m \ {0} grupu netvoří, nebot je-li m = s t, pak součin z množiny Z m \ {0} vyleze. s t 0 (mod m)
Soukromý klíč d trocha teorie Víme, že Z m \ {0} tvoří grupu pouze pokud je m prvočíslo. V takovém případě má každý prvek e inverzi d = e 1 tak, že e d 1 (mod m). Není-li ale m prvočíslo, Z m \ {0} grupu netvoří, nebot je-li m = s t, pak součin z množiny Z m \ {0} vyleze. s t 0 (mod m) Aby Z m byla grupa s násobením modulo m, musíme z ní vyjmout nulu a všechna čísla soudělná s m!
Soukromý klíč d příklad Je-li n v RSA rovno 33 a e = 3, hledáme d jako inverzi k e vůči násobení modulo ϕ(33) = 20, tj. chceme aby 3 d 1 (mod 20). Takové d existuje (d = 7), nebot 3 je nesoudělné s 20!!
Soukromý klíč d příklad Je-li n v RSA rovno 33 a e = 3, hledáme d jako inverzi k e vůči násobení modulo ϕ(33) = 20, tj. chceme aby 3 d 1 (mod 20). Takové d existuje (d = 7), nebot 3 je nesoudělné s 20!! Pro volbu e = 5 bychom takové d nenašli: 5 1 5 (mod 20), 5 2 10 (mod 20), 5 3 15 (mod 20), 5 4 0 (mod 20), 5 5 5 (mod 20)... tj. 5 nemá inverzi vzhledem k násobení modulo 20.
Soukromý klíč d příklad (pokrač.) Všechny volby e, pro které existuje inverze d jsou tyto: 1, 3, 7, 9, 11, 13, 17, 19. Tyto čísla s násobením modulo 20 tvoří grupu a jsou to jediné možné volby e pro RSA s n = 33. Inverze těchto prvků jsou e 1 3 7 9 11 13 17 19 d = e 1 1 7 3 9 11 17 13 19
Jak najít d, známe-li ϕ(n) Pro daný veřejný klíč k pub = (n, e) najdeme d pomocí (polynomiálního) EEA (rozšířený eukl. algoritmus): gcd(ϕ(n), e) = 1 = s ϕ(n) + t e, kde s a t dostaneme z EEA. Klademe d t (mod ϕ(n)).
Jak najít d, známe-li ϕ(n) Pro daný veřejný klíč k pub = (n, e) najdeme d pomocí (polynomiálního) EEA (rozšířený eukl. algoritmus): gcd(ϕ(n), e) = 1 = s ϕ(n) + t e, kde s a t dostaneme z EEA. Klademe d t (mod ϕ(n)). Tedy známe-li faktorizaci n = pq, snadno spočítáme ϕ(n) = (p 1)(q 1) a pomocí EEA i soukromý klíč d.
Jak najít d, neznáme-li ϕ(n) Neznáme-li ϕ(n), těžko spočítáme d. Naopak známe-li jej, získáme d snadno. Důležitá pro bezpečnost RSA je tedy násl. Otázka: Jak je složité zjistit hodnotu ϕ(n)?
Jak najít d, neznáme-li ϕ(n) Neznáme-li ϕ(n), těžko spočítáme d. Naopak známe-li jej, získáme d snadno. Důležitá pro bezpečnost RSA je tedy násl. Otázka: Jak je složité zjistit hodnotu ϕ(n)? Odpověd : Stejně složité, jako najít faktorizaci n. Důkaz. Známe-li faktorizaci n = pq, snadno spočítáme ϕ(n) = (p 1)(q 1).
Jak najít d, neznáme-li ϕ(n) Neznáme-li ϕ(n), těžko spočítáme d. Naopak známe-li jej, získáme d snadno. Důležitá pro bezpečnost RSA je tedy násl. Otázka: Jak je složité zjistit hodnotu ϕ(n)? Odpověd : Stejně složité, jako najít faktorizaci n. Důkaz. Známe-li faktorizaci n = pq, snadno spočítáme ϕ(n) = (p 1)(q 1). Známe-li hodnotu ϕ(n), dostávám pro p a q dvě rovnice: pq = n (p 1)(q 1) = pq (p + q) + 1 = ϕ(n) a z nich dostaneme snadno řešitelnou rovnici p 2 (n ϕ(n) + 1)p + n = 0.
Volba d v praxi Zatímco e může být zvolen krátký, aby se zkrátilo šifrování (= mocnění na e), d by měl být naopak dlouhý, aby odolal brute-force útokům. Doporučuje se alespoň třetina bitů čísla n, ale často se používá prostě srovnatelná délka. Dlouhé d ale zesložit uje dešifrování (= mocnění na d), existuje ale urychlující procedura založená na čínské větě o zbytcích (viz minulé přednášky).
Urychlení dešifrování čínská věta o zbytcích Věta (Čínská věta o zbytcích připomenutí) Necht n 1,..., n k jsou navzájem nesoudělná čísla a necht n = k i=1 n i. Pro libovolnou k-tici r 1 Z n1,..., r k Z nk existuje jednoznačně určený r Z n tak, že Platí r r i (mod n i ) for all i = 1,..., k. r = kde pro všechna i a j i k i=1 r i m i n n i (mod n) m i n n i 1 (mod n i ) a m i n n i 0 (mod n j ). Tzn. r lze spočítat v polynomiálním čase.
Urychlení dešifrování Počítáme x = y d (mod n). 1. najdi a podobně 2. vypočti y p y (mod p) a y q y (mod q), d p d (mod p 1) a d q d (mod q 1), x p y dp p (mod p) a x q y dq q (mod q), 3. platí kde x = (qc p )x p + (pc q )x q (mod n) c p q 1 (mod p) a c q p 1 (mod q).
Necht Urychlení dešifrování příklad p = 11, q = 13, n = 11 13, e = 7, d = 103. Zašifrovaný text je y = 15, máme a tedy y p = 4 15 (mod 11) a y q = 2 15 (mod 113), d p = 4 3 (mod 10) a d q = 7 103 (mod 12), x p = 9 4 3 y dp p (mod 11) a x q = 11 2 7 y dq q (mod q) a konečně c p = 13 1 2 1 6 (mod 11) a c p = 11 1 6 (mod 13) x (qc p )x p + (pc q )x q (13 6)9 + (11 6)11 141 (mod 143).
Urychlení dešifrování proč to funguje Použijeme čínskou větu o zbytcích pro n 1 = p, n 2 = q a pro r 1 = x p a r 2 = x q. Jistě dešifrovaná zpráva x splňuje x y d y k(p 1)+dp y dp x p (mod p) kde d = k(p 1) + d p. Využili jsme toho, že p je prvočíslo a tedy v multipl. grupě Z p je cokoli umocněno na p 1 rovno 1. Podobně se ukáže x x q (mod q) a tedy dešifrovaná zpráva hraje roli jednoznačně určeného r z čínské věty o zbytcích! A vzoreček pro výpočet r známe... (pořádně dorozmyslet!)
Urychlení dešifrování jak jsme to urychlili? Bud t počet bitů čísla n a tedy i d. V praxi se p a q volí cca t/2 bitové. Klasické použití S&M vyžaduje 1, 5t operací násobení a umocňování na 2. Pří použití urychlení, provádíme dvě umocnění x p y dp p (mod p) a x q y dq q (mod q), kde d p a d q mají cca t/2 bitů. Ostatní operace jsou vzhledem k tomuto mocnění zanedbatelné (nebo se dají předpočítat). Celkem tedy 2 1, 5 t 2 = 1, 5t. Tedy zdánlivě žádné zlepšení, ale násobení (se složitostí O(t 2 )) se provádí s o polovinu kratšími čísly, tedy výsledný čas je čtvrtinový! (opravdu se používá v praxi!!)
Dešifrování proč to funguje Věta Při volbě d popsané výše platí tj. RSA funguje. x y d (mod n),
Dešifrování proč to funguje Věta Při volbě d popsané výše platí tj. RSA funguje. x y d (mod n), Důkaz. Platí d e 1 (mod ϕ(n)), tedy d e = kϕ(n) + 1. První případ: je-li gcd(x, n) = 1, je dle Eulerovy věty x d e = x kϕ(n)+1 = x kϕ(n) x 1 x (mod n)
Dešifrování proč to funguje Důkaz. Platí d e 1 (mod ϕ(n)), tedy d e = kϕ(n) + 1. První případ: je-li gcd(x, n) = 1, je dle Eulerovy věty x d e = x kϕ(n)+1 = x kϕ(n) x 1 x (mod n) Druhý případ: je-li gcd(x, n) = gcd(x, p q) = 1, musí být x násobek p nebo q, necht x = r p a tedy gcd(x, q) = 1. Potom opět podle Eulerovy věty x ϕ(n)k = x (q 1)(p 1)k = (x ϕ(q) ) (p 1)k 1 (p 1)k (mod q), existuje tedy u Z tak, že x ϕ(n)k = 1 + u q a máme x d e = x x ϕ(n)k = x+x u q = x+r p u q = x+r u n x (mod n).
RSA shrnutí Ukázali jsme si: jak RSA funguje a jak musíme volit jeho parametry, že RSA funguje a proč, že všechny (matematické) útoky vyžadují faktorizaci n, nebo nějaký stejně složitý či ještě složitější úkon, jak urychlit šifrování (bezpečná volba malého e) a dešifrování (čínská věta o zbytcích).
Faktorizace n state of the art Díky obrovské rozšířenosti RSA se prudce navýšil zájem o problém faktorizace čísel na prvočíselný rozklad. Dokonce: RSA Laboratories vyhlásili RSA Factoring Challenge, kde můžete za faktorizaci jednoho n ze seznamu RSA-čísel získat slušné peníze. Poslední (12.12.2009) rozluštěné bylo číslo RSA-768 (768 bitů, 232 desetinných, 50 000 USD), využito ekvivalentu 2000 hodin single core 2.2 GHz AMD Opteron. [zdroj: wikipedia.org]
RSA poslední ingredience Poslední, co ještě neznáme a co nám chybí k tomu, abychom byli s to RSA implementovat, je nějaké efektivní generování velkých prvočísel p a q. Algoritmy, které si ukážeme, jsou pravděpodobnostní a fungují zhruba takto: 1. vyber náhodně číslo požadované velikosti, 2. otestuj jestli je to prvočíslo, 3. pokud ano, skonči, pokud ne, jdi zpět do kroku 1.
Testování prvočíselnosti obtížnost Řešíme dva spojené rozhodovací problémy PRIMALITY: je dané číslo prvočíslo? COMPOSITENESS: je dané číslo složené? Je snadno vidět, že COMPOSITENESS je NP a méně snadno se dá ukázat, že PRIMALITY je též NP. Z toho důvodu se neočekává, že by byli NP-úplné, spíše se věří, že obtížnost PRIMALITY je někde mezi P a NP-úplnými problémy.
Naivní přístup Pro dané číslo n: for k = 1,..., s 1. zvol náhodně a {2, 3,..., n 2}, 2. if gcd(a, n) 1, return n je složené return n je prvočíslo
Naivní přístup Pro dané číslo n: for k = 1,..., s 1. zvol náhodně a {2, 3,..., n 2}, 2. if gcd(a, n) 1, return n je složené return n je prvočíslo Analýza: Je-li výsledek n je složené, je n určitě složené číslo. Ovšem v případě výsledku n je prvočíslo se mohlo stát, že jsme ani jednou netrefili číslo soudělné se složeným n. Je-li n = p q, je čísel soudělných s n méně než p + q (násobky q plus násobky p) a tedy pravděpodobnost chyby je (p + q)/n 2/ n a to je příliš (s by muselo být obrovské).
Fermatův test myšlenka Díky Fermatově větě víme, že pro prvočíslo p a pro každé a {1,..., p 1} platí Fermatova kongruence a p 1 1 (mod p).
Fermatův test myšlenka Díky Fermatově větě víme, že pro prvočíslo p a pro každé a {1,..., p 1} platí Fermatova kongruence a p 1 1 (mod p). Bud nyní n libovolné číslo: Jistě platí, že pokud pak n je složené. a n 1 1 (mod n). Tj., kdyby byla relativně vysoká pravděpodobnost toho, že pro náh. vybrané a je Fermatova kongruence narušena, lze to použít jako klíčový krok pravděpodobnostního algoritmu.
Fermatův test algoritmus Algoritmus (Fermatův test) Input: číslo n, parametr s Output: n je složené nebo n je prvočíslo Algoritmus: (1) for k = 1,..., s (1.1) zvol náhodně a {2, 3,..., n 2}, (1.2) if a n 1 1 (mod n), return n je složené (2) return n je prvočíslo
Fermatův test Achillova pata Fermatův test funguje velmi dobře pro drtivou většinu n, ale existují bohužel čísla, pro která zcela selže: Definice Složené číslo n se nazývá Carmichaelovo, pokud pro všechna a nesoudělná s n. a n 1 1 (mod n)
Fermatův test Achillova pata Fermatův test funguje velmi dobře pro drtivou většinu n, ale existují bohužel čísla, pro která zcela selže: Definice Složené číslo n se nazývá Carmichaelovo, pokud pro všechna a nesoudělná s n. a n 1 1 (mod n) Pro Carmichaelova čísla Fermatův test selže, pokud (velkou) náhodou netrefíme a soudělné s n. Carmichaelových čísel je bohužel nekonečně mnoho, i když jsou velmi řídká: menších než 10 15 jich je cca 100 000.
Bez Carmichaelových čísel by to fungovalo... Označme množinu čísel nesoudělných s n jako Z n (je to mult. grupa!). Věta Bud n složené ne-carmichaelovo číslo. Potom počet čísel a Z n nesplňujících Fermatovu kongruenci je více než 0, 5 #Z n = 0, 5 ϕ(n).
Bez Carmichaelových čísel by to fungovalo... Označme množinu čísel nesoudělných s n jako Z n (je to mult. grupa!). Věta Bud n složené ne-carmichaelovo číslo. Potom počet čísel a Z n nesplňujících Fermatovu kongruenci je více než 0, 5 #Z n = 0, 5 ϕ(n). Důkaz. Označme F n = {a Z n a n 1 1 (mod n)}. Jistě F n Z n, jinak by n bylo Carmichaelovo nebo prvočíslo. Snadno se ukáže, že F n s násobením modulo n tvoří grupu a tedy i (vlastní) podgrupu Z n. Platí tedy, že řád F n dělí řád Z n a tedy musí být #Z n 2 a důkaz je hotov.
Fermatův test info Nebýt Carmichaelových čísel, byla by pravděpodobnost toho, že algoritmus vrátí n je prvočíslo pro n složené vždy menší než 2 s, n je složené je vždy správná odpověd, nejmenší Carmichaelovo číslo je 561 = 3 11 17, problém s Carmichaelovými čísly řeší Rabin-Millerův test...
Rabin-Miller myšlenka Věta Pro přirozené liché n označme čísla u a r tak, že n 1 = 2 u r (r liché). Pokud najdeme přirozené a takové, že a r 1 (mod n) a a r2j 1 (mod n) pro všechna j {0, 1,..., u 1}, je n složené. Jinak je n pravděpodobně prvočíslo. Jedná se o vylepšení kritéria daného Fermatovou větou, princip algoritmu zůstává stejný.
Rabin-Millerův test Algoritmus (Rabin-Millerův test) Input: číslo n, n 1 = 2 u r a parametr s Output: n je složené nebo n je prvočíslo Algoritmus: (1) for k = 1,..., s (1.1) zvol náhodně a {2, 3,..., n 2}, (1.2) z a r (mod n) (1.3) if z 1 and z n 1 for j = 0,..., u 1 z z 2 (mod n) if z = 1, return n je složené (1.5) if z = n 1, break % tj. začni s dalším náhodným a (2) return n je prvočíslo
Rabin-Millerův test příklad Bud n = 91 a tedy n 1 = 90 = 2 45. tj. r = 45 a u = 1. Volím náhodně a a počítám: 1. a = 12: z = 12 45 90 (mod 91) pokračuji 2. a = 17: z = 17 45 90 (mod 91) pokračuji 3. a = 38: z = 38 45 90 (mod 91) pokračuji 4. a = 39: z = 39 45 78 (mod 91) return n je složené
Rabin-Millerův test info n je složené je vždy správná odpověd, pravděpodobnost chybného výsledku n je prvočíslo pro n složené je (výrazně) menší než 4 n, Rabin-Millerův test může být zdeterminizován, pokud platí tzv. zobecněná Riemannova hypotéza (pak stačí projít cca 2(log n) 2 nejmenších a), i když se věří, že tato hypotéza platí, používá se v praxi pravděpodobnostní verze.
Odbočka Riemannova hypotéza Riemannova hypotéza je momentálně asi nejslavnější navyřešený matematický problém: Riemannova hypotéza: Všechny netriviální kořeny zeta-funkce ζ(s) = mají reálnou část 1/2. n=1 1 n s, s C \ {1}
Odbočka Riemannova hypotéza Riemannova hypotéza je momentálně asi nejslavnější navyřešený matematický problém: Riemannova hypotéza: Všechny netriviální kořeny zeta-funkce ζ(s) = mají reálnou část 1/2. n=1 1 n s, s C \ {1} Souvislost s prvočísly je dána Eulerovým výsledkem: ζ(s) = p prvoč. 1 1 p s.
Jacobiho symbol Definice (Legendrův symbol) Pro p prvočíslo 3 a a nenulové celé číslo klademe [ ] a = a p 1 2 (mod p). p
Jacobiho symbol Definice (Legendrův symbol) Pro p prvočíslo 3 a a nenulové celé číslo klademe [ ] a = a p 1 2 (mod p). p Zobecnění i pro složená čísla Definice (Jacobiho symbol) Pro n liché číslo s faktorizací n = p k 1 nesoudělné s n klademe [ a ] = n 1 pk 2 t [ ] a ki. i=1 p i 2 pk t t a pro a Steně jako pro Legendrův symbol platí, že hodnota Jacobiho
Vlastnosti Jacobiho symbolu Platí následující: 1. [ ] [ ab n = a ] [ n b ] n 2. pro a b (mod n) platí [ [ a n] = b ] n 3. Pro lichá a nesoudělná a a n platí [ a ] [ = ( 1) a 1 n 1 n 2 2 n a] 4. [ 1 n] = 1 5. [ 2 n ] = { 1 pro n 3 nebo 5 (mod 8) 1 pro n 1 nebo 7 (mod 8)
Výpočet Jacobiho symbolu Předchozí větu lze využít ke konstrukci polynomiálního algoritmu vyčíslujícího Jacobiho symbol. Example [ 191 ] 279 = ( 1) [ ] 279 191 = ( 1) [ ] 88 191 = ( 1) [ ] 2 3 [ 11 ] 191 191 = ( 1) 2 (+1) 3 [ ] 191 11 = [ ] 4 11 (3. vlastnost) (2. vlastnost) (1. vlastnost) (5. a 3. vlastnost) (2. vlastnost) = [ 2 11] 2 (1. vlastnost) = ( 1) 2 (5. vlastnost) = 1
Jacobiho symbol myšlenka Definice Pro liché číslo n definujeme množinu { [ a ] } J n = a Z n a n 1 2 (mod n) n Věta Platí: pro n prvočíslo je J n = Z n, pro n složené je #J n #Z n 1 2. Tedy opět můžeme zkonstruovat algoritmus s pravděpodobností chyby 2 s pro parametr s.
Jacobiho symbol algoritmus Algoritmus Input: číslo n, parametr s Output: n je složené nebo n je prvočíslo Algoritmus: (1) for k = 1,..., s (1.1) zvol náhodně a {2, 3,..., n 2}, (1.2) if gcd(a, n) 1, return n je složené (1.2) if [ ] n 1 a n a 2 (mod n), return n je složené (2) return n je prvočíslo
Testování prvočíselnosti obecně Problém: najděte prvočíslo velikosti cca 512 bitů. Obecné schéma: 1. vyber náhodně číslo n s příslušnou délkou, 2. použij nějaký z předchozích algoritmů ke zjištění, jestli je n (skoro jistě) prvočíslo, 3. pokud není, jdi zpět do 1. kroku. Zásadní otázka: jaká je pravděpodobnost, že v 1. kroku natrefím na prvočíslo?
Označme Rozložení prvočísel Platí: π(n) = počet prvočísel menších nebo rovných n. Věta (prime number theorem) lim n π(n) x/ ln x = 1 tj. π(n) se (pro velká n) chová jako n ln n. Ještě lepší aproximací π(n) je integrál logaritmu Li(n) = n d t.
Pravděpodobnost nalezení prvočísla Volíme-li náhodně liché číslo n, pak pravděpodobnost, že se jedná o prvočíslo, je P(n je prvočíslo) 2 ln n. Example Chceme-li najít prvočíslo dlouhé 512 bitů, dostaneme pravděpodobnost P(n je prvočíslo) 2 ln 2 512 1 177. Tedy můžeme čekat cca 177 běhů algoritmů pro testování prvočíselnosti. 177 je střední hodnota geometrického rozdělení pro pravděpodobnost 1/177.
Násobení n-místných celých čísel Problém: násobení dvou n-místných čísel x a y. Klasické násobení: Násobení vyžaduje vynásobit každou cifru čísla x s každou cifrou čísla y a pak provést n 1 součtů. Klasické sčítání čísel délky n vyžaduje zřejmě 2n operací. Proto má klasický algoritmus pro násobení časovou složitost O(n 2 ).
Karacubův algoritmus metoda Rozděl a panuj! Necht x, y jsou 2n místní čísla zapsané v desitkové soustavě: x = x 2n 1 x 2n 2... x 1 x 0 a y = y 2n 1 y 2n 2... y 1 y 0 Rozdělme je na úseky poloviční délky, zapsáno v decimální soustavě x = x 2n 1 10 2n 1 +... + x n 10 n }{{} + x n 1 10 } n 1 +... + x 1 10 + x {{ 0 } A 10 n B y = y 2n 1 10 2n 1 +... + y n 10 n }{{} + y n 1 10 } n 1 +... + y 1 10 + y {{ 0 } C 10 n D Pro součin platí x y = (A 10 n +B) (C 10 n +D) = AC 10 2n +(AD+BC) 10 n +BD
Karacubův algoritmus metoda Rozděl a panuj! x y = (A 10 n +B) (C 10 n +D) = AC 10 2n +(AD+BC) 10 n +BD Převedli jsme úlohu násobit 2n-místní čísla x y na 4 násobení AC, AD, BC a BD n-místních čísel. Potřebujeme provést jedno sčítání AD + BC. Další součty jsou časově nenáročné jedná se o součty u různých mocnin desítky. Pro součin AD + BC však taky platí x y = AC 10 2n + ( (A + B)(C + D) AC BD ) 10 n + BD Tedy provedeme nejdříve dvě sčítání A + B a C + D tři násobení AC, (A + B)(C + D) a BD. a pak dvě odčítání, abychom získali (A + B)(C + D) AC BD
Karacubův algoritmus složitost Oznčme počet T n počet kroků v Karacubově algoritmu. Sčítání vyžaduje Kn kroků pro n-místní čísla, kde K je konstanta nezávislá na n. Pro Karacubovo násobení dostaneme vztah T 2n = 3T n + 4Kn Věta Platí T n = O(n log 2 3 ).
Karacubův algoritmus výpočet složitosti Složitost vypočteme pomocí Master theoremu (mistrovská metoda): Věta (Master theorem) Necht ( n ) T (n) = at + f (n), kde a 1, b > 1. b Platí-li pro nějaké ɛ > 0 f (n) = O(n (log b a) ɛ ), potom T (n) = O(n log b a )
Karacubův algoritmus výpočet složitosti Pro nás platí a tedy T 2n = 3T n + 4Kn f (n) = 4Kn = O(n log b a ɛ), pro b = 2, a = 3, ɛ = (log 2 3) 1 znamená že T n = O(n log 2 3 ).
Bonusové přednáškové body Vymyslete polynomiální algoritmus pro výpočet Jacobiho symbolu a naprogramujte jej. Řešení i s (okomentovaným) zdrojákem a návodem jak to všechno zprovoznit mi pošlete na email karel.klouda@fit.cvut.cz
Literatura Ch. Paar a J. Pelzl, Understanding Cryptography vše o Diffie-Hellmanovi a AES a mnohé o konečných tělesech R. Montowani a P. Raghavan, Randomized algorithms pravděpodobnostní algoritmy nejen grafové