Oppikerta 3, 26.1.1999
(Kryptoprimitiivit jatkuvat:)
Yksisuuntaiset funktiot
Tavanomaisen kryptauksen pitäisi avainta tuntemattomalle merkitä muunnosta, jota ei voi kääntää ilman suunnatonta vaivaa. Kryptologiassa käytetään myös sellaisia muunnoksia eli funktioita, joita on lähes mahdoton kääntää, vaikka funktio tunnettaisiin kokonaan. Tämä vastaa siis sitä (onnetonta tilannetta), että kryptotekstiä ei voi purkaa vaikka avain tunnettaisiin. Tilanne on hieman erilainen, jos funktio kuvaa useita lähtöarvoja samaksi arvoksi eli on epäinjektiivinen. Tätä käytetään tiivistefunktioissa (hash-funktioissa), joita käsitellään jäljempänä.

Yksisuuntaisella funktiolla tarkoitetaan yleensä sellaista injektiivistä funktiota f, jolle arvon x laskeminen arvosta f(x) on käytännössä mahdotonta. Arvon f(x) laskeminen x:stä ei saa olla vaikeaa. Esimerkkejä yksisuuntaisista funktioista:

Tiivistefunktio, hash
Tiivistefunktion tarkoitus on tuottaa viestistä kiinteän mittainen, lyhyt "tiivistelmä", joka edustaa koko viestiä sikäli, että on vaikea löytää mitään muuta viestiä, jolla olisi samanlainen tiiviste. Koska tiivisteen pituus on tyypillisesti 128 tai 160 bittiä ja viesti voi olla miten pitkä hyvänsä, on tietenkin olemassa runsaasti viestejä, joista tulee sama tiiviste, mutta oleellista on, ettei yhtään niistä pysty löytämään. Tiivisteestä (hash) käytetään myös nimityksiä 'digital fingerprint' tai 'message digest' (MD).

Tiivistefunktiolta H edellytetään siis yksisuuntaisuutta: kun on annettu h, ei voida löytää x:ää jolle olisi H(x)=h. (Toinen nimitys: 'preimage resistance'; x on h:n 'preimage' eli "alkukuva"). Usein vaaditaan enemmän: vaikka etukäteen ei olisi annettu tiivistettä h ei saisi löytyä viestejä jotka "törmäävät" eli tiivistyvät samaksi h:ksi: Harjoitus: Toinen seuraavista ominaisuuksista on ns. heikko törmäyksen vastustuskyky, 'weak collision resistance', toinen puolestaan vahva. Kumpi on kumpi?

Tiivistealgoritmi voidaan varustaa myös avaimella, ts. tulos lasketaan viestistä ja (salaisesta) avaimesta pelkän viestin sijasta. Tällaisista käytetään termiä Message Authentication Code, MAC, koska niitä käytettäessä tavoitteena on osoittaa viestin eheyden lisäksi sen aitous. Törmäysten välttäminen ei näissä ole vastaavalla tavalla tärkeätä kuin avaimettomissa algoritmeissa (joita kutsutaan käyttönsä mukaan usein nimellä Manipulation Detection Code, MDC.). Sen sijaan MAC:ltä edellytetään sitä, ettei avainta k tuntematon voi laskea mitään paria (x, H(k,x)), vaikka tuntisikin useita pareja (y, H(k,y)).

Tiivistefunktiolta vaaditaan jossain määrin samantapaisia asioita kuin salausalgoritmilta: Jokainen viestin bitti vaikuttaa ja pieni muutos viestissä tuottaa suuren muutoksen tuloksessa. Niinpä joitakin salausalgoritmeja käytetään tiivistealgoritmien osina. Yksinkertaisimmillaan voisi tiivisteeksi ottaa CBC- tai CFB-moodissa käytetyn blokkikryptoalgoritmin viimeisen blokin. Kyseessä olisi MDC, jos avain on kaikkien tuntema, MAC jos se on salainen. Edellinen ei kuitenkaan ole järkevä. Jälkimmäistä, siis MAC:tä, käytetään, joskin yleensä erilaisin lisäyksin ja muunnoksin (moodina CBC). Mikäli salausalgoritmeja halutaan käyttää MDC:n luomiseen, se tehdään yleensä seuraavan yleisen rakenteen puitteissa.

Yleinen yksisuuntaisen tiivistämisen periaate: käytetään "kutistusfunktiota" (compression function), jolle syötetään iteratiivisesti aiempi kutistustulos ja seuraava blokki viestistä. Alussa tarvitaan alustusvektori ja viestin täydennys blokin monikerran mittaiseksi (täydennystä voidaan tehdä myös blokkikohtaisesti). Useimmiten viestin loppuun liitetään sen pituus. Kutistusvaiheen jälkeen voidaan tehdä vielä jokin toisenlainen muunnos.

Tunnetuimmat tiivistealgoritmit kuuluvat MD4-perheeseen, jonka kehitystä (joka tapahtui 1990-luvun alkupuoliskolla) kuvaa seuraava kaavio:

MD4  --> MD5 ----->   SHA --> SHA-1
 | \___________
 |             \
ext-MD4	---->  RIPEMD   ------->    RIPEMD-160
Epäsymmetrinen kryptosysteemi
Uusi idea (70-luvulta): viesti "lukkoon" avaimella eikä se aukea samalla avaimella vaan jollain toisella. Lukitusavaimia (ja lukkoja) voi olla vapaasti saatavilla, aukaisuavain on vain lukon suunnittelijalla.

Lyhyesti sanottuna epäsymmetrinen kryptosysteemi on sellainen, jossa salausalgoritmi on yksisuuntainen funktio, vaikka avain tunnettaisiinkin ja silti on jokin yksinkertainen keino purkaa salateksti.

Salausavain voi siis olla kaikkien saatavilla eli se on julkinen avain. Purkamiseen tarvitaan tietenkin jokin salausavaimesta riippuva tieto, ns. salainen avain. Se, että nämä ovat erilaiset, antaa nimen epäsymmetrinen. Joissain tapauksissa algoritmikin on hyvin erilainen eri suuntiin.

Tunnetuimmassa julkisen avaimen systeemissä RSA:ssa algoritmi on symmetrinen ja vain avain on erilainen eri suuntiin. Jos lukupari (k,n) on asiaan kuuluva avain, niin x:n salaus/purku tapahtuu RSA:ssa laskemalla potenssi fk(x) = xk mod n. Vaikka moduli n on siis osa sekä julkista että salaista avainta, usein pelkkää eksponenttia k sanotaan avaimeksi. Systeemin laatija on laskenut n:n kahden valitsemansa ja salassa pitämänsä suuren alkuluvun p ja q tulona: n=p*q. Salainen eksponentti d ja julkinen eksponentti e (kuten niitä yleensä merkitään) suhtautuvat toisiinsa kaavan d*e=1 modulo (p-1)*(q-1) mukaisesti, josta laatija on alunperin laskenut d:n valittuaan ensin e:n.

Oleellista RSA:n turvallisuuden kannalta on siis, että luvuista e ja n ei voi käytännössä laskea salaista eksponenttia d. Periaatteessa tämä kävisi jakamalla n ensin tekijöihin p ja q ja ratkaisemalla sitten d kuten laatijakin on tehnyt (riittäisi tietenkin tuntea tulo (p-1)*(q-1)).

Sitä että laatija tietää n:n tekijät, sanotaan salaluukuksi (trapdoor). Kaikissa julkisen avaimen systeemeissä on jokin vastaava rakenne. Julkisella avaimella salatun viestin murtajalla on edessään jokin vaikealta näyttävä ongelma, joka ei ole lainkaan hankala, jos vain tuntee salaluukun.

Muitakin julkisen avaimen kryptosysteemejä on. Mainitaan tässä esimerkin vuoksi yksi, Rabinin systeemi (vuodelta 1979):

Tämän systeemin murtaminen on yhtäpitävää luvun n tekijöihinjakamisen kanssa, seikka jota ei ole voitu todistaa RSA:sta.

Joihinkin erityistarkoituksiin kehitettyjä järjestelmiä tulee esille myöhemmin. Niillä voi suorittaa avainten vaihdon, allekirjoituksen tai tunnistuksen, mutta niitä ei voi käyttää viestin salaamiseen. RSA soveltuu useimpiin tarkoituksiin.


Perusprotokollat

Kryptoprimitiivit ovat palikoita, joita yhdistelemällä rakennetaan kryptoprotokollia. On silti protokollia, joista ei voi eritellä primitiivejä kovin yksiselitteisesti. Vastaavalla tavalla on hyödyllinen mutta ei kaiken kattava tapa ajatella, että on joukko keskeisiä perusprotokollia, joita yhdistelemällä syntyvät tietoturvalliset tietoliikennejärjestelmät. Perusprotokollina tässä mielessä voitaisiin pitää salausta, autentisointia (joka ilmenee eri muodoissa), allekirjoitusta ja avaimenvaihtoa. Jotta näitä toimia voitaisiin suorittaa, tarvitaan yleensä myös avaintenhallintaa, joka on siis myös perustava protokolla, vaikka rakenteeltaan ei ole kovin atomaarinen: laajimmassa mitassaan avaintenhallinta muodostaa julkisen avaimen infrastruktuurin.

Tutustutaan perusprotokolliin kahdessa vaiheessa. Ensinnä tehdään salausalgoritmeista alkava aasinsiltojen kautta "johdateltu" ekskursio, joka päättyy (ensi kerralla) avaintenhallintaan. Sitä käsitellään melko kattavasti ja se toimiikin lähtökohtana toiselle vaiheelle, jossa tutkitaan mm., miten primitiiveistä voidaan panna kokoon protokollia erityisesti autentisointiin ja avainten hallintaan.

Tässä vaiheessa asetetaan tehtäväksi luoda järjestelmä, jolla kaksi osapuolta Aino ja Bertil voivat lähettää toisilleen viestejä siten, että kumpikin voi luottaa niiden yksityisyyteen ja aitouteen. Osapuolet Aino ja Bertil eli A ja B eivät välttämättä ole ihmisiä, vaan toinen, tai molemmat, voi olla esim. palvelin, sovellusohjelma, IP-tason salausmekanismi, käyttöjärjestelmän luotettu komponentti, tai toimikortti. Ilmeisin keino tavoitteeseen pääsemiseksi on viestin salaaminen.

Salaus

Periaate on yksinkertainen: A ja B ovat sopineet symmetrisestä kryptosysteemistä ja avaimesta ja lähettävät toisilleen kryptattuja viestejä. Kukaan muu ei saa näitä auki, joten saavutetaan luottamuksellisuus. Mikäli viestien sisällössä on redundanssia, kumpikin osapuoli tietää, että vain toinen on voinut kryptata ja lähettää ne. Saavutetaan siis autenttisuus ja samalla eheys. Satunnaissisältöisestä viestistä vastaavaa ei voi päätellä.

Mielenkiintoisemmaksi tässä yhteydessä salaus tulee, kun tutkitaan minkä tason olioita A ja B voivat olla tietoliikennejärjestelmässä.

  1. Periaatteessa (ainakin) toinen osapuolista voisi olla ihminen, joka kirjoittaa avaimen ja viestin tietoliikennekanavasta irrallaan olevaan (akkukäyttöiseen) salauslaitteeseen, joka kryptaa sen. Sitten hän kirjoittaa salatekstin kanavaan.
  2. Sovellusohjelma, esim. tekstinkäsittelyohjelma tai sähköpostieditori suorittaa salauksen. Yhtä hyvin jokin erillinen suodinohjelma voi tehdä tämän. Tuloksena on päästä-päähän-salaus.
  3. Tieto menee salaamatta ensimmäiseen tietoliikenteen solmukohtaan (jonka oletetaan olevan niin lähellä että siihen voidaan luottaa, esim. oman koneen tietoliikenneohjelmisto). Tästä eteenpäin jokainen reitin varrella oleva (tietyn tasoinen) solmu salaa viestin (tai sen erillään liikkuvan osan) ja seuraava solmu purkaa salauksen ja salaa uudestaan eteenpäin. Jokaisella toisiinsa kytketyllä solmuparilla on siis yhteinen salainen avain. Kunkin solmun sisällä tieto on paljaana.
Harjoitus: Mitkä ovat (siis) päästä-päähän-tyyppisen ja linkittäisen salauksen edut ja haitat? Millä OSI-tasolla linkkisalaus tapahtuu ja missä laitteissa? Olisiko välimuotoja sovellustasolla tehtävän päästä-päähän-salauksen ja linkkisalauksen välillä? Voitaisiinko kaikki tietystä työasemasta lähtevä liikenne salata? [Stal:139]

Avainten vaihto

Jotta kommunikoivilla osapuolilla voisi olla yhteinen salainen avain, tarvitaan menetelmä avainten vaihtamiseksi (merkityksessä 'exchange'). Jos kyseessä on linkittäinen salaus, on kuviteltavissa, että jokaisen linkin molempiin päätelaitteisiin voidaan fyysisesti (ja siis turvallisesti) asentaa ja päivittää yhteinen avain esim. laitteisto- tai ohjelmistoasennusten ja päivitysten yhteydessä.

Jos kommunikointi tapahtuu ylemmällä tasolla, fyysinen avaintenvaihto ei yleensä ole käytännöllistä. Julkisen avaimen kryptosysteemi tarjoaa seuraavan mahdollisuuden: A luo julkisen avaimen ja lähettää sen ja oman nimensä B:lle, joka luo symmetrisen avaimen K ja lähettää sen A:lle kryptattuna A:n julkisella avaimella. A saa K:n selville salaisella avaimellaan.
Tämä olisi kelpo avaintenvaihtoprotokolla, kunhan vastustajat eivät pystyisi muuhun kuin salakuunteluun. Harjoitus: Oletetaan, että C pystyy pysäyttämään viestit ja lähettämään omiansa toisten nimissä. Näytä miten C voi välittää ("releoida") A:n ja B:n välisen avaimenvaihdon siten, että saa selville K:n eikä A:lla ja B:llä ole tästä aavistustakaan. (Man-in-the-middle attack)

Harjoitus: Mitä kritiikin aihetta on seuraavassa avaintenvaihtoprotokollassa?

Kumpikin osapuolista A ja B generoi ensin kaksi riittävän pitkää satunnaista bittijonoa. Olkoot A:n jonot KA ja RA ja B:n jonot vastaavasti. Kumpikin osapuoli tekee sitten symmetrisesti operaatiot, jotka seuraavassa on kuvattu A:n näkökulmasta: A lähettää B:lle bittijonon SA = KA XOR RA ja saa tältä vastauksena jonon TA = SA XOR KB. Tämän jälkeen A muodostaa yhteisen avaimen KAB ottamalla ne bitit jonosta KA, joiden kohdalla jonossa RA XOR TA on nolla.
Vastaus: Kumpikin osapuoli tosiaan saa selville saman avaimen KAB, mutta samoin saa kuka tahansa, joka on kuullut kaikki neljä viestiä: esim. SA XOR TA = KB jne. Kolmesta viestistä ei sen sijaan ole apua. Tämän epäonnisen protokollan perusideana on ottaa selville ja käyttöön ne bitit jotka ovat yhteisiä jonoissa KA ja KB. Tätä muistuttaa etäisesti yksi yhteisen informaation pohjalta lähtevä avaimen muodostamistapa, joka on todistettavasti turvallinen! Siinä yhteistä informaatiota (joka on lähtöisin esim. satelliitista) ensin "tislataan" iteratiivisesti pariteettibittien vertailulla, sitten pariteetteja ja binäärihakua käytetään virheiden (eroavuuksien) korjaamiseen. Lopuksi yksityisyyttä vahvistetaan tiivistefunktiolla siten että salakuuntelijalle ei lopulta jää kuin bitin murto-osan verran informaatiota salaisen avaimen selvittämiseksi. Tästä löytyy havainnollinen demonstraatio.

Kuuluisin avaintenvaihtoprotokolla on nimeltään Diffie-Hellman. Se on myös kaikkien aikojen ensimmäinen julkisen avaimen algoritmi (vuodelta 1976). Julkisena avaimena siinä on moduli p (suuri alkuluku), ja kantaluku g, joka on primitiivinen juuri modulo p (eli sellainen että gx käy läpi kaikki luvut 1,...,p-1, kun x käy 0,...,p-2). Luvut p ja g ovat siis julkisia eivätkä välttämättä mihinkään osapuoleen sidottuja. Oleellista on, että p ei ole mitään erityistä muotoa, jonka suhteen diskreetti logaritmi olisi tavallista helpompi.

Kun osapuolet A ja B haluavat generoida yhteisen avaimen kumpikin valitsee satunnaisen luvun; olkoon A:n luku x ja B:n luku y. Sitten A lähettää B:lle luvun gx mod p ja B lähettää A:lle luvun gy mod p. Yhteisenä avaimena A:lla ja B:llä on nyt luku (gy)x mod p = (gx)y mod p. Jotta joku muu saisi selville saman luvun, hänen pitäisi siis luvuista gx ja gy laskea luku gxy. Tätä varten hyökkääjäkin tarvitsisi jomman kumman luvuista x ja y, eli hän joutuisi laskemaan diskreetin logaritmin modulo p luvusta gx tai gy.

Harjoitus: Luonnostele protokolla jossa A, B ja C sopivat keskenään DH-tyyppisesti avaimesta, joka on muotoa gxyz mod p.

Harjoitus: Oletetaan, että DH-lähtötilanteen eli julkisen lukuparin (g,p) valinnan jälkeen ei ruvetakaan heti vaihtamaan avaimia tai lähettämään viestejä. Sen sijaan kukin osapuoli vain julkaisee oman lukunsa eli g potenssiin salainen satunnaisluku (mod p). Jos esimerkiksi A:n salainen luku oli x kuten edellä niin A:lla on nyt ikäänkuin julkinen avain (g,p,X), missä X = gx mod p. Miten viesti M voidaan salata tällä avaimella ja lähettää A:lle - siis suoraan ilman avaintenvaihtoa? Tehdään kuitenkin kuten DH-avaimenvaihdossa: luodaan satunnaisluku k, joka toimii kuin B:n eksponentti y ja lähetetään salatekstin alkuosana gk mod p. Jälkiosan pitäisi sitten riippua jotenkin viestistä M (ja varmaan X:stäkin) ja sen pitäisi aueta DH-tyyppisesti tietoon gxk = (gk)x mod p pohjautuen (A:han tietää oman salaisen x:nsä). Millainen jälkiosa kelpaisi?

Ratkaisu on XkM mod p ja tuloksena on ElGamalin julkisen avaimen systeemi (vuodelta 1984). Se tulee esille myöhemminkin allekirjoituksen yhteydessä. Oletuksena on, että salatekstiä satunnaistavalla luvulla k ei ole yhteisiä tekijöitä (p-1):n kanssa. Viestin M purkaminen salatekstistä eli lukuparista (a=gk mod p,b=XkM mod p) tapahtuu näin: M = b/ax.

Perusmuodossaan DH-protokollan ongelma on siinä, etteivät A ja B oikeastaan tiedä, kenen kanssa he avaimia vaihtavat. Menettelyltä puuttuu siis autenttisuus (eikä ElGamalkaan sellaisenaan auta tässä). Yhtenä ratkaisuna voitaisiin ajatella allekirjoittaa viestit. Tarkastellaan tätä seuraavalla kerralla yhtenä allekirjoituksen sovelluksena. Myöhemmin otetaan esille muita avaimenvaihtoon sopivia menetelmiä, mm. sellaisia, joissa käytetään kolmatta osapuolta.


Luettavaksi: L. Bruno: Certificate Authorities: Who Do You Trust? (Data Communications International, March 21, 1998, 54-63)

Artikkeli on varsin kevyt, joten aikaa pitäisi jäädä seuraavaan kotitehtävään: Etsi esim. www:stä jokin raportti kryptosysteemin murtamisesta, eli siitä että joku on saanut selville selvätekstin, salausavaimen, ennakoinut satunnaislukuja tai löytänyt törmäyksen tiivistefunktiosta. Kuinka työlästä murtaminen oli? Millaisessa yhteydessä tämä tapahtui (soveltuuko esim. luokittelu chosen cryptotext tms.? Oliko menetelmä yleinen eli voidaanko sitä sellaisenaan soveltaa uusiin yhteyksiin? Tehtävää ei mainittu tunnilla, joten sen tarkastaminen tapahtuu sitä mukaa kun ratkaisuja ilmenee.