Julkisten avainten salausmenetelmät Sami Jaktholm, Olli Kiljunen, Waltteri Pakalén 16. lokakuuta 2014 1 Taustaa Kautta ihmiskunnan historian erilaisia salausmenetelmiä on käytetty estämään luottamuksellisen tiedon joutumista vääriin käsiin. Varhaisimmat historialliset viitteet salauksen käytöstä yltävät 4000 vuoden taakse muinaiseen Egyptiin. Nykyaikana salausmenetelmiä käytetään paljon muun muassa tietokoneverkoissa tapahtuvassa viestinnässä.[1] Salauksella tarkoitetaan viestin kirjoittamista siten, etteivät asiaankuulumattomat tahot kykene sitä ymmärtämään. Salatun viestin ymmärtämiseksi siis salauksen purkamiseksi (decrypting) viestin vastaanottajalla täytyy olla tieto siitä, miten salaus puretaan. Tätä tietoa kutsutaan salauksen avaimeksi (key). Vastaavasti viestin kirjoittajalla pitää olla tieto siitä, miten viesti tulee salata (encrypt). Jos salaamiseen ja salauksen purkamiseen käytetään samaa avainta, salausmenetelmää kutsutaan symmetriseksi. 1970-luvulle asti kaikki kehitetyt salausmenetelmät olivat symmetrisiä ja perustuivat siihen, että käytetty avain on ainoastaan asiaankuuluvien tahojen tiedossa.[2][3] Salaisten avainten käyttö viestin salauksessa edellyttää, että osapuolten välillä on jo ennestään jokin luottamuksellinen kanava (esim. kasvokkain tapaaminen), jolla avaimesta voidaan sopia. Niinpä mm. monet nykyiset WWWpalvelut olisi käytännössä mahdotonta toteuttaa pelkästään salaisiin avaimiin nojautuen.[3] 1970-luvulla keksittiin julkisiin avaimiin perustuva salaus. Julkisten avainten salausmenetelmissä osa käytetyistä avaimista on julkisia, toisin sanoen kaikkien osapuolten saatavissa. Monet tällaisista menetelmistä perustuvat asymmetriseen salaukseen, jossa salaamiseen ja salauksen purkuun käytetään eri avaimia. Vain salauksen purkuun käytettävän avaimen tulee olla salainen, ja sitä sanotaankin yksityiseksi avaimeksi (private key). Tämä yksityinen avain 1
on ainoastaan vastaanottajan tiedossa. Viestin salaamiseen käytettävä avain on julkinen avain (public key). Näin ollen on mahdollista lähettää salattu viesti vastaanottajalle tietäen ainoastaan tämän käyttämä julkinen avain. Lisäksi useat eri tahot voivat lähettää vastaanottajalle viestejä yhtä ja samaa julkista avainta käyttäen kykenemättä kuitenkaan purkamaan toistensa viestejä.[3] Ensimmäisenä julkisten avainten salausmenetelmiä tutkivat toisistaan riippumatta Ralph Merkle Berkeleyssa sekä Whitfield Diffie ja Martin Hellman Stanfordin yliopistossa. Tutkimuksensa tuloksena Diffie ja Hellman julkaisivat marraskuussa 1976 IEEE Transactions on Information Theory -lehdessä artikkelin New Directions in Cryptography, jossa ensimmäistä kertaa kuvattiin julkisten avainten salausmenetelmän periaate ja annettiin esimerkki menetelmän toteutuksesta. Heidän esittämänsä salausalgoritmi oli vielä symmetrinen, mutta se mahdollisti viestin salauksen ilman lähettäjän ja vastaanottajan kesken sovittua salaista avainta.[3][4, s. 52] Diffien, Hellmanin ja Merklen töiden innoittamina tutkijat ympäri maailman alkoivat kehitellä julkisiin avaimiin perustuvia salausmenetelmiä, jotka toimisivat myös käytännössä. Eräs läpimurto tällä saralla tehtiin jo heti seuraavana vuonna 1977, kun MIT:n tutkijat Ronald Rivest, Adi Shamir ja Leonard Adleman julkaisivat RSA-salausmenetelmän, joka on asymmetrinen ja perustuu kahden alkuluvun tulon laskemiseen. RSA:han pohjautuvia salausmenetelmiä on sittemmin käytetty runsaasti mm. Internetin välityksellä tapahtuvassa viestinnässä.[3] 2 Diffie-Hellman avaimenvaihtoprotokolla Diffie-Hellman-avaimenvaihtoprotokollan ideana on, että julkisen tiedon pohjalta osapuolet pystyvät yksityisillä avaimillaan luomaan yhtäläisen salaisen avaimen. Tämän jälkeen avain toimii viestien salaamiseen ja purkamiseen. Algoritmissa itsessään sovelletaan suhteellisen alkeellista modulaariaritmetiikkaa. Algoritmi toimii kahden osapuolen välillä seuraavasti: 1. Osapuolet yhdessä valitsevat alkuluvun p ja kokonaisluvun g, jossa 1 < g < p. 2. Molemmat osapuolet valitsevat yksityisesti kokonaisluvut a ja b kertomatta niitä toisilleen. 2
3. Osapuolet laskevat g a (mod p), g b (mod p) ja ilmoittavat saadut tulokset toisilleen. 4. Salainen avain saadaan laskemalla (g a ) b (mod p) (g b ) a (mod p). Algoritmin niin sanotussa perusmuodossa ei kiinnitetä huomiota salauksen turvallisuuteen. Turvallisuuden kannalta kuitenkin optimaalinen tilanne olisi se, jossa alkuluku p on suuri ja g on primitiivinen juuri modulo p. Alkuluvun p suuruus määrää (Z/pZ) koon. Toisaalta jos g ei ole primitiivinen juuri modulo p, se generoi vain (Z/pZ) osajoukon. Tällöin g:n arvojoukko ei hyödynnä maksimaalista potentiaaliaan. Esimerkiksi olkoon p = 23, g = 5, a = 6 ja b = 15. p:n alkuluvullisuus tiedetään näin pienillä luvuilla, mutta suurilla luvuilla voidaan soveltaa pseudoalkulukuja. Saadaan g a (mod p) = 5 6 8 (mod 23) g b (mod p) = 5 15 19 (mod 23) (g b ) a (mod p) = (5 15 ) 6 2 (mod 23) Siis salainen avain tässä tapauksessa on 2, jota voidaan käyttää symmetrisen salauksen salausavaimena. 2.1 Diffie-Hellmanin matemaattinen perusta Diffie-Hellman toimii yksinkertaisten potenssien laskusääntöjen takia. Koska henkilö A tietää luvut a ja g b, hän voi laskea salaisen avaimen (g b ) a = g ab. Toisaalta henkilö B tietää luvut b ja g a, ja hän saa salaisen avaimen tietoonsa laskemalla (g a ) b = g ab. Jos kolmas osapuoli tietää arvot g a ja g b, hän kykenee laskemaan ainoastaan g a g b = g a+b g ab. Salaisen avaimen selvittäminen vaatii niin kutsutun diskreetin logaritmin laskemisen, joka on määritelty seuraavasti [5, s. 103]: Määr. Olkoon G äärellinen syklinen ryhmä (järjestysluku n) ja g tämän ryhmän generaattori. Kokonaisluvun b diskreetti logaritmi kannassa g on yksikäsitteinen kokonaisluku x, jolle pätee b = g x. Jos passiivinen kolmas osapuoli kykenee selvittämään toisen avaimen generoinnissa käytetyistä potensseista a tai b eli löytämään luvun g a tai g b diskreetin logaritmin, hän pystyy laskemaan salaisen avaimen arvon ja purkamaan 3
salauksen. Jos ryhmä G on suuri, diskreetin logaritmin laskeminen on laskennallisesti vaikeaa. Diffie-Hellmanin turvallisuus perustuukin juuri tähän diskreetin logaritmin ongelmaan.[4, s. 53] 2.2 Diffie-Hellmanin heikkous Diffie-Hellmanin suurin heikkous on, että se on avoin Man In the Middle -hyökkäykselle. Tässä hyökkääjä kaappaa A:n viestin g a ja korvaa sen itse valitsemallaan arvolla g t. Vastaavasti hän kaappaa B:n viestin g b ja korvaa sen arvolla g s.[4, s. 53] Nyt henkilöllä A on salainen avain g at, B:llä g bs ja hyökkääjä tietää nämä molemmat. Kun A lähettää viestin B:lle, hyökkääjä purkaa, lukee ja muokkaa viestiä mielensä mukaan, salaa sen B:n avaimella ja välittää viestin B:lle. A ja B ovat täysin tietämättömiä hyökkäyksestä. Tämän johdosta turvallinen Diffie-Hellman vaatii lisäalgoritmin, jolla avaimia vaihtavat osapuolet tunnistautuvat toisilleen.[4, s. 56] 3 RSA Toinen julkisten avainten salausmenetelmä on RSA. Se on asymmetrinen ja perustuu kahden alkuluvun tulon laskemiseen. 3.1 Avainten generointi RSA-salausta varten luodaan avainpari, joka koostuu julkisesta ja yksityisestä avaimesta. Julkista avainta käytetään viestin salaamiseen ja yksityistä avainta sen purkuun. Julkinen avain pitää sisällään kaksi lukua n ja e. n on kahden satunnaisesti valitun suuren alkuluvun p ja q tulo. Käytännössä alkuluvut p ja q voidaan löytää valitsemalla jokin satunnaisluku, testaamalla, onko se alkuluku, ja tarvittaessa arpomalla uusi satunnaisluku. Alkulukutestinä voidaan käyttää esimerkiksi Miller-Rabinin algoritmia. Kun n = pq on valittu, valitaan luku e, jolle pätee 1 < e < φ(n) ja gcd(e, φ(n)) = 1. Osoittautuu, että näiden ehtojen puitteissa e:n suuruudella ei ole suoraa merkitystä salauksen luotettavuuteen. Sen vuoksi e:n arvoksi valitaan RSA:n to- 4
teutuksissa usein jokin pieni luku kuten 3, 17 tai 65537. φ(n) on puolestaan helposti laskettavissa, kun n:n tekijät p ja q tiedetään, sillä φ(n) = φ(p)φ(q) = (p 1)(q 1). Yksityinen avain on luku d, joka saadaan ratkaisemalla yhtälö ed = 1 (mod φ(n)). Tämä pystytään tehokkaasti laskemaan, kun tiedämme n:n tekijät p ja q. 3.2 Salaus- ja purkufunktiot RSA-menetelmä perustuu funktioon E : X X, missä E(x):llä on olemassa käänteisfunktio. Olkoon julkinen avain (n, e). Tällöin salaus RSAmenetelmällä toteutetaan funktiolla E(x) = x e (mod n). Salauksen purkaminen vaatii E(x) 1 laskemisen. Miten saamme E 1 :n selville? Propositio. Olkoon n jokin kokokonaisluku, joka on erisuurien alkulukujen tulo. n on siis muotoa n = n 1...n k. Olkoot myös e ja d luonnollisia lukuja, joille pätee (n i 1) (de 1) kaikilla i {1,..., k}. Tällöin kaikille kokonaisluvun a arvoille pätee a de a (mod n). Todistus. n a de a jos ja vain jos n i a de a. Siis todisteeksi riittää, että a de a (mod n i ). gcd(n i, a) 1 implikoi, että n i on a:n tekijä jolloin a 0 (mod n i ) = a de a (mod n i ). Toisaalta jos gcd(n i, a) = 1, niin Fermat n pienen lauseen mukaan a n i 1 1 (mod n i ). Oletuksen mukaan (n i 1) (de 1) joten saadaan a de 1 1 (mod n i ) = a de a (mod n i ). Propositiomme mukaan E 1 selvittämiseksi täytyy löytää jokin d, jolla pätee (n i 1) (de 1) kaikilla n i, jossa n i on julkisen avaimen (n, e) n:n tekijä. Saadaan (de 1) 0 (mod (n 1 1)...(n k 1)). Koska n i on alkuluku niin n i 1 on Eulerin φ-funktion mukaan φ(n i ). Tällöin kaikkien n:n tekijöiden Eulerin φ-funktioiden tulosta saadaan φ(n). = de 1 (mod φ(n)). Avaimen generointivaiheessa e valittiin siten että gcd(e, φ(n)) = 1, joten yhtälölle saadaan ainutlaatuinen ratkaisu d. 5
Tiedetään, että a de a (mod n). Tiedämme myös julkisesta avaimesta (n, e) e:n ja d:n saimme selville n:n tekijöiden avulla. Joten jos salausfunktio on E(x) = x e (mod n), niin purkamisfunktio on E 1 (E(x)) = E(x) d (mod n). 3.3 Esimerkki Valitaan kaksi alkulukua p = 127 ja q = 61. Nyt n = 127 61 = 7747 ja φ(n) = (127 1) (61 1) = 7560. Valitaan julkiseksi eksonentiksi e = 61. Nyt salainen avain saadaan ratkaistua yhtälöstä 61x = 1 (mod 7560) eli x = 5701 (mod 7560). RSA-systeemin avaimet ovat siis seuraavia: julkinen avain (7747, 61) yksityinen avain (5701) Salataan seuraavaksi viesti m = 581: c = E(581) = 581 61 = 5156 (mod 7747) Yksityisen avaimen omistaja purkaa salatekstin seuraavasti: m = D(5156) = 5156 5701 = 581 (mod 7747) 3.4 RSA:n turvallisuus 3.4.1 RSA-ongelma Viestin selvittäminen RSA-salatusta viestistä vaatii RSAP (The RSA problem) selvittämisen. Määr. (RSAP) Olkoon n kahden erisuuren alkuluvun tulo, eli n = pq. Olkoon myös e kokonaisluku, jolle pätee gcd(e, (p 1)(q 1)) = 1, ja c joku kokonaisluku. Laske m, jolle pätee m e c (mod n). RSAP voitaisiin ratkaista jakamalla n tekijöihin. Toisaalta jos henkilö, joka ei tiedä n:n tekijöitä, tietää salaisen avaimen d, voisi hän jakaa n:n tekijöihin d:n avulla. Siispä n:n tekijöihin jako ja salaisen avaimen d selvittäminen ovat yhtä haasteellisia ongelmia. [4, s. 287] Julkisen avaimen (n, e) n ja e takaavat, että RSAP:ssa jokaiselle c:lle on ainoastaan yksi m, jolle pätee m e c (mod n).[5, s. 98] 6
3.4.2 Alkulukujen p ja q valinta RSA:n turvallisuus menetetään, jos avaimen n muodostavat tekijät p ja q valitaan huonosti. Mikäli toinen tekijöistä on pieni, se on mahdollista löytää käyttäen esimerkisksi elliptisten käyrien tekijöihinjakoalgoritmia. Siksi lukujen p ja q tulisikin olla samaa suuruusluokkaa.[5, s. 290] Edellisen nojalla voisi tuntua järkevältä valita ensin satunnainen p ja sitten q etsimällä p:tä seuraavaa alkuluku, jolloin ne ainakin olisivat samaa suuruusluokkaa. Tällainen menettely tekisi kuitenkin salauksen helposti murrettavaksi, sillä mikäli p ja q ovat lähekkäisiä lukuja, ne voidaan löytää ns. Fermat n menetelmää käyttäen: Asetetaan aluksi t = n ja kasvatetaan t:tä yhdellä, kunnes löydetään sellainen t, jolla t 2 n = s 2, jossa s on kokonaisluku. Nyt p:n ja q:n arvot ovat t ± s. Jos siis p q = 2s on pieni luku, t on vain hieman suurempi kuin n, ja se löytyy nopeasti yllä kuvatulla menetelmällä. Kuitenkin, jos p ja q valitaan satunnaisesti toisistaan riippumatta, ei ole syytä otaksua niiden osuvan niin lähelle toisiaan, että Fermat n menetelmä olisi muita tekijöihinjakoalgoritmejä tehokkaampi. [4, s. 62-63] 3.4.3 Eksponettien e ja d valinta Periaatteessa avainparia muodostettaessa voitaisiin kumpi tahansa eksponenteista e ja d valita mielivaltaisesti (aiemmin mainitut ehdot täyttäen). Näin ollen, jos tavoitteena olisi optimoida salauksen purkamiseen kuluva aika, voitaisiin valita pieni d ja laskea sen perusteella e. Tämä ei kuitenkaan olisi turvallista, sillä d:n ollessa pieni hyökkääjän on mahdollista laskea se n:n ja e:n avulla käyttäen esimerkiksi Pollardin ρ-algoritmia. [5, s. 288, 313] 3.4.4 Pieni viestiavaruus Jos hyökkääjä saa käsiinsä Aliisalle lähetetyn viestin salatekstin ja mahdollisten viestien joukko on pieni, hyökkääjä voi salata jokaisen viestin Aliisan julkisella avaimella ja verrata saatua salatekstiä kaappaamaansa viestiin. Jos hyökkääjän salaama testiviesti on sama kuin kaapattu salateksti, hyökkääjä on löytänyt alkuperäisen Aliisalle tarkoitetun viestin. [5, s. 288] Jos Aliisa kuitenkin laajentaa viestiavaruutta M liittämällä jokaiseen viestiin satunnaisen merkkijonon m N (nonce), hyökkääjän työtaakka lisääntyy merkittäväksi. Nyt hyökkääjän täytyy jokaisen mahdollisen viestin sijasta ( M kpl) kokeilla kaikkia mahdollisia viestien ja merkkijonojen yhdistelmiä, joita on M N kappaletta. 7
3.4.5 Viesti- ja salatekstiavaruuden syklisyys Jos salausoperaatiota toistetaan useita kertoja, jossain vaiheessa tulokseksi tulee alkuperäinen salateksti, sillä salausoperaatio on permutaatio rajoitetussa joukossa. Jos salattu viesti on m, alkuperäinen salateksti on c = m e (mod n). Toistamalla salausoperaatiota saadaan jono salatekstejä c e, c e2, c e3, jne. Kun alkuperäinen salateksti toistuu eli c ek = c (mod n), alkuperäinen viesti oli jonon edellinen jäsen m = c ek 1, sillä (c ek 1 ) e = c ek = c on muotoa m e = c.[5, s. 288] Koska olemme löytäneet luvun d = k 1, jolle pätee c ed = m olemme löytäneet tämän RSA-kryptosysteemin salaisen avaimen d. Salaisen avaimen tietäminen johtaa kuitenkin suoraan julkisen avaimen n tekijöihinjakoon. Täten syklisyyden hyödyntäminen RSA:n purkamisessa on ekvivalentti julkisen avaimen tekijöihinjaon kanssa. Koska tekijöihinjaon tiedetään olevan vaikeaa ja RSA:n turvallisuus perustuu tähän ongelmaan, edellä esitetty menetelmä ei uhkaa RSA:n turvallisuutta.[4, s. 64][5, s. 289] 4 Esimerkkisovellus: Transport Layer Security (TLS) Transport Layer Security on verkkoliikenteen salaukseen käytettävä protokolla, joka hyödyntää julkisen avaimen kryptosysteemejä symmetrisen salausavaimen vaihdossa. TLS:ssä verkkopalvelin esittää asiakkaalle sertifikaatin, joka sisältää tarvittavat julkiset parametrit, ja on asiakkaan luottaman tahon (Certificate Authority, CA) allekirjoittama. Allekirjoituksen tarkoituksena on taata, että jokin luotettava kolmas osapuoli on todennut sertifikaatin sisältämän julkisen avaimen kuuluvan taholle, joka omistaa kyseisen verkkopalvelun. 4.1 Diffie-Hellman TLS:ssä Diffie-Hellmia käytetään TLS-avainten vaihdossa kahdella eri tavalla. Normaalissa DH-avaintenvaihdossa verkkopalvelu lähettää asiakkaalle sertifikaatin, joka sisältää muuttumattomat julkiset DH-parametrit eli alkuluvun p, (Z/pZ) generaattorin g sekä luvun g a [6, s. 49]. Asiakas tarkistaa sertifikaatin allekirjoituksen ja suorittaa oman osansa DH-algoritmista. Tässä on kuitenkin yksi ongelma: kaikki palvelimen käyttämät salaiset avaimet neuvotellaan samoilla julkisilla parametreilla. Jos salainen avain a vuotaa myöhem- 8
min julkisuuteen, jokainen kyseisellä avaimella salattu viesti on mahdollista purkaa. [6, s. 74] Ongelman voi ratkaista käyttämällä lyhytaikaisia parametreja eli Ephemeral Diffie-Hellman -protokollaa. DHE-protokollassa luodaan istuntokohtaiset julkiset parametrit, jotka allekirjoitetaan esimerkiksi RSA:lla tai DSS:llä (Digital Signature Standard). Nyt asiakas tarkastaa sekä DH-parametrit sisältävän viestin että kyseisen viestin allekirjoittamiseen käytetyn sertifikaatin allekirjoituksen. Jos molemmat täsmäävät, DH-protokolla jatkuu normaaliin tapaan.[6, s. 74] Molemmilla tavoilla päästään haluttuun lopputulokseen eli osapuolet ovat sopineet symmetriseen salaukseen käytettävän avaimen. Nykyään suositellaan käytettäväksi lyhytaikaista Diffie-Hellman avaintenvaihtoa elliptisen käyrän muodostamassa ryhmässä (ECDHE) vaihtuvan avaimen tarjoaman tulevaisuudenturvan eli Perfect Forward Secrecyn takia[7][8][9]. 4.2 RSA TLS:ssä RSA:ta käytetään TLS:ssä pääasiassa kahdella tapaa: suoraan avaimenvaihtoon tai edellä esitellyn Diffie-Hellman parametriviestin allekirjoittamiseen. Suorassa avaimenvaihdossa palvelu lähettää asiakkaalle oman RSA-sertifikaattinsa. Asiakas tarkistaa sen aitouden, luo satunnaisen salausavaimen, salaa sen palvelun julkisella avaimella ja lähettää avaimen palvelulle. Tästä avaimesta puolestaan johdetaan kaikki TLS-istunnossa tarvittavat salausparametrit.[6, s. 57] 5 Johtopäätös Julkisen avaimen salaus on yleisesti käytössä, ja käytetyt menetelmät perustuvat matemaattisiin ongelmiin, joille ei ole vielä löydetty tehokkaita ja yleispäteviä ratkaisuja. Raportissa esitellyt salausmenetelmät eivät ole ainoita toimivia menetelmiä, ja ne ovat vain esimerkkejä ensimmäisistä kryptografiaa mullistaneista julkisten avainten salauksista. Nykymaailmassa suuri osa tiedonvälityksestä tapahtuu internetin, puhelinyhteyksien ja vastaavien kautta, joten osapuolien välistä viestittämistä on helppo salakuunnella. Tästä syystä julkisen avaimen salaus on erittäinen tarpeellista ja keskeisessä asemassa yhteiskunnassa. Ongelmana kuitenkin on, että ei ole minkäänlaisia matemaattisia todisteita salausmenetelmien turvallisuudesta. Käytetyt menetelmät perustuvat hyvin pitkälti oletuksiin, että koko- 9
naislukujen tekijöihin jako ja diskreetin logaritmin ratkaiseminen on työlästä. Toisin sanoen jos esimerkiksi keksittäisiin tehokas algoritmi kokonaislukujen tekijöihin jakoon, tai rakennettaisiin suuremman mittakaavan kvanttitietokone, olisi kyseiset ongelmat ratkaistavissa polynomiajassa. Tämä saattaisi aiheuttaa suuria ongelmia nyky-yhteiskunnalle. 10
Lähteet [1] T.M. Damico. A Brief History of Cryptography. Student Pulse, 1(11), 2009. [2] S. Simpson. Cryptography Defined/Brief History, 1997. [3] W. Stuart. Public Key Cryptography (PKC) History. [4] W. Stein. Elementary Number Theory: Primes, Congruences, and Secrets: A Computational Approach. Undergraduate Texts in Mathematics. Springer, 2008. [5] A.J. Menezes, P.C. van Oorschot, and S.A. Vanstone. Handbook of Applied Cryptography. Discrete Mathematics and Its Applications. Taylor & Francis, 1996. [6] T. Dierks and E. Rescorla. The Transport Layer Security (TLS) Protocol Version 1.2. RFC 5246 (Proposed Standard), August 2008. Updated by RFCs 5746, 5878, 6176. [7] Cloudflare Inc. Cloudflare Recommended TLS Configuration. Saatavilla https://github.com/cloudflare/sslconfig/blob/master/conf. Viitattu 16. lokakuuta 2014. [8] M. Salter and R. Housley. Suite B Profile for Transport Layer Security (TLS). RFC 6460 (Informational), January 2012. [9] Mozilla Corporation Operations Security Team. Server Side TLS. Saatavilla https://wiki.mozilla.org/security/server_side_ TLS#Recommended_configurations. Viitattu 16. lokakuuta 2014. 11