RSA-salausalgoritmi ja alkuluvut Jussi Palola Tampereen Yliopisto Tietojenkäsittelytieteiden laitos Tietojenkäsittelyoppi Pro gradu -tutkielma Ohjaaja: Martti Juhola Huhtikuu 2008
Tampereen yliopisto Tietojenkäsittelytieteiden laitos Tietojenkäsittelyoppi Palola, Jussi: RSA-salausalgoritmi ja alkuluvut Pro gradu -tutkielma, 40 sivua Huhtikuu 2008 Tässä tutkielmassa tarkastellaan RSA-salausalgoritmia. RSA on yleisesti käytetty julkisen avaimen salakirjoitusmenetelmä. Se perustuu lukuteoreettiseen ongelmaan, jossa kahden luvun kertominen on yksinkertaista, mutta tuloksen jakaminen tekijöihin vaikeaa. Ensimmäisessä luvussa tutustutaan itse algoritmiin ja sen matemaattiseen perustaan. Toinen luku käsittelee suuria alkulukuja ja eritoten niiden luomista. Kolmannessa luvussa paneudutaan tekijöihinjaon ongelmiin ja käytettyihin menetelmiin. Avainsanat ja -sanonnat: RSA-salausalgoritmi, alkuluvut, kryptologia, lukuteoria, algoritmit, salaus i
Sisällys 1 Johdanto... 1 2 Julkisen avaimen salakirjoitusmenetelmä RSA... 2 2.1 Jaollisuus ja alkuluvut... 2 2.2 Suurin yhteinen tekijä... 3 2.3 Kongruenssi... 5 2.4 Lineaarikongruenssi... 8 2.5 Aritmetiikan peruslause... 9 2.6 Eulerin lause... 10 2.7 RSA-algoritmi... 14 3 Alkulukuparin valinta... 17 3.1 Alkulukulause... 17 3.2 Onko luku x alkuluku?... 17 3.2.1 Kokeilu jakamalla... 17 3.2.2 Miller-Rabin testi... 18 3.2.3 AKS testi... 22 3.3 Salausavaimen alkutekijät... 23 4 Alkutekijöihin jakaminen... 24 4.1 Kokeilu jakamalla... 24 4.2 Fermat'n menetelmä... 25 4.3 Pollard rho -menetelmä... 26 4.4 Pollard p - 1 -menetelmä... 29 4.5 Elliptinen käyrä -menetelmä... 31 4.6 Quadratic Sieve eli neliöseula... 31 4.7 Number Field Sieve eli lukukuntaseula... 32 4.8 Tekijöihinjako laitteistot... 33 4.8.1 TWINKLE eli pilke... 33 4.8.2 TWIRL eli pyörre... 33 4.8.3 Muita erityislaitteita... 34 5 Yhteenveto... 35 Viiteluettelo... 36 ii
1 Johdanto Tietojen salaaminen on ollut arkipäivää jo muinaisista ajoista lähtien. Mitä enemmän tietoa liikkuu, sitä enemmän tarvitaan myös menetelmiä sen salaamiseen ja varmentamiseen. Osa salaus- ja varmennusmenetelmistä perustuvat hyvinkin vanhoihin ideoihin. Tässä tutkielmassa esiteltävä RSA-salausalgoritmi kehitettiin 1970-luvun lopulla. Jos olisi kysymys pelkästään tekniikasta, 1970-luvulla kehitetty tietokone olisi tänä päivänä lähes hyödytön. RSA:n juuret ovat vieläkin kauempana historiassa kuin 1970-luvulla, nimittäin sveitsiläisen matemaatikon Leonhard Eulerin kehittämässä lauseessa vuodelta 1760. Iästään huolimatta RSA on lähes de facto standardi alallaan. Julkisen avaimen salakirjoitusmenetelmänä se mahdollistaa tiedon salaamisen lisäksi myös digitaalisen allekirjoituksen luomisen. Tutkielman ensimmäisessä luvussa esitellään RSA-algoritmi ja sen matemaattinen perusta. Määritelmät ja lauseet noudattavat pitkälti muotoa, jossa ne on esitetty Kenneth H. Rosenin teoksessa Elementary Number Theory and Its Applications [21]. Lukijaa ei ole tarkoituksella rasitettu ylimääräisellä informaatiolla tai monimutkaisilla todistuksilla, vaan niihin on vain viitattu. Tutkielman toinen luku perehtyy RSA-algoritmin salauksen kannalta tärkeimpään osaalueeseen eli alkulukuihin. Luvussa esitellään yleisimmät algoritmit alkulukujen luomiseen. Kolmannessa luvussa perehdytään tekijöihin jakamiseen. Tämä aihepiiri liittyy kiinteästi RSA-algoritmiin sillä se tarjoaa ainoan yleisen tavan murtaa kaikki RSA-salaukset. Muut kuin tekijöiden jakamiseen perustuvat hyökkäykset RSA-salausta vastaan on tarkoituksella sivuttu. Niihin ja muihin yleisiin salaukseen liittyviin kysymyksiin voi tutustua esimerkiksi Douglas Stinsonin kirjassa Cryptography: Theory and Practice [24]. Tutkielman esimerkit ovat tekijän itsensä kirjoittamia ja ratkaisemia, vaikka niihin olisikin otettu mallia lähdeteoksista. Myös pseudokoodipätkät ovat AKS-algoritmia lukuun ottamatta tekijän itsensä kirjoittamia. 1
2 Julkisen avaimen salakirjoitusmenetelmä RSA Julkisen avaimen salakirjoitusmenetelmät perustuvat ideaan, että on mahdollista kehittää menetelmä, jossa salausavaimesta ek on laskennallisesti mahdotonta päätellä purkuavain dk. Jos tämä on mahdollista, niin salausavain (tai menetelmä) ek voidaan julkistaa (julkinen avain). Viestin lähettäjä voi tällöin salata viestin vastaanottajan julkisella avaimella ilman, että vastaanottajan ja lähettäjän tarvitsee etukäteen vaihtaa tietoja salaa (vaikkapa tunnussanaa). Vastaanottaja on ainut, joka voi purkaa omalla julkisella avaimellaan salatun viestin käyttämällä omaa salaista purkuavaintaan dk (henkilökohtainen avain). Ensimmäisenä idean julkisen avaimen salausmenetelmästä esittivät Diffie ja Hellman vuonna 1976. Ensimmäisen menetelmän kehittivät Rivest, Shamir ja Adleman vuonna 1977. Tämä menetelmä tunnetaan nimellä RSA-salaus. Siitä lähtien on esitelty muitakin julkisen avaimen salausmenetelmiä, joiden turvallisuus perustuu erilaisiin laskennallisiin ongelmiin. RSA-salausalgoritmin turvallisuus perustuu lukuteorian ongelmaan isojen kokonaislukujen tekijöihin jakamisesta. 2.1 Jaollisuus ja alkuluvut Määritelmä 2.1. Olkoot a ja b kokonaislukuja (a 0). Jos on olemassa sellainen luku c, että b = ac, sanotaan että luku b on jaollinen luvulla a tai luku a jakaa luvun b. Jos luku a jakaa luvun b, sanotaan, että luku a on luvun b tekijä ja luku b on luvun a monikerta. Jos luku a jakaa luvun b voidaan kirjoittaa a b, vastaavasti jos luku b ei ole jaollinen luvulla a voidaan kirjoittaa a b. Esimerkki 2.1. -5 35, 7 49, 7 40, 6 33, ja 19 0. Määritelmä 2.2. Positiivinen kokonaisluku on alkuluku, jos sen ainoat positiiviset kokonaislukutekijät ovat luku itse ja luku 1. Muita kokonaislukuja sanotaan yhdistetyiksi luvuiksi. 2
Esimerkki 2.2. Kokonaisluvut 2, 3, 7, 13, 101 ja 163 ovat alkulukuja. Esimerkki 2.3. Kokonaisluvut 6 = 3 2, 21 = 7 3, ja 1001 = 7 11 13 ovat yhdistettyjä lukuja. Apulause 2.1. Jokaisella lukua 1 suuremmilla positiivisella kokonaisluvulla on alkutekijä. Todistus. Ks. [21] s. 66. Lause 2.1. Jos n on yhdistetty luku, niin luvulla n on alkutekijä, joka ei ole suurempi kuin (n). Todistus. Ks. [21] s. 67. 2.2 Suurin yhteinen tekijä Määritelmä 2.3. Kahden kokonaisluvun a ja b (a > 0 ja b > 0) suurin yhteinen tekijä on suurin kokonaisluku c, joka jakaa sekä luvun a että b. Suurin yhteinen tekijä merkitään (a, b) = c. Siitä käytetään myös lyhennettä syt (tai englanniksi greatest common divisor, gcd). Esimerkki 2.4. (25, 10) = 5, (16, 10) = 2, (23, 10) = 1. Määritelmä 2.4. Kokonaisluvut a ja b ovat keskenään jaottomia, jos luvulla a ja b suurin yhteinen tekijä (a, b) = 1. 3
Määritelmä 2.5. Kahden positiivisen kokonaisluvun a ja b pienin yhteinen jaettava on pienin positiivinen kokonaisluku, joka on jaollinen sekä luvulla a ja luvulla b. Pienin yhteinen jaettava merkitään [a, b] = c. Siitä käytetään myös lyhennettä pyj (tai englanniksi least common multiple, lcm). Esimerkki 2.5. [9, 11] = 99, [2, 10] = 10 ja [12, 18] = 36. Apulause 2.2. Jos x ja y ovat reaalilukuja, niin max(x, y) + min(x, y) = x + y. Todistus. Jos x y, niin min(x, y) = y ja max(x, y) = x, joten max(x, y) + min(x, y) = x + y. Jos x < y, niin min(x, y) = x ja max(x, y) = y, joten jälleen huomataan että max(x, y) + min(x, y) = x + y. Lause 2.2. Jos a ja b ovat positiivisia kokonaislukuja, niin [a, b] = ab / (a, b), missä [a, b] on luvun a ja b pienin yhteinen jaettava ja (a, b) on lukujen a ja b suurin yhteinen tekijä. Todistus. Olkoon luvuilla a ja b alkutekijät a = p a1 an 1 p 2 a2 p n ja b = p b1 1 p 2 b2 p bn n, missä eksponentit ovat ei-negatiivisia kokonaislukuja ja kaikki alkuluvut esiintyvät kummankin luvun tekijöinä (mahdollisesti eksponentilla 0). Olkoon M j = max(a j, b j ) ja m j = min(a j, b j ). Näin ollen [a, b](a, b) = p M1 1 p 2 M2 p Mn n p m1 mn 1 p 2 m2 p n M1 + = p m1 M2 + Mn + mn 1 p 2 m2 p n a1 + = p b1 a2 + an + bn 1 p 2 b2 p n = p a1 1 p 2 a2 p an n p b1 bn 1 p 2 b2 p n = ab, 4
koska M j + m j = max(a j, b j ) + min(a j, b j ) = a j + b j apulauseen 2.2 mukaan. 2.3 Kongruenssi Monille ohjelmointiin tutustuneille on tuttu käsite jakojäännöksestä (%), esimerkiksi 19 % 6 = 1. Kongruenssin idea on sama, vaikka esitysmuoto onkin erilainen. Äskeinen esimerkki olisi kongruenssin avulla esitettynä 19 1 (mod 6) eli 19 on kongruentti luvun 1 kanssa modulo 6. Määritelmä 2.6. Olkoon luku m positiivinen kokonaisluku. Jos a ja b ovat kokonaislukuja, sanotaan että luku a on kongruentti luvun b kanssa modulo m, jos m (a - b). Jos on a kongruentti luvun b kanssa modulo m, kirjoitetaan a b (mod m). Jos m (a - b), kirjoitetaan a b (mod m) ja sanotaan että a ja b ovat epäkongruentteja modulo m. Esimerkki 2.6. 26 4 (mod 11), koska 11 (26 4) = 22. Yhtälailla 100 1 (mod 9). Toisaalta 9 2 (mod 8), koska 8 (9-2) = 7. Lause 2.3. Jos a ja b ovat kokonaislukuja, niin a b (mod m), jos ja vain jos, on olemassa sellainen kokonaisluku k että a = b + km. Todistus. Jos a b (mod m), niin m (a b). Tästä seuraa, että on olemassa kokonaisluku k niin että km = a b, joten a = b + km. Käänteisesti, jos on olemassa kokonaisluku k niin että a = b + km, niin km = a b. Joten m (a b) ja tämän seurauksena a b (mod m). Lause 2.4. Olkoon m positiivinen kokonaisluku. Kongruenssit modulo m täyttävät 5
seuraavat kriteerit. I. Refleksiivisyys. Jos a on kokonaisluku niin a a (mod m) II. Symmetrisyys. Jos a ja b ovat kokonaislukuja, niin että a b (mod m), niin b a (mod m). III. Transitiivisuus. Jos a, b ja c ovat kokonaislukuja ja a b (mod m) ja b c (mod m), niin seuraa että a c (mod m). Todistus. I. Nähdään että a a (mod m), koska m (a a) =0. II. III. Jos a b (mod m), niin m (a b). Näin ollen on olemassa kokonaisluku k, niin että km = a b. Tämä osoittaa, että (-k)m = b a, joten m (b a). Tästä seuraa b a (mod m). Jos a b (mod m) ja b c (mod m), niin m (a b) ja m (b c). Joten ovat olemassa kokonaisluvut k ja l, niin että km = a b ja lm = b c. Sen vuoksi, a c = (a b) + (b c) = km + lm = (k + l)m. Tästä seuraa m (a - c) ja a c (mod m). Lause 2.5. Jos a, b, c ja m ovat kokonaislukuja, ehdolla m > 0, niin että a b (mod m), niin 1. a + c b + c (mod m) 2. a - c b - c (mod m) 3. ac bc (mod m) Todistus. Koska a b (mod m), tiedetään että m (a b). Yhtälöstä (a + c) (b + c) = a b, nähdään että m ((a + c) (b + c)), josta seuraa (1). Yhtälailla (2) seuraa tosiseikasta, että (a c) (b c) = a b. Osoitetaan (3) merkitsemällä ac bc = c(a b). Koska m (a b), seuraa että m c(a b), ja näin ollen ac bc 6
(mod m). Esimerkki 2.7. 16 1 (mod 5), joten 19 = 16 + 3 1 + 3 = 4 (mod 5). Kertolaskulla 32 = 16 2 1 2 = 2 (mod 5). Lause 2.6. Jos a, b, c ja m ovat kokonaislukuja ehdolla m > 0, d = (c, m), ja ac bc (mod m) niin a b (mod m / d) Todistus. Ks. [21] s. 131. Esimerkki 2.8. Koska 30 12 (mod 9) ja (6, 9) = 3, nähdään, että 30 / 6 12 / 6 (mod 9 / 3), eli 5 2 (mod 3). Seurauslause 2.1. Jos a, b, c ja m ovat kokonaislukuja ehdolla m > 0, (c, m) =1, ja ac bc (mod m) niin a b (mod m) Esimerkki 2.9. Koska 44 8 (mod 9) ja (4, 9) = 1, voidaan päätellä, että 44 / 4 8 / 4 (mod 9), tai 11 2 (mod 9). Lause 2.7. Jos a, b, c, d ja m ovat kokonaislukuja, ehdolla m > 0, niin että a b (mod m) ja c d (mod m), niin i. a + c b + d (mod m) ii. a - c b - d (mod m) iii. ac bd (mod m) Todistus. Koska a b (mod m) ja c d (mod m), tiedetään, että m (a b) ja m 7
(c d). Joten, ovat olemassa kokonaisluvut k ja l, että km = a b ja lm = c d. i. Huomataan, että (a + c) (b + d) = (a b) + (c d) = km + lm = (k + l)m, joten m [(a + c) (b d)], siksi a + c b + d (mod m). ii. Huomataan, että (a - c) (b - d) = (a b) - (c d) = km - lm = (k - l)m, joten m [(a - c) (b d)], siksi a - c b - d (mod m). iii. Huomataan, että ac bd = ac bc + bc bd = c(a b) + b(c d) = ckm + blm = m(ck + bl), joten m (ac bd), siksi ac bd (mod m). Esimerkki 2.10. 24 3 (mod 7) ja 9 2 (mod 7), joten 24 + 9 = 33 3 + 2 = 5 (mod 7). Kertolaskulla 24 9 = 216 3 2 = 6 (mod 7). 2.4 Lineaarikongruenssi Kongruenssia muodossa ax b (mod m), jossa luku x on tuntematon kokonaisluku, kutsutaan yhden muuttujan lineaarikongruenssiksi. Esimerkki 2.11. Ratkaistaan kongruenssi 83x 184 (mod 55). Kongruenssin määritelmään perustuen voidaan luvuista 81 ja 184 poistaa modulon kerrannaisia. Siis (83 1 55)x (184 3 55) (mod 55), josta saadaan 28x 19 (mod 55). Lauseen 2.6. mukaan voidaan luvut 28x ja 19 kertoa luvulla 2, jolloin saadaan 56x = 2 28x 2 19 = 38 (mod 55). Supistetaan jälleen modulon kerrannaisia saadaan x 38 (mod 55), 8
joka on lineaarikongruenssin 83x 184 (mod 55) ratkaisu. Lause 2.9. Olkoon a, b ja m kokonaislukuja, niin että m > 0 ja (a, m) = d. Jos d b, niin lineaarikongruenssilla ax b (mod m) ei ole ratkaisuja. Jos taas d b, silloin lineaarikongruenssilla ax b (mod m) on ratkaisu. Todistus. Ks. [21] s. 139-140. Huomautus 2.1. Lauseen 2.9 mukaan kongruenssilla ax 1 (mod m) on ratkaisu jos ja vain jos (a, m) = 1. Määritelmä 2.7. Jos luvut a ja m ovat keskenään jaottomia kongruenssiyhtälön ax 1 (mod m) ratkaisua kutsutaan luvun a käänteisluvuksi mod m. Lause 2.10. Olkoon p mikä tahansa alkuluku. Positiivinen kokonaisluku a on itsensä käänteisluvun modulo p, jos ja vain jos a 1 (mod p) tai a 1 (mod p). Todistus. Jos a 1 (mod p) tai a -1 (mod p), niin a 2 1 (mod p), joten a on itsensä käänteisluvun modulo p. Käänteisesti, jos a on itsensä käänteisluvun modulo p, niin a 2 = a a 1 (mod p). Joten p (a 2 1). Koska a 2 1 = (a 1)(a + 1), joko p (a 1) tai p (a + 1). Tästä seuraa, että joko a 1 (mod p) tai a -1 (mod p). 2.5 Aritmetiikan peruslause Lause 2.11. (aritmetiikan peruslause) Jokainen positiivinen kokonaisluku, joka on suurempi kuin 1, voidaan kirjoittaa yksikäsitteisesti alkulukujen tulona. 9
Todistus. Ks. [21] s. 97-98. Esimerkki 2.12. Kokonaisluku 420 voidaan kirjoittaa muodossa 420 = 2 2 3 5 7. Apulause 2.3. Jos a, b ja c ovat positiivisia kokonaislukuja, että (a, b) = 1 ja a bc, niin a c. Todistus. Ks. [21] s. 97. Aritmetiikan peruslauseen mukaan kaikki kokonaisluvut voidaan siis määritellä yksikäsitteisesti niiden alkutekijöiden tuloina. Joukko alkulukuja kerrottuna keskenään tuottaa siis aina vain yhden luvun ja tätä lukua ei voida saada aikaan kertomalla mitään muuta alkulukujoukkoa keskenään. 2.6 Eulerin lause Määritelmä 2.8. Olkoon n positiivinen kokonaisluku. Eulerin funktio ϕ(n)on sellaisten positiivisten kokonaislukujen määrä, jotka eivät ole suurempia kuin luku n ja ovat keskenään jaottomia luvun n kanssa. Esimerkki 2.13. ϕ(3) = 2 (luvut 1 ja 2 ovat jaottomia luvun 3 kanssa) ϕ(4) = 2 (luvut 1 ja 3 ovat jaottomia luvun 4 kanssa, luku 2 on jaollinen) ϕ(5) = 4 (1, 2, 3 ja 4 ovat jaottomia 5 kanssa) ϕ(6) = 2 (1 ja 5 ovat jaottomia 6 kanssa) ϕ(7) = 6 (1, 2, 3, 4, 5 ja 6 ovat jaottomia 7 kanssa) Eulerin funktio voidaan esittää pseudokoodilla: 10
phi(n): phi = 1; for (i = 2; i < n; i++) if(syt(i, n) == 1) phi++; return phi; Lause 2.12. Jos p on alkuluku, niin ϕ(p) = p - 1. Jos p on positiivinen kokonaisluku ja ϕ(p) = p 1, seuraa että p on alkuluku. Todistus. Jos p on alkuluku, niin jokainen kokonaisluku pienempi kuin p on keskenään jaoton luvun p kanssa. Koska sellaisia lukuja on p 1 kappaletta, saadaan ϕ(p) = p 1. Käänteisesti, jos p on yhdistetty luku, niin luvulla p on jakaja d että 1 < d < p ja p ja d eivät ole keskenään jaottomia. Koska tiedetään, että vähintään yksi p 1 kokonaisluvuista 1, 2,, p 1, nimittäin luku d, ei ole keskenään jaoton luvun p kanssa seuraa ϕ(p) p 2. Joten jos ϕ(p) = p 1, niin luvun p on oltava alkuluku. Lause 2.13. Olkoon m ja n keskenään jaottomia positiivisia kokonaislukuja, silloin ϕ(mn) = ϕ(n)ϕ(m). Todistus. Ks. [21] s. 224. Käyttämällä hyväksi lauseita 2.12 ja 2.13 voidaan todeta että, jos luvulla n on vain kaksi alkutekijää, on arvon ϕ(n) laskeminen helppoa. 11
Esimerkki 2.14. Luku 15 = 3 5. ϕ(15) = ϕ(3) ϕ(5) = (3-1) (5-1) = 2 4 = 8 (1, 2, 4, 7, 8, 11, 13 ja 14 ovat jaottomia luvun 15 kanssa). Määritelmä 2.9. Supistettu jäännössysteemi modulo n on joukko ϕ(n) kokonaislukua, niin että jokainen joukon jäsen on keskenään jaoton luvun n kanssa ja mitkään kaksi joukon lukua eivät ole kongruentteja modulo n. Esimerkki 2.15. Joukko 1, 3, 5 on supistettu jäännössysteemi modulo 7. Lause 2.14. Jos r 1, r 2,, r φ(n) on supistettu jäännössysteemi modulo n, ja jos a on positiivinen kokonaisluku, niin että (a, n) = 1, silloin joukko ar 1, ar 2,, ar φ(n) on myös supistettu jäännössysteemi modulo n. Todistus. Osoitetaan, että kokonaisluku ar j on jaoton alkuluvun n kanssa, oletetaan, että (ar j, n) > 1. Silloin on olemassa alkutekijä p luvulle (ar j, n). Joten joko p a tai p r j. Tällöin joko p a ja p n tai p r j ja p n. Kuitenkaan, sekä p r j että p n eivät voi olla yhtä aikaa voimassa, koska r j kuuluu supistettuun jäännössysteemiin modulo n. Myöskään p a ja p n eivät voi olla yhtä aikaa voimassa paikkaansa, koska (a, n) = 1. Siis päätellään, että ar j ja n ovat jaottomia aina, kun j = 1, 2,, ϕ(n). Havainnollistetaan, etteivät mitkään kaksi muotoa ar j olevaa lukua voi olla kongruentteja modulo n, oletetaan, että ar j ar k (mod n), missä luvut j ja k ovat sellaisia erisuuria positiivisia kokonaislukuja, että 1 j ϕ(n) ja 1 k ϕ(n). Koska (a, n) = 1, seurauslauseen 2.1 mukaan nähdään, että r j r k (mod n). Tämä on ristiriita, koska r j ja r k kuuluvat supistettuun jäännössysteemiin modulo n, niin että r j r k (mod n). Lause 2.15. (Eulerin lause) Jos m on positiivinen kokonaisluku, a on kokonaisluku ja 12
(a,m) = 1, niin a ϕ(m) 1 (mod m). Todistus. Olkoon r 1, r 2,, r φ(m) supistettu jäännössysteemi koostuen positiivisista kokonaisluvuista, jotka ovat pienempiä kuin m ja jaottomia luvun m kanssa. Lauseen 2.14 mukaan, koska (a, m) = 1, joukko ar 1, ar 2,, ar φ(m) on myös supistettu jäännössysteemi modulo m. Joten pienimpien positiivisten jäännöksen ar 1, ar 2,, ar φ(m) täytyy olla kokonaisluvut r 1, r 2,, r φ(m) jossain järjestyksessä. Tästä seuraa, että jos kerrotaan keskenään kaikki näiden jäännössysteemien termit, saadaan ar 1 ar 2 ar φ(m) r 1 r 2 r φ(m) (mod m). Näin ollen a ϕ(m) r 1 r 2 r φ(m) r 1 r 2 r φ(m) (mod m). Koska (r 1 r 2 r φ(m), m) = 1, seurauslauseesta 2.1 voidaan päätellä, että a ϕ(m) 1 (mod m). Esimerkki 2.16. Valitaan a = 5 ja m = 6. ϕ(6) = (2 1) (3 1) = 1 2 = 2, joten 2 ϕ(6) = 5 2 = 25, ja 25 = 24 + 1 = 6 4 + 1, siis 25 = 1 (mod 6). Apulause 2.4. Jos m on positiivinen kokonaisluku ja a on kokonaisluku, että (a, m) = 1, niin a (k ϕ(m)) 1 (mod m) luvun k ollessa mikä tahansa luonnollinen luku. Todistus. Otetaan Eulerin lause: a ϕ(m) 1 (mod m) ja lausetta 2.7. hyödyntäen voidaan esittää sen muodossa: a ϕ(m) a ϕ(m) 1 1 (mod m) joka voidaan kirjoittaa uudelleen muotoon: a (ϕ(m) + ϕ(m)) 1 1 (mod m) tai a (2 ϕ(m)) 1 (mod m) 13
toistaen sama kertominen saadaan: a (3 ϕ(m)) 1 (mod m). Tämä on toistettavissa yhä uudelleen, joten voidaan todistaa apulause 2.4. 2.7 RSA-algoritmi Otetaan todistettu apulause 2.4 käyttöön: a (k ϕ(m)) 1 (mod m) ja lausetta 2.5 hyödyntäen kerrotaan molemmat puolet luvulla a a (k ϕ(m)) a 1 a (mod m) joka voidaan kirjoittaa uudelleen muotoon: a (k ϕ(m) + 1) a (mod m) Voidaan huomata, että on mahdollisuus kirjoittaa funktio, joka palauttaa oman alkuarvonsa (olettaen, että on valittu luku m etukäteen ja a ja m ovat keskenään jaottomia). Muutetaan yhtälö muotoon: T (S ϕ(r) + 1) T (mod R), Oletetaan, että voidaan löytää kaksi uutta lukua P ja Q niin että P Q = S ϕ(r) + 1, jollekin arvolle S, joka valitaan. Kirjoitetaan T (P Q) T (mod R) eli (T P ) Q T (mod R) jaetaan se kahteen osaan transitiivisuusperiaatteen mukaan: T P X (mod R), 0 T < R ja (salaaminen) X Q T (mod R). (purkaminen) T on selkoteksti, P, Q ja R ovat salausavaimia (P ja R ovat julkinen avain ja Q ja R ovat henkilökohtainen avain) ja X on salakirjoitettu teksti. Näin toimii siis RSAsalausalgoritmi [20]. 14
Muodostaakseen salausavainparin täytyy siis löytää sopiva arvo R. Oletetaan, että R on kahden alkuluvun tulo. Halutaan, että arvolla R on mahdollisimman vähän tekijöitä ja esimerkin 2.16 mukaisesti arvon ϕ(r) laskeminen on helppoa kahdelle alkutekijälle. Tarvitaan siis alkuluvut U ja V, että R = U V, jolloin ϕ(r) = (U 1) (V 1). Huomioitavaa on, että alkuperäisestä määritelmästä poiketen RSA-algoritmin patentin haltijana Yhdysvalloissa toimineen RSA Laboratoriesin omassa RSA-määrittelyssä [11] versiosta 2.0 lähtien on ϕ(r) korvattu arvolla λ(r) = pyt(p - 1, q - 1). Esimerkki 2.17. Valitaan vaikkapa alkuluvut 5 ja 11. ϕ(55) = 40. Valitaan julkinen avain P, siten että (P, ϕ(r)) = 1. (7, 40) = 1. P = 7. Henkilökohtaisen avaimen Q ratkaisuun tarvitaan luvun 7 käänteisluku mod ϕ(55) = 40. Esimerkkiä 2.11. mukaillen voidaan löytää ratkaisu 7x 1 (mod 40), joka on x 23 (mod 40). Q on siis 23. Näin saadaan avainparit (P = 7, R = 55) ja (Q = 23, R = 55). Koska luvun T täytyy olla pienempi kuin R ja myös jaoton R:n ja sen tekijöiden (5 ja 11) kanssa valitaan salausesimerkkiin seuraavanlainen merkkikoodaus A B C D E F G H I J K L M N O 2 3 4 6 7 8 9 12 13 14 16 17 18 19 21 P Q R S T U V W X Y Z Å Ä Ö 23 24 26 27 28 29 31 32 34 36 37 38 39 41 Salattava sanoma olkoon: TERVE koodattuna numeroiksi merkkikoodauksella: 28, 7, 26, 31, 7 15
28 7 (mod 55) = 13492928512 (mod 55) = 52 7 7 (mod 55) = 823543 (mod 55) = 28 26 7 (mod 55) = 8031810176 (mod 55) = 16 31 7 (mod 55) = 27512614111 (mod 55) = 26 7 7 (mod 55) = 823543 (mod 55) = 28 sanoma on salattuna 52, 28, 16, 26, 28. Sanoman purkaminen 52 23 (mod 55) = 2.9381698884548476032434836e+39 (mod 55) = 28 28 23 (mod 55) = 1.9259043800372760688541191e+33 (mod 55) = 7 16 23 (mod 55) = 4951760157141521099596496896 (mod 55) = 26 26 23 (mod 55) = 3.5025714498220057526153130e+32 (mod 55) = 31 28 23 (mod 55) = 1.9259043800372760688541191e+33 (mod 55) = 7 RSA-algoritmin turvallisuus siis perustuu suuriin alkulukuihin U ja V. 16
3 Alkulukuparin valinta RSA-avaimia luotaessa käytettävät alkuluvut U ja V ovat keskeisessä osassa siinä, kuinka turvallinen tehty salaus on. Tässä luvussa esitellään turvallisten alkulukujen luonti ja muita huomioon otettavia seikkoja. 3.1 Alkulukulause Lause 3.1. (Alkulukulause) Olkoon π(x) lukua x+1 pienempien alkulukujen lukumäärä. Osamäärän π(x) log(x)/x raja-arvo on 1, kun x kasvaa rajatta. Todistus. Ks. [10] s. 350-367. Seurauslause 3.1.1. Olkoot on p n järjestyksessä n:s alkuluku. Kun n on positiivinen kokonaisluku, niin p n ~ n log n. Voidaan todeta, että on olemassa noin x / log x alkulukua, jotka ovat pienempiä kuin positiivinen kokonaisluku x. Todennäköisyys, että valittu kokonaisluku on alkuluku, on siis noin (x / log x) / x = 1 / log x. Esimerkiksi todennäköisyys sille, että satunnaisesti valittu 150-numeroinen (noin 1024 bittiä) kokonaisluku on alkuluku, on 1 / log 10 150 1 / 345. Alkulukujen määrittämiseksi ei ole olemassa kaavaa. RSA-algoritmin suuret alkuluvut määritellään yleensä valitsemalla satunnaisesti suuri kokonaisluku ja testaamalla, onko se alkuluku. 3.2 Onko luku n alkuluku? 3.2.1 Kokeilu jakamalla Määritelmän 2.2. mukaan luvun n voidaan todeta olevan alkuluku, jos se ei ole jaollinen 17
millään kokonaisluvulla m väliltä 2 ja n 1. Lausetta 2.1. hyödyntäen voidaan todeta, että luku n on alkuluku, jos se ei ole jaollinen millään kokonaisluvulla m väliltä 2 ja (n). Näillä ehdoilla voidaan rakentaa algoritmi, joka jakamalla testattavaa lukua kaikilla luvuilla m kokeilee, onko testattava luku alkuluku. Algoritmi voidaan esittää pseudokoodilla: trial_division(n): for (m = 2; m * m <= n; m++) if(n % m == 0) return false; return true; Tämä hyvin yksinkertainen ja deterministinen tapa selvittää, onko luku n alkuluku, on myös erittäin tehoton. Jos n on alkuluku, niin menetelmä vaatii O( (n)) jako-operaatiota tai O(2 (n / 2) ) bittioperaatiota. 3.2.2 Miller-Rabin testi Lause 3.2. (Fermat'n pieni lause) Jos p on alkuluku ja a on positiivinen kokonaisluku ehdolla p a, niin a p - 1 1 (mod p). Todistus. Tarkastellaan p 1 kokonaislukuja a, 2a,, (p 1)a. Mikään näistä kokonaisluvuista ei ole jaollinen luvulla p, jos p ja niin apulauseen 2.3 mukaan p j, koska p a. Tämä on mahdotonta, koska 1 j p 1. Lisäksi mitkään kaksi kokonaislukua a, 2a,, (p 1)a eivät ole kongruentteja modulo p. Havainnollistetaan tämä. Oletetaan, että ja ka (mod p), missä 1 j < k p 1. Seurauslauseen 2.1 mukaan koska (a, p) = 1 saadaan j k (mod p). Tämä on mahdotonta, koska j ja k ovat positiivisia kokonaislukuja p 1. Koska kokonaisluvut a, 2a,, (p 1)a ovat p 1 kokonaislukujoukko kaikki 18
epäkongruentteja 0 ja mitkään kaksi ei ole kongruentteja modulo p, tiedetään, että pienimmät positiiviset jäännökset joukosta a, 2a,, (p 1)a uudelleen järjestettynä ovat kokonaisluvut 1, 2,, p 1. Tästä seuraa, että kokonaislukujen a, 2a,, (p 1)a tulo on kongruentti modulo p ensimmäisten p 1 kokonaisluvun tulolle. Siis, a 2a (p 1)a 1 2 (p 1) (mod p). Näin ollen a p 1 (p - 1)! (p -1)! (mod p). Koska ((p 1)!, p) = 1, käyttäen seurauslausetta 2.1 supistetaan (p 1)! ja saadaan a p-1 1 (mod p). Ensin varmistetaan, että kongruenssi b n - 1 1 (mod n), missä n on pariton kokonaisluku pitää paikkaansa. Toiseksi voidaan kirjoittaa x = b (n 1) / 2, jolloin x 2 = b n - 1 1 (mod n). Jos n on alkuluku, lauseen 2.10. nojalla tiedetään, että x 1 (mod n) tai x -1 (mod n). Jos toinen tai molemmat kongruensseista ei päde tiedetään, että n on yhdistetty luku. Esimerkki 3.1. Valitaan b = 3 ja n = 1105. Huomataan ensimmäisen kongruenssin 4 (1105-1) 1 (mod 1105) toteutuvan. Kokeilemalla 3 (1105 1) / 2 = 3 552 781 (mod 1105) huomataan, ettei toinen kongruenssi pidä paikkaansa, joten 1105 on yhdistetty luku. Määritelmä 3.1. Valitaan positiivinen kokonaisluku n, niin että n - 1 = 2 s t, missä s on ei-negatiivinen kokonaisluku ja t on pariton kokonaisluku. Sanotaan, että n läpäisee Millerin testin kantaluvulla b, kun joko b t 1 (mod n) tai b (2^j)t 1 (mod n), kun 0 j s 1. Lause 3.3. Jos n on alkuluku ja b on positiivinen kokonaisluku, niin että n b, niin n läpäisee Millerin testin kantaluvulla b. 19
Todistus. Olkoon n 1 = 2 s t, missä s on ei-negatiivinen kokonaisluku ja t on pariton positiivinen kokonaisluku. Olkoon x k = b (n 1)/2k = b 2s-k, kun k = 0, 1, 2,, s. Koska n on alkuluku, Fermat n lause kertoo, että x 0 = b n 1 1 mod (n). Lauseen 2.10 mukaan, koska x 2 1 = (b (n 1 ) / 2 ) 2 = x 0 1 (mod n), joko x 1-1 (mod n) tai x 1 1 (mod n). Jos x 1 1 (mod n), koska x 2 2 = x 1 1 (mod n), joko x 2-1 (mod n) tai x 2 1 (mod n). Yleisesti huomataan, että x 0 x 1 x 2 x k 1 (mod n), kun k < s. Koska x 2 k+1 = x k 1 (mod n), näin ollen joko x k+1-1 (mod n) tai x k+1 1 (mod n). Jatkamalla tätä menettelyä kaikille k = 1, 2,, s, huomaataan, että joko x s 1 (mod n), tai x k -1 (mod n) jollakin kokonaisluvulla k, kun 0 k s. Joten, n läpäisee Millerin testin kantaluvulla b. Lause 3.4. Miller-Rabin testi. Olkoon n positiivinen kokonaisluku. Valitaan k erilaista positiivista kokonaislukua, jotka ovat pienempiä kuin luku n ja suoritetaan Millerin testi luvulle n jokaisella valitulla kantaluvulla. Jos n on yhdistetty luku, todennäköisyys, että n läpäisee kaikki k testiä, on pienempi kuin (1 / 4) k. Todistus. Ks. [10] s. 211. Seuraavassa Miller-Rabin -algoritmi [18] apufunktioineen pseudokoodina [7]; modular_exponentation(b, e, m): result = 1; while (e > 0) if ((e & 1) == 1) result = (result * b) % m; e >>= 1; b = (b * b) % m; return result; 20
miller-test(b, n, t, s): x = 0; dx = modular_exponentation(b, t, n); for (i = 1; i <= s; i++) x = (dx * dx) % n; if (x == 1 && dx!= 1 && dx!= (n-1)) return true; dx = x; if (x!= 1) return true; return false; miller-rabin-test(n, k): s = 0; i = n; x = 1; do i /= 2; s++; x *= 2; while (i % 2 == 0); t = (n - 1) / x; for (j = 1; j <= k; j++) a = random(1, n-1); if (miller-test (a, n, t, s)) return false; return true; Miller-Rabin -testiä käytetään yleisesti luotaessa suuria alkulukuja RSA-algoritmin 21
tarpeisiin. Algoritmi ei takaa oikeata tulosta, mutta jos algoritmi suoritetaan arvolla k = 100 on virheen todennäköisyys pienempi kuin 10-60. Jos n on β-bittinen luku, Miller- Rabin -algoritmi vaatii O(sβ) aritmeettista operaatiota ja O(sβ 3 ) bittioperaatiota [6 s. 779]. 3.2.3 AKS testi Intialaiset Manindra Agrawal, Neeraj Kayal ja Nitin Saxena kehittivät tällä hetkellä nopeimman tunnetun deterministisen algoritmin [1] määrittämään, onko luku n alkuluku vai yhdistetty luku. Algoritmi on suoritettavissa polynomisessa ajassa O(log 12 n). Huolimatta polynomisesta suoritusajasta eksponentiaalisen sijaan algoritmi on silti huomattavasti hitaampi kuin epädeterministiset algoritmit, kuten Miller-Rabin. AKS-algoritmi pseudokoodina: AKS(n): if (n = a^b for a ε Ν and b > 1) return false; r = 2; while (r < n) if (gcd(n, r)!= 1) return false; if (r is prime) q = largest prime factor of r 1; j = 4 * sqrt(r) * log(n); k = n^((r - 1) / q); if (q >= j && k % r!= 1) break; r++; for(a = 1; a < 2 * sqrt(r) * log(n); a++) 22
in Z n [X] if ((X + a)^n % (X^r - 1)!= X^(n % r) + a) return false; return true; Lause 3.5. Yllä oleva algoritmi palauttaa arvon true, jos ja vain jos n on alkuluku. Todistus. Ks. [1]. 3.3 Salausavaimen alkutekijät Yleisten suositusten mukaan [19] RSA-salausavaimen R kooksi suositellaan vähintään 1024-bittiä, mikäli suojauksen kestoksi riittää 1-2 vuotta. Yli kahdelle kymmenelle vuodelle suositellaan 2048-bittistä avainta ja yli kolmelle kymmenelle vastaavasti 3072- bittistä. 1024-bittinen R on yli 300-numeroinen ja mikäli tekijät U ja V olisivat keskenään suunnilleen samansuuruisia, tulisi niiden olla noin 150-numeroisia. Alkulukujen U ja V tulisi olla samaa kokoluokkaa bittimääräisesti [4]. Tosin niiden erotus ei saa olla itseisarvoltaan pienempi kuin 2 75. Nykyisille tehokkaille algoritmeille (number field sieve ja quadratic sieve) hankalimpia ovat tapaukset, joissa erotus on itseisarvoltaan pieni. Kun lukua R jaetaan tekijöihin U ja V perusmenetelmät aloittavat yleensä kokonaisluvusta x lähtien ( (n), kunnes löytyy sellainen luku x, että x 2 n = y 2. Kun tämä x löytyy, saadaan välittömästi U = x + y ja V = x y. Luvuilla U 1, V - 1, U + 1, V + 1 tulisi olla alkutekijät r u, r v, s u ja s v, jotka kaikki ovat suuruudeltaan vähintään 2 75 [4]. Myöhemmin luvuissa 4.3 ja 4.5 esiteltävät tekijöihinjakomenetelemät, elliptic curve ja Pollard rho, hyötyvät näiden lukujen pienistä alkutekijöistä. Iteroivalta salauksen purkamiselta suojautuminen vaatii, että luvuilla U 2 ja V 2 on alkutekijät tu ja tv, niin että e (U 2) / tu 1 mod (U - 2), e (V 2) / tv 1 mod (V - 2), t u t v ja t u t v on suuruudeltaan 2 75 päivityksessä [11]. bittiä [4]. Tämä on jo osin huomioita RSA-standardin 23
4 Alkutekijöihin jakaminen Aritmetiikan peruslauseen mukaan jokainen luku voidaan esittää yksikäsitteisesti alkulukujen tulona. RSA-algoritmissa salausavain R muodostetaan kertomalla kaksi suurta alkulukua U ja V. Mikäli luvun R alkutekijät ratkaistaan, on käytetyn julkisen- ja henkilökohtaisen avaimen selvittäminen triviaalia. 4.1 Kokeilu jakamalla Aivan kuten luvun n määrittelemisessä joko alkuluvuksi tai yhdistetyksi luvuksi, voidaan luku n jakaa alkutekijöihin jakamalla se kaikilla mahdollisilla luvuilla d, d > 2 ja d < (n). Tällä kertaa kuitenkin halutaan löytää kaikki tekijät: trial_division(n): d = 2; sqrtn = sqrt(n)+1; while (d <= sqrtn) q = n / d; r = n % d; if (r < 0) r += d; if (r == 0) print(d); n = q; continue; else if (q > d) d++; continue; 24
print(n); break; Jakamalla kokeilu on myös alkutekijöiden etsimisessä tehotonta. Algoritmia voidaan tehostaa jättämällä pois tiettyjä d:n arvoja (esimerkiksi kaikki parilliset luvut luvun 2 jälkeen). Toinen tapa toteuttaa algoritmi on kokeilla jakaa vain jo tunnetuilla alkuluvuilla, mutta tämän edellytyksenä on etukäteen laskettu tietorakenne alkulukuja ja tällä tavalla ei voida löytää uusia alkulukuja, vaikka yhdistettyjen lukujen pienet alkutekijät löytyisivätkin nopeammin. 4.2 Fermat'n menetelmä Apulause 4.1. Jos n on pariton positiivinen kokonaisluku, niin on olemassa yksi yhteen vastaavuus luvun n kahdella positiivisella kokonaislukutekijällä ja kahden neliön erotuksella, joka on yhtä suuri kuin n. Todistus. Ks. [10] s. 112. Fermat n menetelmä perustuu apulauseeseen 4.1. Oletetaan, että pariton kokonaisluku n = uv, missä u v. Koska n on pariton niin u ja v ovat myös parittomia. Olkoon x = (u + v) / 2, y = (v u) / 2, n = x 2 y 2 ja 0 y < x n. Esimerkki 4.1. Jaetaan luku 667 tekijöihin käyttäen Fermat'n menetelmää. Etsitään x 2 n = y 2. Koska 25 < (667) < 26, aloitetaan x = 26: 26 2 667 = 9 = 3 2 Koska 667 = 26 2 3 2, huomataan, että 667 = (26 3)(26 + 3) = 23 29. Fermat'n menetelmä ei ole aina näin tehokas vaan pahimmassa tapauksessa voi joutua kokeilemaan (n + 1) / 2 (n) kokonaislukua ennen kuin täydelliset neliöt x 2 ja y 2 25
löytyvät. Menetelmä toimii parhaiten, jos kokonaisluvulla on kaksi samaa suuruusluokkaa olevaa alkutekijää. Fermat'n perusidea on pohjana monelle tehokkaammalle algoritmille. Fermat'n menetelmän sovellus pseudokoodina [12]: fermat(n): x = 2 * sqrt(n) + 1; y = 1; r = (sqrt(n) * sqrt(n)) - n; while (y < sqrt(n)) if ( r > 0) r -= y; y += 2; continue; if (r == 0) print (((x - y) / 2)); break; else r = r + x; x += 2; 4.3 Pollard rho -menetelmä J. M. Pollard esitteli 1975 menetelmän luvun tekijöiden jakamiseen [4], jota kutsutaan nimellä Pollard rho -menetelmä. Menetelmä toimii millä tahansa alkuarvolla x 0 ja millä tahansa vähintään toisen asteen polynomilla f(x). Valitaan käyttöön yleisesti käytetyt x 0 = 2 ja f(x) = x 2-1. Tarkastellaan sekvenssiä x 0 = 2, 26
2 x i+1 x i - 1 (mod n), missä n on tekijöihin jaettava luku. Vuoroin lasketaan kolme lukua (x i, x 2i, Q i ), i = 1, 2,..., missä Q i = x 2i x i. Kun i on valittu kokonaisluvun m monikerta, suoritetaan d i = syt(q i, n) Jos 1 < d i < n on löytynyt yksi luvun n tekijöistä ja voidaan jatkaa sekvenssiä arvolla n' = n / d i. Esimerkki 4.2. Käytetään Pollard rho -menetelmää alkuluvulla 2 ja polynomilla f(x) = x 2 + 1 löytämään tekijän luvulle n = 8051. x 0 = 2 x 1 = 2 2 + 1 = 5 x 2 = 5 2 + 1 = 26 x 3 = 26 2 + 1 = 677 x 4 = 677 2 + 1 = 458330 % 8051 = 7474 x 5 = 7474 2 + 1 = 55860677 % 8051 = 2839 x 6 = 871 2 + 1 = 758643 % 8051= 871 Q 1 = 26 5 = 21 Q 2 = 7474 26 = 7448 Q 3 = 871 677 = 194 d 1 = syt(21, 8051) = 1 d 2 = syt(7448, 8051) = 1 d 3 = syt(194, 8051) = 97. Eräs Pollard rho -menetelmän toteutus esitettynä [5] pseudokoodilla: 27
pollard-rho(n): x = 5; dx = 2; k = 1; l = 1; d = 0; while (d!= n) d = gcd(dx - x, n); if (d!= 1) print(d); if (d == n) break; else n = n / d; x = x % n; if (x < 0) x += n; dx = dx % n; if (dx < 0) dx += n; continue; else k -= 1; if (k == 0) dx = x; k = l; l *= 2; x = (x * x + 1) % n; if (x < 0) x += n; 28
Alkuperäinen Pollard rho -menetelmä pystyi löytämään kokonaisluvulle n tekijän O(n 1 / 2 ) aritmeettisella operaatiolla. Paranneltu pseudokoodina esitetty versio pystyy samaan O(n 1 / 4 ) operaatiolla. 4.4 Pollard p - 1 -menetelmä Menetelmän kehitti J. M. Pollard vuonna 1974 [16]. Menetelmä löytää tekijän kokonaisluvulle n, kun luvulla n on alkutekijä p, niin että p 1 alkutekijät ovat suhteellisen pieniä. Olkoon n tekijöihin jaettava positiivinen kokonaisluku. Oletetaan, että luvulla n on alkutekijä p, niin että p - 1 k!, kun k on positiivinen kokonaisluku. Fermat'n lauseen perusteella tiedetään, että 2 p - 1 1 (mod p). Koska p - 1 k!, k! = (p 1)q jollakin kokonaisluvulla q. Joten 2 k! = 2 (p - 1)q = (2 p - 1 ) q 1 q = 1 (mod p), mikä merkitsee, että p 2 k! - 1. Olkoon M pienin positiivinen jakojäännös 2 k! - 1 modulo n, niin että M = (2 k! - 1) nt jollakin kokonaisluvulla t. Nähdään, että p M koska se jakaa kummatkin 2 k! - 1 ja n. Tekijä luvulle n löytyy laskemalla suurin yhteinen tekijä d = (M, n). Jotta tekijä d olisi ei-triviaali, tulee M arvon olla erisuuri kuin 0. Mikäli M = 0 niin luku n ei ole tekijä luvulle 2 k! - 1, tämä on todennäköistä mikäli luvulla n on suuria alkutekijöitä. Esimerkki 4.3. Etsitään luvulle 667 tekijä käyttäen Pollard p - 1 -menetelmää: r 1 2 1 2 (mod 667) syt(2-1, 667) = syt(1, 667) = 1 r 2 r 2 1 = 2 2 4 (mod 667) syt(4-1, 667) = syt(3, 667) = 1 r 3 r 3 2 = 4 3 64 (mod 667) syt(64-1, 667) = syt(63, 667) = 1 r 4 r 4 3 = 64 4 165 (mod 667) 29
syt(165-1, 667) = syt(164, 667) = 1 r 5 r 5 4 = 165 5 633 (mod 667) syt(633-1, 667) = syt(632, 667) = 1 r 6 r 6 5 = 633 6 400 (mod 667) syt(400-1, 667) = syt(399, 667) = 1 r 7 r 7 6 = 400 7 349 (mod 667) syt(349-1, 667) = syt(348, 667) = 29 Pollard p - 1 -menetelmä esitettynä pseudokoodilla: pollard_p-1(n, r): d = 1; k = 1; while (d == 1) k++; r = modular-exponentation(r, k, n); d = gcd((r-1), n); if (r == 0) break; return d; Esimerkissä käytetty kantaluku oli 2. Metodilla voidaan käyttää myös muita kantalukuja ja joissain sovelluksissa myös arvoa k on rajattu kasvamaan vain tiettyyn pisteeseen kullekin kantaluvulle. Tällaisen algoritmin vaatima aika on O(B log B log 2 n), kun B on arvo mihin luvun k kasvu on rajattu. 30
4.5 Elliptinen käyrä -menetelmä H. W. Lenstra Jr. kehittämä elliptinen käyrä -menetelmä (Elliptic Curve method tai ECM) positiivisten kokonaislukujen jakamisesta tekijöihin [15] on yhdenmukainen Pollard p-1 -menetelmän kanssa. Kumpikin hyödyntää Fermat'n lausetta. Menetelmät valitsevat kokonaisluvun a (mod n) ja positiivisen kokonaisluvun k, joka on jaollinen monella pienellä alkuluvulla. Seuraavaksi lasketaan a k (mod n) ja toivotaan, että löydetään ei-triviaali luvun n tekijä laskemalla syt(a k - 1, n). Elliptinen käyrä -menetelmä korvaa Pollard p-1-menetelmän moninkertaistuvan joukon b k! elliptisellä käyrällä. Menetelmän kompleksisuus riippuu tekijän koosta ja voidaan esittää O(e (1 + o(1)) (ln p ln ln p) ), missä p on luvun n pienin tekijä. Menetelmän tarkempi kuvaus on monimutkaisuudeltaan tämän tutkielman ulkopuolella. Suurin raportoitu ECM:llä löydetty alkutekijä on 67-numeroinen. Löydön teki B. Dodson 24. elokuuta 2006 [25]. 4.6 Quadratic Sieve eli neliöseula Quadratic Sieve (neliöseula tai QS) -menetelmän kehitti alun perin Carl Pomerance 1981 ja se oli nopein tunnettu tekijöihinjakoalgoritmi vuoteen 1993 asti ja se on nopein tunnettu algoritmi noin alle 110-numeroisten lukujen tekijöihin jakamiseen. Algoritmista on olemassa useampi muunnelma kuten The Multiple Polynomial Quadratic Sieve (MPQS) ja The Double Large Prime MPQS. QS pyrkii löytämään sellaiset luvut x ja y, että x ±y (mod n) ja x 2 y 2 (mod n), josta seuraa, että (x y)(x + y) 0 (mod n) ja kun suoritetaan syt(x y, n) niin saadaan noin ½ todennäköisyydellä ei-triviaali tekijä luvulle n. QS hyödyntää valmiiksi laskettua alkutekijäkantaa ja optimaalinen ajoaika on O(e (ln(n)ln(ln(n)) ). [13] The Double Large Prime MPQS -algoritmilla ratkaistiin RSA-129 haaste [2] vuonna 1994. Haaste oli alun perin esitelty vuonna 1977 ja siinä oli tarkoituksena jakaa tekijöihin 129-numeroinen RSA-salausavain R. Sen aikaisella tietokoneella, käyttäen parasta tunnettua algoritmia, haasteen ratkaisuun oletettiin kuluvan 40 kvadriljoonaa vuotta. Haasteen ratkaissut joukko käytti seulontavaiheessa 220 päivää ja 1600 konetta ympäri maailmaa laskemaan 569466 x 524399 hajanaisen bittimatriisin. Varsinainen 31
prosessointi esigeneroidulla matriisilla kesti 45 tuntia 16K MasPar MP-1 supertietokoneella. Vuonna 1977 RSA-salakirjoitettussa viestissä luki: The Magic Words are Squeamish Ossifrage. 4.7 Number Field Sieve eli lukukuntaseula Tällä hetkellä nopein tunnettu tekijöihinjakomenetelmä on A. K. Lenstran, H. W. Lenstran, Jr., M. S. Manassen, ja J. M. Pollardin vuonna 1993 julkaisema Number Field Sieve (lukukuntaseula tai NFS) [6]. Lukukuntaseulalla viitataan kahteen eri menetelmään. Erityinen lukukuntaseula (Special Number Field Sieve) toimii ainoastaan luvuille muotoa r e s, kun r ja s ovat pieniä ja e mikä tahansa positiivinen kokonaisluku. Suurin erityisellä lukukuntaseulalla tekijöihin jaettu luku on 313- numeroinen 2 1039-1 [25]. Yleinen lukukuntaseula (General Number Field Sieve tai GNFS) laajensi alkuperäisen menetelmän mielivaltaisille kokonaisluvuille. Lukukuntaseula, kuten neliöseula ja Fermat'n menetelmä, pyrkii löytämään sellaiset luvut x ja y että x ±y (mod n) ja x 2 y 2 (mod n). Kuten neliöseula, myös lukukuntaseula koostuu useammasta vaiheesta, joista osa voidaan jakaa esimerkiksi verkon yli prosessoitavaksi useammalla eri solmulla. Seulontavaiheessa lasketaan neliöitä taulukkoon tai matriisiin ja testataan ne valitulla joukolla alkulukuja. Tarkoituksena on löytää tarpeeksi tasaisia (englanniksi smooth ) lukupareja matriisivaiheeseen. Otaksuttu aika kokonaisluvun n jakamiselle tekijöihin GNFS:llä on O(e (log n)^(1 / 3) ((64 / 9)+o(1)log log n)^(2 / 3) ). GNFS-menetelmällä ratkaistiin RSA-200 -haaste 9. toukokuuta 2005 [25]. Haasteessa selvitettiin tekijät 200-numeroiselle (663-bittiä) RSA-salausavaimelle R. Haasteeseen kului 170 vuotta Pentium 1 GHz CPU -aikaa. Todellisuudessa seulavaihe alkoi vuoden 2003 lopussa ja päättyi lokakuuhun 2004. Haasteen ratkaissut ryhmä arveli tässä vaiheessa käytetyn noin 55 2,2 GHz Opteron -vuotta. Matriisivaihe suoritettiin 80 2,2 GHz Opteronin klusterilla kolmessa kuukaudessa. 32
4.8 Tekijöihinjakolaitteistot 4.8.1 TWINKLE eli pilke Yksi alkuperäisistä RSA-algoritmin kehittäjistä, Adi Shamir, esitteli helmikuussa 1999 idean optisesta laitteesta, joka pystyisi lukukuntaseulaa käyttämällä jakamaan tekijöihin jopa 512-bittisiä numeroita [22][14]. Tämä teoreettinen laite ristittiin TWINKLE:ksi (The Weizmann Institute Key Locating Engine). TWINKLE koostuu suuresta määrästä LED-valoja, jotka tuikkivat eri taajuuksilla, ja fotoilmaisimesta, joka mittaa kaikkien LED-valojen yhteensä säteilemää valon määrää millä tahansa hetkellä. Jokainen LED-valo vastaa yhtä alkulukua ja jokainen ajanhetki ehdokasta tasaiseksi ( smooth ) neliöksi. Fotoilmaisin hälyttää liitetyn PC:n, kun valon määrä ylittää tietyn kynnyksen. Näiden harvalukuisten hälytysten ajoituksesta voi PC laskea ehdokasneliön ja tarkistaa sen tasaisuuden ja käyttää sitä perinteisessä lukukuntaseulan matriisivaiheen toteutuksessa. Ideaa valojen käytöstä puoltaa useampi seikka. LED-valoilla päästään paljon muistia suurempaan kellotaajuuteen. Kun PC-laitteiden muisti toimii noin tavallisesti noin 333-1000 megahertsin taajuudella, päästään LED-valoilla yli 10 gigahertsin kellotaajuuksiin. Optisia osia voi olla mukana tuhansia ja todennäköisyyteen pohjautuvassa algoritmissa ei välttämättä tarvitse tarkkaa summaa. Kaikkien osien yhteistulos voidaan laskea yhdessä kellojaksossa. Digitaalinen laskin, joka laskee 200000 syötteen summan yhdessä kellojaksossa, on mahdoton. 4.8.2 TWIRL eli pyörre TWIRL (The Weizmann Institute Relation Locator) [23], kuten TWINKLE:kin, on hypoteettinen laite, jota kukaan ei ole rakentanut. Kuten edeltäjänsä, myös sen tarkoituksena on nopeuttaa yleisen lukukuntaseulan seulontavaihetta. TWIRL perustuu perinteiseen prosessoritekniikkaan, mutta se hyödyntää tehokkaasti rinnakkaista prosessointia ja muistin käyttöä. Idean kehittäjät Adi Shamir ja Eran Tromer arvioivat, että TWIRL pystyisi murtamaan 1024-bittisen RSA-salausavaimen R yhdessä vuodessa ja sen rakentaminen maksaisi noin kymmenen miljoonaa dollaria.. 33
4.8.3 Muita erityislaitteita TWINKLE:n ja TWIRL:in lisäksi on esitetty myös muita hypoteettisia laitteita, joilla alkutekijöihin jako olisi helppoa ja tehokasta, kuten esimerkiksi SHARK [9] ja Bernsteinin piiri [3]. Yhteistä näille laitteille on korkea hinta ja korkea teoreettisuuden aste. Kukaan ei voi varmuudella sanoa, kuinka hyvin ne toimisivat käytännössä. Teoreettinen laskentatehon lisäys tekijöidenjaossa, ja sitä kautta RSA-salauksen murtamisessa, on tavallisiin laitteisiin verrattuna huomattava. Vaikka kukaan ei näitä laitteita ole rakentanut, niin niitä ei voi jättää huomioimatta, kun arvioidaan RSA-salauksessa käytettävän avaimen suuruutta. Kymmenen miljoonaa dollaria voi olla jollekin taholle pieni hinta jonkun tietyn salauksen purkamisesta. 34
5 Yhteenveto On huomioitavaa, että kun salaus perustuu laskennalliseen vaikeuteen, se ei voi olla ikuinen. RSA-algoritmin tapauksessa sitä uhkaavat lukuteoreettiset mallit, lähinnä entistä tehokkaammat tekijöihinjakomenetelmät, räätälöidyt laitteistot, yksittäisten tietokoneiden laskentatehon kasvaminen ja yhä kehittyvät useiden tietokoneiden laskentatehon yhdistävät hajautetut järjestelmät tai ryppäät. Esimerkiksi Folding@home -projektin hajautetun laskentajärjestelmän teho oli 6.4.2008 1494 teraflopsia (flops = floating point operations per second), kun yksittäisen koneen epävirallinen maailmanennätys 4.2.2008 on Texasin yliopiston supertietokone Rangerin 504 teraflopsia [8]. Kun pitää huolen siitä, että käyttää tarvittavan isoja salausavaimia, eikä oleta tiedon pysyvän salattuna kvadriljoonia vuosia, on RSA algoritmi yhtä turvallinen kuin aiemminkin. Avainten kokoa voidaan kasvattaa rajatta, kunhan laskentatehoa löytyy. Yhden yksittäisen ison avaimen mahdollinen murtaminen ei tarkoita sitä, että samankokoisten avainten murtaminen olisi jokapäiväistä. 35
Viiteluettelo [1] M. Agrawal, N. Kayal and N. Saxena, PRIMES is in P, Annals of Mathematics 160 (2004), 781-793. [2] D. Atkins, M. Graff, A. K. Lenstra and P. C. Leyland, The magic words are squeamish ossifrage, Lecture Notes in Computer Science, Volume 917 (1995), 263-277. [3] Daniel Bernstein, Circuits for Integer Factorization: A Proposal, 9. marraskuuta 2001. Saatavilla http://cr.yp.to/papers.html. [4] Antoon Bosselaers and Bart Preneel, Integrity Primitives for Secure Information Systems, Lecture Notes in Computer Science, Volume 1007 (1995), 213-241. [5] Richard P. Brent, An Improved Monte Carlo Factorization Algorithm, BIT Numerical Mathematics 20 (1980), 176-184, [6] Steven Byrnes, The Number Field Sieve, Math 129: Topics in Number Theory, 2005. [7] T. Cormen, C. Leiserson, R. Rivest and C. Stein, Introduction to Algorithms, 2 nd edition, McGraw-Hill, 2001. [8] Aaron Dubrow, Powering Discoveries, 18. helmikuuta 2008. Saatavilla http://www.tacc.utexas.edu/research/users/features/ranger.php [9] Jens Franke, Thorsten Kleinjung, Christof Paar, Jan Pelzl, Christine Priplata and Colin Stahlke, SHARK: A Realizable Special Hardware Sieving Device for Factoring 1024-Bit Integers, Lecture Notes in Computer Science, Volume 3659 (2005), 119-140. [10] G.H. Hardy and E.M. Wright, An Introduction to the Theory of Numbers, 4 th edition, Oxford University Press, 1975. [11] J. Jonsson and B. Kalinski, RFC3447: Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1. RSA Laboratories, 2003. [12] Donald E. Knut, The Art of Computer Programming, 2 nd edition, Addison Wesley, 1981, 371-373. [13] Eric Landquist, The Quadatic Sieve Factoring Algorithm, Math 488: Cryptographic Algorithms, 2001. 36
[14] Arjen K. Lenstra and Adi Shamir, Analysis and Optimization of the TWINKLE Factoring Device, Lecture Notes in Computer Science, Volume 1807 (2000), 35-52. [15] H. W. Lenstra Jr., Factoring integers with elliptic curves, Annals of Mathematics 126 (1987), 649-673. [16] J. M. Pollard, Theorems of Factorization and Primality Testing, Proceedings of the Cambridge Philosophical Society 76 (1974), 521-528. [17] J. M. Pollard, A Monte Carlo method for factorization, BIT Numerical Mathematics 15 (1975), 331-334. [18] M. O. Rabin, Probabilistic algorithm for testing primality. Journal of Number Theory, Volume 12 (1980), 128-138. [19] Recommendation for Key Management Part 1: general, NIST Special Publication 800-57, 2007 [20] R.L. Rivest, A. Shamir, and L.M. Adleman, A method for obtaining digital signatures and public-key cryptosystems. Communications of the ACM, Volume 21 (1978), 120-126. [21] Kenneth H. Rosen, Elementary Number Theory and Its Applications. Addison Wesley Longman, 2000. [22] Adi Shamir, Factoring Large Numbers with the TWINKLE Device, Lecture Notes in Computer Science, Volume 1717 (1999), 2-12. [23] Adi Shamir and Eran Tromer, Factoring Large Numbers with the TWIRL Device, Lecture Notes in Computer Science, Volume 2729 (2003), 1-26. [24] Douglas Stinson, Cryptography: Theory and Practice, CRC Press, 1995. [25] Paul Zimmermann, Integer Factoring Records, 9. tammikuuta 2008. Saatavilla http://www.loria.fr/~zimmerma/records/factor.html. 37