RSA algoritmus 1. Vegyünk véletlenszerűen két különböző nagy prímszámot, p-t és q-t. 2. Legyen n = pq. 3. Vegyünk egy olyan kis páratlan e számot, amely relatív prím φ(n) = (p 1)(q 1)-hez. 4. Keressünk egy olyan d számot, amelyre ed = 1 mod φ(n). 5. Az RSA nyilvános kulcs a P = (e,n) pár lesz. 6. Az RSA titkos kulcs az S = (d,n) pár lesz. Ebben a sémában az elküldhető üzenetek halmaza Z n = {0,1,...,n 1}. A kódolás a P = (e,n) nyilvános kulccsal: A dekódolás a titkos kulccsal: P(M) = M e mod n. Def: Z n = {a Z n : lnko(a,n) = 1}. S(C) = C d mod n. A helyesség igazoláshoz szükséges számelméleti háttér Def: Az Euler függvény a Z n halmaz elemszáma, jele φ(n), értéke ahol p prím. Tétel (Euler) Bármely n > 1 számra φ(n) = n (1 1/p), p n minden a Z n esetén. Tétel (Fermat) Minden p prímre a φ(n) = 1 mod n, a p 1 = 1 mod p, ha p nem osztója a-nak. Tétel (Kínai maradéktétel) Legyen n = n 1 n 2...n k, ahol n i -k páronként relatív prímek. Tekintsük az a (a 1,a 2,...,a k ), megfeleltetést, ahol a Z n, és a i Z ni, továbbá a i = a mod n i minden i = 1,2,...,k-ra. A megfeleltetés kölcsönösen egyértelmű megfeleltetés a Z n halmaz és a Z n1 Z n2 Z nk direktszorzat között. A Z n elemein végezhető műveletek végrehajthatók a k-asokkal. Tehát, ha a (a 1,a 2,...,a k ) és b (b 1,b 2,...,b k ), akkor (a + b) mod n ((a 1 + b 1 ) mod n 1,...,(a k + b k ) mod n k ) (a b) mod n ((a 1 b 1 ) mod n 1,...,(a k b k ) mod n k ) 1
(ab) mod n ((a 1 b 1 ) mod n 1,...,(a k b k ) mod n k ) Következmény Ha n 1,n 2,...,n k páronként relatív prímek és n = n 1 n 2...n k, akkor minden a 1,a 2,...,a k, egész számra az x = a i mod n i, i = 1,2,...,k, kongruenciarendszernek modulo n az x ismeretlenre egyetlen megoldása van. Következmény Ha n 1,n 2,...,n k páronként relatív prímek és n = n 1 n 2...n k, akkor az x és a egészekre x = a mod n i minden i = 1,2,...,k-ra akkor és csak akkor teljesül, ha x = a mod n. Példa: Legyen n = 65, akkor n 1 = 5 és n 2 = 13. Ha a = 42 (2,3) és b = 24 (4,11), akkor a+b = 1 (1,1). RSA helyessége Tétel. (Az RSA helyessége.) Az RSA algoritmusban definiált függvények egymás inverzei. Bizonyítás. M Z n esetén P(S(M)) = S(P(M)) = M ed mod n. Mivel e és d egymás multiplikatív inverzei modulo φ(n) = (p 1)(q 1), ezért ed = 1+k(p 1)(q 1), valamely alkalmas k egész számra. Ekkor M 0 mod p esetén M ed = M(M p 1 ) k(q 1) mod p = M(1) k(q 1) mod p a Fermat tétel alapján. Tehát M ed = M mod p ha M 0 mod p. Következésképpen M ed = M mod p teljesül. Hasonlóképpen kapjuk, hogy M ed = M mod q. Így a kínai maradéktétel következménye miatt, mivel n = pq ezért M ed = M mod n. 2
Lineáris kongruencia megoldása Az e elem inverzének megtalálásához meg kell oldanunk egy lineáris kongruenciát. Általánosan a feladat az, hogy oldjuk meg az ax = b mod n egyenletet. Jelölje G(a) az a elem által generált additív részcsoportját Z n -nek. Tehát G(a) = {ax mod n : x > 0}. A megoldandó kongruenciának akkor és csak akkor van megoldása, ha b G(a). Tétel. Legyen d = lnko(a,n). Ekkor G(a) = G(d) = {0,d,2d,...,((n/d) 1)d}, így G(a) = n/d. Bizonyítás Először igazoljuk, hogy d G(a). A Bővített-Euklidesz algoritmus olyan x és y számokat ad, amelyekre ax + ny = d, így ax = d mod n, azaz d G(a). Így d többszörösei is szerepelnek G(a)-ban, tehát G(d) G(a). Belátjuk, hogy G(a) G(d) is teljesül. Ha m G(a), akkor m = ax mod n valamely x-re, ezért m = ax + ny. De d a és d n, így adódik, hogy d m, azaz m G(d). Következmény: Az ax = b mod n kongruencia akkor és csak akkor oldható meg, ha lnko(a,n) b teljesül. Ha van megoldás, akkor pontosan d darab van. Tétel Legyen d = lnko(a,n) = ax + ny. Ha d b, akkor az ax = b mod n kongruenciának az egyik megoldása x 0, amelyre: Bizonyítás: x 0 = x (b/d) mod n. ax 0 = ax (b/d) mod n = d(b/d) mod n = b mod n. Tétel: Legyen d = lnko(a,b). Tegyük fel, hogy az ax = b mod n kongruencia megoldható és x 0 egy megoldása. Ekkor pontosan d különböző megoldása van, az x i = x 0 + i(n/d) i = 0,1,...,d 1 megoldások. Bizonyítás: Mivel n/d > 0 és 0 i(n/d) < n, i = 0,1,...,d 1-re, ezért az x i -k mind különbözők Mivel x 0 megoldás, ezért ax 0 mod n = b. Ekkor az i = 0,1,...,d 1-re ax i mod n = a(x 0 + in/d) mod n = (ax 0 + ain/d) mod n = ax 0 mod n = b. mod n-re. LINEÁRIS-KONGRUENCIA-MEGOLDÓ(A,B,N) (d,x0,y0):=bővített-euklidesz(a,n) if d b then x0:=x0(b/d) mod n for i := 0 to d-1 print(x0+i(n/d) mod n) else print(nincs megoldás) Példa 14x = 30 mod 100. (d,x,y) = 2, 7,1), x 0 = ( 7)(15) mod 100 = 95, így a két megoldás 95 és 45. Prímtesztelés 3
További kérdés miként találhatunk nagy prímeket. Ismert, hogy végtelen sok prím van, így tetszőlegesen nagy prím található. Továbbá a prímek nem helyezkednek el nagyon ritkán, ha π(n) jelöli az n-nél nem nagyobb prímek számát, akkor lim n lnnπ(n)/n = 1. A prímek kereséséhez fontos részfeladat a prímtesztelés, amely során adott számról akarjuk eldönteni prím -e? A legegyszerűbb módszer az osztási próba. Az n számot rendre elosztjuk a 2,3,5, n egészek mindegyikével, ha valahol egész számot kapunk, akkor n összetett. Az algoritmus lassú, mivel az input mérete nem n, hanem logn. A továbbiakban olyan módszereket mutatunk be, amelyek nem feltétlenül adnak helyes választ. Ha azt kapjuk válaszként, hogy az adott szám összetett, akkor valóban összetett számról van szó, de a pozitív válasz nem garantálja, hogy valóban prímről van szó. Álprímek és Carmichael számok A Fermat tétel alapján, minden prímre és minden a = 1,..., p 1-re a p 1 = 1 mod p. Az első prímtesztelő algoritmus kiszámolja az MODULÁRIS-HATVÁNYOZÓ(2,n-1,n) értéket, és ha nem 1-et kapunk, akkor tudjuk, hogy n összetett szám. Az algoritmus, akkor hibázik, ha n olyan összetett szám, amelyre 2 n 1 = 1 mod n. Általában azokat az összetett számokat, amelyekre a n 1 = 1 mod n a alapú álprímnek nevezzük. Egy n számot a alapú álprímnek nevezünk, ha a n 1 = 1 mod n. Természetesen adódik a kérdés, hogy milyen gyakran téved az algoritmus, azaz milyen gyakran fordulnak elő 2 alapú álprímek. 1000-nél kisebb 2 alapú álprím 22 van, az álprímek aránya tart a 0-hoz. Kézenfekvő ötlet, hogy használjunk a teszteléshez a 2 számon kívül más alapokat is. Ez nem oldja meg a problémát, mert vannak olyan számok, amelyek minden a-ra a alapú álprímek. Ezeket a számokat nevezzük Carmichael számoknak. Ezekből még kevesebb van, 10 9 -nél kisebb Carmichael szám 255 van, a legkisebb az 561. Miller Rabin valószínűségi prímteszt A prímteszt két lépésből áll, egyrészt véletlenül választott a értékekre ellenőrzi, hogy a vizsgált szám a alapú álprím-e, továbbá megvizsgálja, hogy van -e nemtriviális négyzetgyöke 1-nek modulo n. A második részbeli elutasítás helyessége az alábbi tételen alpul. Tétel Ha p páratlan prím, akkor az x 2 = 1 mod p kongruenciának, csak 2 megoldása van, az x = 1 és az x = 1. def: Az x szám 1 nem triviális négyzetgyöke modulo n, ha megoldása az x 2 = 1 mod n kongruenciának, és nem egyezik meg a triviális 1,1 négyzetgyökökkel. (Pl a 6 nem triviális négyzetgyöke 1-nek, modulo 35.) Következmény Ha az 1-nek létezik nemtriviális négyzetgyöke modulo n, akkor az n összetett szám. A prímteszt használja a következő TANÚ(a,n) algoritmust. Ehhez legyen n 1 = 2 t u, ahol t 1 és u páratlan. TANÚ(a,n) x(0):=moduláris-hatványozó(a,u,n) for i=1 to t x(i):=(x(i-1))(x(i-1)) mod n if x(i)=1 and x(i-1)!=1 and x(i-1)!=n-1 then return Igaz if x(t)!=1 then return igaz return hamis Lemma. Ha a TANÚ(a,n) eljárás Igaz értéket ad vissza, akkor az n szám összetett. Bizonyítás. Két esetben kaphatunk Igaz értéket, ha x(i 1) nem triviális négyzetgyöke 1-nek modulo n, vagy ha nem teljesül n-re a Fermat tétel. Mindkét esetben egyből adódik, hogy n nem lehet prím. 4
Miller-Rabin(n,s) for j=1 to s a:=veletlengeneralt(1,n-1) If TANÚ(a,n) Then return ÖSSZETETT return PRÍM(Valószínűleg) Tétel Az n páratlan összetett számnak legalább (n 1)/2 darab összetettséget igazoló tanúja van. Következmény Legyen n > 2 páratlan egész, s pedig pozitív egész. A Miller-Rabin(n,s) teszt tévedési valószínűsége legfeljebb 2 s. Bizonyítás A fenti tétel alapján ha n nem prím, akkor a Miller-Rabin(n,s) teszt minden iterációja 1/2 valószínűséggel felfedez egy tanút. Így annak a valószínűsége, hogy s lépésben nem találunk egyetlen tanút sem, kisebb, mint 2 s. Példa: Legyen n = 561 a legkisebb Carmichael szám. Ekkor n 1 = 2 4 35. Legyen a = 7, ekkor elsőként kiszámoljuk az x(0) = 7 35 = 241 mod 561 értéket, majd ezt többször négyzetre emelve a (298,166,67,1) sorozatot, amely utolsó előtti eleme talált egy nemtriviális négyzetgyökét 1-nek modulo 561. Mersenne prímek Def: Mersenne-prímnek nevezzük a kettő-hatványnál eggyel kisebb, azaz a 2 n 1 alakban felírható prímszámokat, ahol n szintén prímszám. 2008-ban fedezték fel a 45-ödik Mersenne-prímet, ez a 2 43112609-1 szám, amely 12 978 189 számjegyű. Ez a jelenleg ismert legnagyobb prímszám. 5