260 likes | 357 Views
Nagy Gábor:. Prímtesztelés. Témavezető: Kátai Imre Komputeralgebra Tanszék. Az RSA kriptorendszer. Az RSA egy nyilvános kulcsú titkosítást megvalósító algoritmus. 1977-ben alkotta meg Ron Rivest, Adi Shamir és Leonard Adleman. Az RSA a mai napig az egyik legfontosabb titkosító eljárás.
E N D
Nagy Gábor: Prímtesztelés Témavezető: Kátai Imre Komputeralgebra Tanszék
Az RSA kriptorendszer Az RSA egy nyilvános kulcsú titkosítást megvalósító algoritmus. 1977-ben alkotta meg Ron Rivest, Adi Shamir és Leonard Adleman. Az RSA a mai napig az egyik legfontosabb titkosító eljárás Az RSA működése: Tegyük fel, hogy B szeretne titkosítva üzenni A-nak.
A kulcsválasztás • A választ két nagy véletlen prímszámot (egy véletlen szám utáni első prím), legyenek ezek p és q, a szorzatuk n. • A kiszámolja φ(n) értékét:φ(n)= φ(pq)=(p-1)(q-1)=pq-p-q-1=n-p-q+1 • Aválaszt még egy φ(n)-nél kisebb véletlen e számot, amire (e,φ(n))=1 (sok ilyen van). • Akiszámolja e multiplikatív inverzét (mod φ(n)):d-t, amire:ed≡1 (modφ(n)) • Az (n,e) számpár lesz A nyilvános kulcsa, a (d, φ(n)) pedig a titkos kulcsa.
A titkosítás • B címkézi az elküldendő üzenetet egy 1 és n közötti m számmal. • B kiszámolja c=me (mod n)-et, ez lesz a titkosított üzenet. (ez gyorsan számolható: O((log n)3) A dekódolás A kiszámolja m=cd (mod n)-et Valóban: cd≡(me)d=med=mkφ(n)+1=(mφ(n))km≡m (mod n)
Az RSA-hoz el kell dönteni egy véletlen szám utáni számokról, hogy azok prímek-e. Ez a következő kérdésre vezet: hogyan lehet eldönteni egy számról, hogy prím-e? Def: Prímteszt: egy kritérium arra, hogy egy n szám ne legyen prím. Ha n átmegy a teszten, lehet hogy prím, ha nem megy át (bukik), akkor biztos, hogy összetett. Egy adott szám tesztelése prímségre több prímteszt egymás utáni alkalmazásából áll. A prímtesztelés lehet: a) valószínűségi - a tesztelést túlélő szám „nagy valószínűséggel” prím b) determinisztikus - a tesztelést túlélő szám biztosan prím
Példa: próbaosztás • Valamely n szám a<n-nel való osztása;ha a osztja n-et, akkor n nem prím • Ha minden a<n1/3-ra elvégezzük az osztástCsak kevés n szám éli túl: prímek, valamint az olyan összetett számok, amelyek két n1/3-nál nagyobb prím szorzatai. A túlélők nagy valószínűséggel prímek, ezért ez egy elég jó valószínűségi prímtesztelést ad. • Minden a≤n1/2-nel osztva:ha bukik, akkor n biztosan összetett, ha nem, akkor biztosan prím. Ez determinisztikus tesztelés.
Karakterizációk • Ha p prímszám, akkor (a,p)=1 eseténap-1≡1 (mod p) (kis Fermat-tétel) • Egy n szám pontosan akkor prím, ha:(n-1)!≡-1 (mod n) (Wilson-tétel) • Egy n szám pontosan akkor prím, ha (a,n)=1-re:(x+a)n≡xn+a (mod n)
Valószínűségi prímtesztek 1. • Néhány valószínűségi prímteszt, beleértve a Miller-Rabin tesztet is, a következő általános struktúrával rendelkezik. • Jelöljük Zn+-szal Zn nemnulla elemeit; így: |Zn+|=n-1, • és ha n prím, akkor Zn+=Zn*. Definiáljuk továbbá az LnZn+ halmazt a következőképpen: • Létezik egy hatékony algoritmus annak eldöntésére, hogy adott n, és αZn+ esetén αLn teljesül-e- Ha n prím, akkor Ln=Zn* • Ha n összetett, akkor |Ln|≤ c(n-1) valamilyen c<1 konstansra
Valószínűségi prímtesztek 2. n prímségének teszteléséhez beállítunk egy t „hibaparamétert”, és véletlenszerűen választunk α1,…, αtZn+-t. Ha αiLn minden i=1,…,t-re, akkor az output "igaz", különben pedig "hamis". Könnyen látható, hogy ha n prím, akkor az algoritmus mindig „igaz” értékkel tér vissza, ha pedig összetett, akkor legfeljebb ct valószínűséggel. Ha c=1/2, és t-t elég nagynak választjuk, mondjuk t=100, akkor a tévedés valószínűsége elhanyagolhatóan kicsi.
Valószínűségi prímtesztek 3. • Legyen Ln={αZn+: αn-1=1}, ekkorTétel: Ha n prím, akkor Ln=Zn*. Ha n összetett, és LnZn*, de LnZn*, akkor |Ln|≤ (n-1)/2. • Sajnos vannak olyan páratlan összetett számok, amelyekre Ln =Zn*. Ezek a Carmichael-számok.
Valószínűségi prímtesztek 4.A Miller-Rabin teszt • Legyen most n-1=2hm, ahol m páratlan Ln’={αZn+: αm2h=1, és αm2j+1=1 αm2j=1, ha j{1,…,h-1}} Tétel: Ha n prím, akkor Ln’=Zn*. Ha n összetett, akkor |Ln’|≤ (n-1)/4.
Valószínűségi prímtesztek 5.A Miller-Rabin teszt 2. • αLn’ teljesülésének ellenőrzése gyors:meghatározzuk αm-t, majd ismételt négyzetreemelést végzünk • Ennek az időigénye O((log n)3)
Prímtesztek spec. alakú prímekre Def.: Egy prímet Mersenne-prímnek nevezünk és M(p)-vel jelölünk, ha 2p-1 alakú. Tétel: Legyen p prím, s1=4, sk=sk-12-2, k=1,2,... Az M(p) szám akkor és csak akkor prím, ha M(p) az sp-1 osztója. A ma ismert legnagyobb prímek közül a legtöbb, köztük a legnagyobb is Mersenne-prím: 2^{25.964.951}-1-nek 7.816.230 számjegye van, ez a 42. ismert Mersenne-prím, és 2005. február 18-án találtaDr. Martin Nowak.
Prímtesztek spec. alakú prímekre Def: Egy prímet Fermat-prímnek nevezünk és F(k)-val jelölünk, ha 22k+1 alakú. Tétel: F(k) akkor és csak akkor prím, ha 5(F(k)-1)/2≡ -1 (mod F(k)) F(0)=3, F(1)=5, F(2)=17, F(3)=257, és F(4)=65537 prímek, ez alapján Fermat azt a sejtést állította fel, hogy az összes Fermat-szám prím. Ez nem igaz, hiszen F(5)=4.294.967.297=641 · 6.700.417, sőt az előzőeken kívül nem ismerünk Fermat-prímet.
Az AKS-algoritmus Agrawal, Kayal és Saxena 2002-ben közöltek egy algoritmust, amely nagy áttörésnek számít a prímtesztek történetében. Mondhatjuk ezt azért, mert a szerzők bizonyítják, hogy a prímszámok halmaza a P nyelvosztályba tartozik. Ez azt jelenti, hogy egy n pozitív egész szám prím mivoltának eldöntése megoldható annyi idő alatt, amely [log n]-nek polinomiális függvénye. Ráadásul ez az algoritmus determinisztikus, vagyis a valószínűségi tesztekkel ellentétben itt a legkisebb esélye sincs annak, hogy valamely álprímet véletlenül prímnek nyilvánítsunk.
Az AKS-algoritmus Egy n szám pontosan akkor prím, ha (a,n)=1-re:(x+a)n≡xn+a (mod n) A probléma az, hogy a kongruencia teljesülésének ellenőrzéséhez n-1 együtthatót kell megvizsgálnunk, így az eljárás nem hatékony. A továbbiakban szeretnénk a számolásokat egy megfelelően választott relatíve kevés elemből álló véges struktúra felett végezni, azt remélve, hogy így le tudjuk csökkenteni a vizsgálandó együtthatók számát.
Az AKS-algoritmus A továbbiakban alkalmazzuk a következő jelölést: ha f(x)≡g(x) teljesül Zn/h(x)-ben, akkor azt írjuk, hogy f(x)≡g(x) (mod n,h(x)) Az AKS-algoritmusban h(x)=xr-1, ahol r egy „megfelelően kicsi” pozitív egész. A továbbiakban természetesen a „megfelelően kicsi” kifejezés értelmét pontosítjuk. Tehát a prímek azonosítására használjuk a (x+a)n≡xn+a(modn,xr-1) kongruenciát
Az AKS-algoritmus Ha n prímszám, akkor kielégíti a kongruenciát minden a és r esetén. Látható továbbá, hogy ha r elég kicsi n-hez képest, akkor kevesebb együtthatót kell megvizsgálnunk. Sajnos cserébe azt az árat kell fizetnünk, hogy bizonyos a és r értékek esetén előfordulhat, hogy valamely n összetett szám is kielégíti a kongruenciát. Viszont bizonyítható, hogy megfelelően választott r esetén nem túl sok a értékre elvégezve a vizsgálatot, csak olyan összetett számok mehetnek át a teszten, amelyek prímhatványok.
Az algoritmus lépései • Megvizsgáljuk, hogy n teljes hatvány-e. • Keresünk egy r egészet, amire n rendje mod r >(log n)2. • Megnézzük, hogy (a,n)>1 teljesül-e valamely a≤r-re • Ellenőrizzük, hogy fennáll-e az(x+a)n≡xn+a (mod n,xr-1) összefüggésa=1, 2,…, [r1/2·log n] esetén
Az algoritmus időigénye • Az első lépés időigénye: Õ((log n)3) • A második lépésé: Õ(r(log n)2) • A harmadiké szintén: Õ(r(log n)2) • A negyediké: Õ(r3/2(log n)3) • Így az algoritmus időigénye: Õ(r3/2(log n)3) • Belátható, hogy létezik megfelelő r≤2(log n)5,így az időigény Õ((log n)10,5) ahol Õ(t(n))=O(t(n)poly(log t(n)))
Az AKS-algoritmus Tétel: Ha n>1 egész nem teljes hatvány, nincs r-nél kisebb prímosztója, a rendje: d>(log n)2 (mod r), és (x+a)n≡xn+a (mod n,xr-1) minden 1≤a≤A, ahol A=r1/2 log n, akkor n prímszám.
Az AKS-algoritmus • A bizonyítás: (vázlat) indirekt tfh. p prímosztója n-nek • G legyen az x, x+1, …, x+[A] elemek által generált részcsoportja Z/(p,h(x))-nek, ahol h(x) xr-1 irreducibilis faktora (mod p) • G méretére adott alsó és felső becsléssel jutunk ellentmondásra • Legyen R Z/rZ n és p által generált részcsoportja. • Ekkor bebizonyítható, hogy: • |G|≤n|R|1/2-1, valamint • |G|>n|R|1/2-1 • Ha n>5, akkor létezik r[(log n)5,2(log n)5] prím, • amire n rendje (mod r) >(log n)2
A megvalósíthatóság • A futásidő nagyon kedvezően alakul • Sajnos a tárigény olyan mértékű,amely viszonylag kicsi számoknál is óriásí operatív memóriát feltételez:egy ezerjegyű szám tesztelésénél a tárigény túllépheti a 3·1014 gigabájtot.
Javítások • A szerzők bebizonyították, hogy létezik (log n)3 nagyságrendű r, így a műveletigényt Õ((log n)7,5)-re javították • Lenstra és Pomerance más polinom választásával Õ((log n)6)-ra csökkentette a futásidőt
Sejtés Sejtés: Legyen r olyan prím, amely nem osztója n-nek. Ha fennáll az (x-1)n≡xn-1 (mod n,xr-1) kongruencia, akkor n prím, vagy n2≡1 (mod r). Ha a sejtés igaz, akkor az a teendőnk, hogy olyan r értéket keresünk, amely nem osztója n2-1-nek. Ilyen r biztosan található a [2,4log n] intervallumban. Ez abból következik, hogy az x-nél kisebb prímek szorzata legalább ex. Ezután már csak a fenti kongruencia teljesülését kell ellenőrizni, amelynek az időigénye Õ((log n)2), vagyis az AKS-prímteszt futási ideje Õ((log n)3). Ha igaz a sejtés, a tárigény 5,27 gigabájt alá csökken.