Harjoitus: 1) Missä määrin symmetrisen avaimen kryptauksella voidaan toteuttaa allekirjoituksen vaatimuksia?
2) RSA:lla on ominaisuus (ns. kommutatiivisuus), että yksityisellä eksponentilla salatun viestin voi purkaa julkisella eksponentilla. Miten tämä soveltuu viestin allekirjoittamiseen?
Ratkaisuna voidaan todeta, että 1) symmetrisyys on ristiriidassa kiistämättömyyden kanssa (Schneier esittää (s. 39) epäkäytännöllisen ratkaisun joka käyttää kolmatta osapuolta), ja 2) RSA on keskeisesti allekirjoitusalgoritmi:
Alkuperäisen RSA-artikkelin nimi (vuodelta 1978) oli "A method for obtaining digital signatures and public key cryptosystems". RSA:ta käytetään allekirjoitukseen siis toisinpäin kuin salaukseen, joka tapahtuu julkisella avaimella ja purku salaisella avaimella. Allekirjoitus muodostetaan salaisella ja se todennetaan julkisella avaimella: Vain se, joka tuntee salaisen eksponentin d, voi tuottaa viestistä m potenssin s=md mod n. Kun m ja s lähetetään yhdessä, kuka tahansa joka tuntee vastaavan julkisen avaimen e, voi tarkistaa että m = se mod n. Jos siis d on osapuolen A salainen avain, niin A ei voi kiistää allekirjoittaneensa ja lähettäneensä viestiä m - paitsi väittämällä että hänen avaimensa on paljastunut ... (tässä yhteydessä tarvitaan avaintenhallintaa, aiheeseen palataan myöhemmin).
RSA:n eksponenttilasku on hidas operaatio, minkä vuoksi yleensä vain viestin tiivistelmä allekirjoitetaan: lähetys on siis m, (H(m))d mod n.
Harjoitus: Sovella RSA-allekirjoitusta Diffie-Hellman-avaimen vaihtoon. Oleta, että A ja B ovat kumpikin luoneet oman RSA-systeeminsä julkisilla parametreilla (eA, nA) ja (eB, nB). Vastaavat salaiset parametrin olkoot dA ja dB. Käytä DH-algoritmille aiemmin esitettyjä merkintöjä (n,g,x ja y).
Mahdollinen ratkaisu DH:n autentisointiin allekirjoituksilla: A:n viesti B:lle koostuu kolmesta osasta: nimet A ja B sekä luku (A,B,gx)dA mod nA. Osapuolen B viesti A:lle vastaava. (Lieneekö näissä jotain tarpeetonta?)
Viestien merkitys selviää, kun katsotaan, miten esim. B ratkaisee yhteisen avaimen gxy saamastaan viestistä. Hän toteaa väitetyn lähettäjän olevan A ja siis korottaa viestin kolmannen osan potenssiin eA modulo nA. Tuloksena on luku, jonka binääriesityksestä B voi lukea (ja tarkistaa) nimet A ja B ja niiden jälkeen on bittijono X (=gx mod n). Korottamalla X:n potenssiin y modulo n, B saa luvun gxy mod n, joka on sama kuin se, jonka A saa vastaavalla algoritmilla. Olisiko joku muu voinut lähettää B:lle kyseisen viestin?
Kuten sanottua, vain se joka tuntee dA:n on voinut alunperin tuottaa kyseisen viestin. Vastustaja C, joka on siepannut A:n lähettämän viestin joskus aiemmin, voi lähettää sen nyt uudestaan. Entäpä sitten: Jos C nyt sieppaa myös B:n viestin, mitä hän saa siitä irti? Ei mitään muuta kuin sen, että B:n tarkoitus on sopia avaimesta A:n kanssa. Tämä ei siis ole huolestuttavaa. Sen sijaan edelleen jää auki, onko B:n saaman viestin takana todella A kuten viesti väittää: Jospa C onkin sijoittanut oman julkisen avaimensa paikkaan josta B hakee A:n julkisen avaimen. Tällöin C voi näytellä A:ta allekirjoittamalla viestejä omalla salaisella avaimellaan. Autenttisuutta ei saavuteta, ellei julkisia avaimia hallinnoida jollain luotettavalla tavalla.
Jotta pääsisimme eteenpäin, meidän täytyy keksiä menetelmä, jolla julkiset avaimet voidaan sitoa omistajiinsa (ilmeisesti siis jonkinlainen allekirjoitus tässäkin). Lisäksi täytyy luoda mekanismi, jolla tällainen sidonta voidaan purkaa. Näitä tehtäviä kutsutaan avaintenhallinnaksi. Ennen kuin voidaan ajatella tiedon sitomista johonkuhun yksilöön, pitäisi oikeastaan pohtia yksilöinnin ongelmaa. Palataan tähän hetken kuluttua.
Otetaan nyt esille yksi monista tunnetuista DH-variaatioista, ns. Station-to-Station-protokolla. Siinä käytetään paitsi allekirjoituksia myös sopimisen kohteena olevaa symmetristä avainta heti kun se on mahdollista. A:n ensimmäinen viesti B:lle on kuten perus-DH:ssa (siis gx) ja samoin on B:n viesti A:lle alkuosaltaan (siis gy), mutta sen perään B liittää allekirjoituksen SB (gy, gx) salattuna avaimella k = (gx)y. Kolmannessa viestissä A lähettää B:lle vastaavan allekirjoituksen SA (gx,gy), salattuna k:lla.
Tässä SX on osapuolen X allekirjoitusfunktio. Kumpikin osapuoli soveltaa sitä peräkkäin asetettuihin (katenoituihin) lukuihin. Kunhan kummankin osapuolen julkinen avain (allekirjoituksen todentamiseen) on autenttinen, STS-protokollalla saavutetaan molemminpuolinen yksilöinti ja lisäksi eksplisiittinen avaimen aitous (ts. kumpikin osapuoli tietää että toisella on sama avain k).
Harjoitus: RSA-algoritmin syötteen M pitää olla modulia n pienempi luku. Käänteisoperaatio näet tuottaa luvun M-k*n, missä k on sellainen, että tämä luku on 0:n ja n:n välissä. Mitä ongelmia tämä aiheuttaa tilanteessa, jossa halutaan ensin allekirjoittaa viesti omalla RSA-avaimella ja sitten salata se vastaanottajan avaimella?
Kertakäyttöiset salasanat: esimerkkinä avainlukulistat pankkien puhelin- ja weppipalveluissa: palvelin kertoo monesko luku käyttäjän pitää kulloinkin tietää. Oleellinen ominaisuus on, että ulkopuolinen ei pysty ennustamaan seuraavaa lukua. Harjoitus: Listan sijasta voitaisiin käyttää yksisuuntaista funktiota f, jota käytetään "takaperoisesti". Oletetaan että käyttäjä on soveltanut f:ää n kertaa johonkin generoimaansa satunnaislukuun ja on ilmoittanut tuloksen palvelimelle jollain autentisoidulla tavalla. Miten hän voi tämän jälkeen osoittaa henkilöllisyytensä n kertaa? [DH-artikkeli, s 651; HAC, s 396; vrt. myös SKEY Schneier s. 53]
Harjoitus: Oletetaan, että titeläisillä olisi vaikkapa taskulaskimessaan salauskone, jolla he voisivat salata lyhyitä viestejä käyttäen esim. nykyistä unix-salasanaansa avaimena. Miten tämän avulla voitaisiin hoitaa sisäänkirjoittautuminen ilman, että (kerran saatua) salasanaa tarvitsee koskaan kirjoittaa päätteelle? Jos login-ohjelmaa muuttaa tämän verran, pitäisi toki tehdä lisämuutoksia: miten ylläpitäjältä saadun (tai muuten vanhentuneen) salasanan voisi vaihtaa uudeksi ilman, että tätä uuttakaan tarvitsee sellaisenaan kirjoittaa päätteelle? Edelleen: miten käyttäjä sisäänkirjoittautumisen jälkeen voisi varmistua siitä, että hän on siinä koneessa, jossa pitääkin? (Oletetaan, että käyttäjä ei olekaan titeläinen, jolla on hakemistonsa yms., vaan joku joka käyttää konetta vain surffailuun ja vaikkapa pankkitilinsä käsittelyyn.)
Mahdollinen ratkaisu edellyttää, että salasana on selväkielisenä myös isäntäkoneen hallussa!
Yleistys: edes isäntä ei tiedä salaisuutta, mutta voi silti
vakuuttua, että vieras tietää! Tällaista sanotaan nollatietotodistukseksi,
esimerkkinä katsotaan Feige-Fiat-Shamir-protokollaa [Schn:503-, HAC:408].
Merkitään:
Y = vieras joka pitää Yksilöidä
T = isäntä, joka haluaa Todentaa Y:n henkilöllisyyden
Esitetään protokolla ensin yksinkertaisessa muodossa ja sitten harjoituksena "moninkertaistetaan" eli tietyllä tavalla rinnakkaistetaan. Aivan aluksi esitellään protokollan idea olettaen vain jokin yksisuuntainen funktio f, jolle pätee ns. morfismiominaisuus f(x*y)=f(x)*f(y).
Protokollan tavoitteena on vakuuttaa T siitä, että Y tietää salaisen lukunsa s, jonka Y on valinnut ja laskenut siitä julkisen avaimensa v = f(s). Jotta T (eikä salakuuntelija) ei saisi tietää s:ää, Y ei koskaan lähetä hänelle itse s:ää vaan tulon u=r*s, missä r on satunnaisluku, josta Y on protokollan alussa kertonut T:lle arvon f(r). Jotta Y ei kuitenkaan voisi lähettää mitä tahansa, T pyytää Y:ltä satunnaisesti joko r:n tai s*r:n.
Harjoitus: Miten T tarkastaa nämä vastaukset ja mikä on todennäköisyys että Y, joka ei tunne s:ää, läpäisee tarkastuksen?
Vastaus: T käyttää vastaanottamaansa lukua u ja julkista avainta v. Tapaus "u=r": T laskee f:n arvolla r ja vertaa. Tapaus "u=s*r": T tarkistaa, onko f(u)= f(r)*v. Todennäköisyys on enintään 1/2. Ainoa, mitä Y voi tehdä, on yrittää ennakoida jompaakumpaa pyyntöä ensimmäisessä viestissään: miten Y voisi vastata "oikein", jos hän tietäisi että r*s:ää kysytään? Vastaus: Y valitsee jonkin z:n, lähettää aluksi arvon "f(r)" = f(z)/v ja vastaukseksi arvon "r*s" = z.
Yksisuuntainen funktio, jolla on tarvittava (morfismi-)ominaisuus on neliöinti modulo n, missä n=p*q ja osapuolet Y ja T eivät tunne (suuria alkuluku)tekijöitä p ja q. (Vrt. Rabin; Y saisi tuntea ne, jos n olisi Y:n oma.) Tarvitaan luotettu välittäjä, joka valitsee luvut p ja q ja julkaisee niiden tulon n. Osapuoli Y valitsee satunaisluvun s ja rekisteröi julkiseksi avaimekseen luvun v=s2 mod n.
Itse protokollassa toistetaan seuraava m kertaa, kunnes 1/2m on riittävän pieni vakuuttamaan T:n siitä että Y tietää s:n:
Harjoitus Jos samalla kerralla liikkuisikin yhden sijasta k bittiä tarvittaisiin vain m/k kierrosta. Seuraava olisi suora yleistys edellisestä:
Vastaus on, että vastaus on u = r*s1B1*...*skBk ja todennettava yhtälö on u2 = x*v1B1*...*vkBk.
[Jatkuu...]
Pääaihe ensi kerralla on (autentisointi)protokollien suunnitteluperiaatteet. Aihetta käsitellään seuraavan artikkelin pohjalta: M. Abadi, R.Needham: Prudent Engineering Practice for Cryptographic Protocols, IEEE Trans. on Software Eng., Vol 22, No 1, Jan 1996, 6-15. (alunperin vuodelta 1994)