Prímtesztelés Témavezető: Kátai Imre Komputeralgebra Tanszék Nagy Gábor:
Az RSA kriptorendszer Az RSA egy nyilvános kulcsú titkosítást megvalósító algoritmus 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 A választ még egy φ(n)-nél kisebb véletlen e számot, amire (e,φ(n))=1 (sok ilyen van). A kiszá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 címkézi az elküldendő üzenetet egy 1 és n közötti m számmal. B kiszámolja c = m e (mod n)-et, ez lesz a titkosított üzenet. (ez gyorsan számolható: O((log n) 3 ) B kiszámolja c = m e (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 = c d (mod n)-et Valóban: c d ≡ (m e ) d = m ed = m kφ(n) + 1 = (m φ(n) ) k m ≡ 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 < n 1/3 -ra elvégezzük az osztást Csak kevés n szám éli túl: prímek, valamint az olyan összetett számok, amelyek két n 1/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 ≤ n 1/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én a p-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 ≡ x n +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 Z n + -szal Z n nemnulla elemeit; így: |Z n + |=n-1, és ha n prím, akkor Z n + =Z n *. Definiáljuk továbbá az L n Z n + halmazt a következőképpen: - Létezik egy hatékony algoritmus annak eldöntésére, hogy adott n, és α Z n + esetén α L n teljesül-e - Ha n prím, akkor L n =Z n * - Ha n összetett, akkor |L n |≤ 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,…, α t Z n + -t. Ha α i L n 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 c t 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 L n ={α Z n + : α n-1 =1}, ekkor Tétel: Ha n prím, akkor L n =Z n *. Ha n összetett, és L n Z n *, de L n Z n *, akkor |L n |≤ (n-1)/2. Legyen L n ={α Z n + : α n-1 =1}, ekkor Tétel: Ha n prím, akkor L n =Z n *. Ha n összetett, és L n Z n *, de L n Z n *, akkor |L n |≤ (n-1)/2. Sajnos vannak olyan páratlan összetett számok, amelyekre L n =Z n *. Ezek a Carmichael-számok. Sajnos vannak olyan páratlan összetett számok, amelyekre L n =Z n *. Ezek a Carmichael-számok.
Valószínűségi prímtesztek 4. A Miller-Rabin teszt Legyen most n-1=2 h m, ahol m páratlan Legyen most n-1=2 h m, ahol m páratlan L n ’ ={α Z n + : α m2 h =1, és α m2 j+1 =1 α m2 j = 1, ha j {1,…,h-1}} Tétel: Ha n prím, akkor L n ’ =Z n *. Ha n összetett, akkor |L n ’ |≤ (n-1)/4.
Valószínűségi prímtesztek 5. A Miller-Rabin teszt 2. α L n ’ teljesülésének ellenőrzése gyors: meghatározzuk α m -t, majd ismételt négyzetreemelést végzünk α L n ’ 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 ) Ennek az időigénye O((log n) 3 )
Prímtesztek spec. alakú prímekre Tétel: Legyen p prím, s 1 =4, s k =s k , k=1,2,... Az M(p) szám akkor és csak akkor prím, ha M(p) az s p-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^{ }-1-nek számjegye van, ez a 42. ismert Mersenne-prím, és február 18-án találta Dr. Martin Nowak. Def.: Egy prímet Mersenne-prímnek nevezünk és M(p)-vel jelölünk, ha 2 p -1 alakú.
Prímtesztek spec. alakú prímekre Def: Egy prímet Fermat-prímnek nevezünk és F(k)-val jelölünk, ha 2 2 k +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)= =641 · , 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 ≡x n +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 Z n / h(x) -ben, akkor azt írjuk, hogy f(x)≡g(x) (mod n,h(x)) Az AKS-algoritmusban h(x)=x r -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 ≡x n +a (mod n,x r -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. Megvizsgáljuk, hogy n teljes hatvány-e. Keresünk egy r egészet, amire n rendje mod r > (log n) 2. 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 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 ≡ x n +a (mod n,x r -1) összefüggés a=1, 2,…, [r 1/2 ·log n] esetén Ellenőrizzük, hogy fennáll-e az (x+a) n ≡ x n +a (mod n,x r -1) összefüggés a=1, 2,…, [r 1/2 ·log n] esetén
Az algoritmus időigénye Az első lépés időigénye: Õ((log n) 3 ) Az első lépés időigénye: Õ((log n) 3 ) A második lépésé: Õ(r(log n) 2 ) A második lépésé: Õ(r(log n) 2 ) A harmadiké szintén: Õ(r(log n) 2 ) A harmadiké szintén: Õ(r(log n) 2 ) A negyediké: Õ(r 3/2 (log n) 3 ) A negyediké: Õ(r 3/2 (log n) 3 ) Így az algoritmus időigénye: Õ(r 3/2 (log n) 3 ) Így az algoritmus időigénye: Õ(r 3/2 (log n) 3 ) Belátható, hogy létezik megfelelő r≤2(log n) 5, így az időigény Õ((log n) 10,5 ) 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 ≡x n +a (mod n,x r -1) minden 1≤a≤A, ahol A=r 1/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) x r -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 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·10 14 gigabájtot. 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·10 14 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 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 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 ≡x n -1 (mod n,x r -1) kongruencia, akkor n prím, vagy n 2 ≡1 (mod r). Ha a sejtés igaz, akkor az a teendőnk, hogy olyan r értéket keresünk, amely nem osztója n 2 -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 e x. 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.
Köszönöm a figyelmet!