(Symmetrinen) salakirjoitusMotivointia
Sisältöä ja tavoitetta
Yhteyksiä
|
Lähettäjä ja vastaanottaja voidaan tulkita myös samaksi henkilöksi, joka vain tallettaa viestinsä eli jonkin tiedon myöhempää käyttöä varten niin että muut eivät saa siitä selvää. Henkilöiden tai heidän suoraan käyttämiensä koneiden sijasta osapuolet voivat olla vaikkapa tietoverkossa sijaitsevia reitittimiä.
Yleinen mekaanisiin lukkoihinkin pätevä periaate on, että algoritmia ei voi olettaa salaiseksi, ainoastaan avain on salainen. Koska avain on lukittaessa ja avattaessa sama, järjestelmää sanotaan symmetriseksi.
Esimerkki 1. Viesti eli selväteksti (tai ilmiteksti, 'plaintext') p = jono bittejä (keksitään luennolla), avain k = 0110101.... (kuulijoiden valitsema jatko), kryptoteksti c lasketaan biteittäin XOR-summana: c = p XOR k = .... . Operaatiota XOR (eli eXclusive OR, 'poissulkeva tai') merkitään yleensä rengastetulla plussalla, mutta kirjoitetaan tässä pelkkä +. Tällöin 0+0 = 1+1 = 0 ja 0+1 = 1+0 = 1. Soveltamalla tätä bittijonojen c, k ja p vastinbitteihin saadaan kryptotekstistä c helposti takaisin selväteksti p:
c+k = (p+k)+ k = p + (k + k) = p + 0-jono = p.Tämä (ja muunnelmat) on ainoa täysin turvallinen salausalgoritmi, "one-time pad" eli kerta-avainjärjestelmä. Siinä avain on siis satunnainen, sen pituus on sama kuin viestin ja kryptoteksti = viesti XOR avain. Oleellista on että kukin avainbitti tulee käyttöön vain kerran.
Esimerkki 2. Pitkää avainta on hankala käsitellä. Samaa lyhyttä avainta, esim. k1 = 0110101 voisi tietysti toistaa, jolloin k olisi 0110101 0110101 0110101 0110101 ... . Jos viestin ajatellaan koostuvan samanmittaisista lohkoista p = p1p2p3..., muodostuu kryptotekstistä c=c1c2c3... sellainen, että c1 XOR c2 = p1 XOR p2 jne. Avaimen vaikutus eliminoituu siis täysin pareittain XOR-summatuista kryptolohkoista. Kryptoanalyytikolta ei kulu kauaakaan selvittää selvätekstiä p tilastollisilla analyyseilla, sillä varsinkin luonnollisen kielisissä viesteissä on runsaasti redundanssia - eli sitä samaa "ylimäärätietoa", jonka ansiosta luennoitsijan taululle kirjoittamasta tekstistä saa yleensä selvää, vaikka mistään yksittäin nähdystä kirjaimesta ei ehkä saisikaan, jos muut on pyyhitty pois sen ympäriltä.
Esimerkki 3. Jotain muuntelua voisi järjestää avaimelle k1 = 0110101, jotta äskeiseltä ongelmalta vältyttäisiin. Muodostetaanpa "pseudoavain" k = k1k2k3... seuraavasti: ki+1 = luvun a * ki seitsemän alinta bittiä, missä a on jokin k1:stä riippuva luku, vaikkapa a = k1. Saadaan k = 53, (2809 ==>) 121, (6413 ==>) 13, (699 ==>) 49, ... eli binäärijonona k = 0110101 1111001 0001101 0110001 ... . Seitsemän alimman bitin ottamisen voisi ilmaista hienommin jakojäännöksenä modulo 128 (=27). Vastaava menettelyä käytetään näennäissatunnaislukujen muodostamisessa, joskaan jakajana ei silloin ole kakkosen potenssi. Modulaarinen aritmetiikka tavataan kurssin aikana vielä useaan kertaan.
Äskeinen avainta "venyttävä" salausperiaate on esimerkki vuokryptauksesta (stream cipher). Käytännössä venytysperiaatteen pitää olla mutkikkaampi (avainvuo, "key stream" vaikeammin arvattavissa) ja lähtökohtana olevan avaimen tietenkin paljon pitempi (esim 128 bittiä). Aiheeseen palataan toisaalla.
Symmetrinen salaus hyvällä algoritmilla antaa yksinkertaisella tavalla
tehokkaan suojan sekä tiedon luottamuksellisuudelle että eheydelle. Paljon
konstikkaampaa onkin sitten se, mitä pitää tehdä ennen kuin symmetristä
salausta voidaan käyttää. On nimittäin sovittava yhteisestä avaimesta ja
sitähän ei voida tehdä ainakaan symmetrisen salauksen avulla. (No, hyvä on,
jos käytössä on entinen symmetrinen avain, niin mistä se sitten saatiin, tai
sen edeltäjä jne ... ja jos tällaisessa tapauksessa jokin aiempi paljastuu
niin, miten on turvallisuuden laita?). Yksi perusmenetelmä, jolla salausavaimesta
voidaan sopia turvattoman kanavan ylitse, luonnostellaan
toisaalla ja yksi käyttökohde tulee esille
IPSec:n yhteydessä.
Murtaminen ja algoritmien turvallisuus
Hyökkäystä kryptoalgoritmia vastaan sanotaan kryptoanalyysiksi tai murtamiseksi.
Algoritmien turvallisuus eli "murtolujuus" on asia, johon ei maallikon eikä edes
tietoturvainsinöörin tarvitse puuttua kovin syvälle. Syynä on yksinkertaisesti se,
että asiaan perehtynyt tutkijakaan ei voi yksinään saada yleensä muuta
konkreettista tulosta kuin jonkin systeemin murtamisen. Kryptosysteemin
osoittautuminen murtovarmaksi edellyttää pitkäjänteistä tieteellistä tutkimusta,
jossa useat tutkijat eri tahoilla koettelevat algoritmia, ja mahdollisesti
kehittelevät sitä parametrien valinnan suhteen. Silloinkin algoritmi tosiaan vain
osoittautuu kestäväksi eli tyypillisesti siinä on sellaisia rakenteita ja
ominaisuuksia, jotka oleellisesti vaikeuttavat kaikkia tunnettuja
analyysimenetelmiä. Varsinaista todistusta turvallisuudesta ei voi antaa, ellei
kaikkia mahdollisia hyökkäyksiä pystytä mallintamaan.
Esimerkiksi DES-algoritmia voidaan jo pitää heikkona, koska sen avain on vain 56-bittinen, ja kaikki vaihtoehdot läpikäyvä ns. raa'an voiman hyökkäys (brute force attack) on nykymahdollisuuksien rajoissa. Algoritmia sinänsä voi pitää onnistuneena, koska sitä on tutkittu "menestyksettä" erittäin laajasti alusta, eli 70-luvun puolivälistä asti.
Edellä sanotusta huolimatta ja toisaalta juuri sen vuoksi kryptoalgoritmin käyttäjän on syytä tuntea hyvin käsitteistö sekä algoritmien ja hyökkäysten perusluonne, jotta hän voi suhteuttaa käytäntöön algoritmien turvallisuutta koskevat tutkimustulokset - samoinkuin markkinahenkilöiden vakuuttelut tarjolla olevien menetelmien koetellusta turvallisuudesta.
Joka tapauksessa käytännön algoritmeissa, kerta-avaimen käyttöä lukuunottamatta, turvaudutaan laskennalliseen turvallisuuteen, mikä tarkoittaa sitä, että järjestelmän murtaminen tehdään hyvin työlääksi, mutta ei kuitenkaan mahdottomaksi.
Yksi tärkeä luokitus on sen mukaan, millaisin oletuksin algoritmit tarjoavat laskennallista turvallisuutta, eli kuinka voimakkaan vastustajan ne kestävät. Lähtökohtana on, että vastustaja tuntee algoritmin ja hänellä on salatekstiä, jonka hän haluaisi purkaa. Vastustajan voimakkuutta kuvaa se, mitä muuta hän tietää:
Yksisuuntaista kryptografiaaMotivointia
Sisältöä ja tavoitetta
HavainnollistustaErillisellä sivulla voit laskea syöttämäsi tekstin MD5-tiivisteen. Kokeile, miten paljon tuo 32 heksadesimaalinumerona annettava tiiviste muuttuu kun muutat ascii-tekstissä yhden bitin jossain kohdassa. Yhden bitin ero on esim. kirjainpareilla B-C, D-E, ..., X-Y (ja samoin pienillä), joista ensimmäisen koodi on parillinen ja seuraavan pariton eli koodissa muuttuu viimeinen bitti.
|
Tutuin esimerkki tarkistussummasta on henkilötunnuksen viimeinen merkki, joka on laskettu muista merkeistä. Vastaava merkitys on pankkisiirron viitenumeron viimeisellä numeromerkillä. Tällaisten tarkistussummien tarkoituksena on näppäily- ym. virheiden havaitseminen (vrt. myös eheys tietokannoissa)
Yksinumeroinen tarkistussumma voitaisiin periaatteessa laskea vaikkapa summaamalla kaikki numeromerkit ja ottamalla tulokseksi summan viimeinen numero. Näin lasketaan esim. pariteettibitti. Yleensä tarkistussumman algoritmi on monimutkaisempi, eikä kyse enää ole pelkästä summaamisesta. Esimerkiksi CRC:n (eli Cyclic Redundancy Check-menetelmän) ideana on lisätä bittilohkon perään tietty määrä (16 tai 32) bittejä siten, että tulos on jaollinen annetulla kiinteällä luvulla. Jos vastaanottaja ei saa jakoa tasan, lohkossa tai tarkistussummassa (eli FCS:ssä, Frame Check -Sekvenssissä) on tapahtunut muutos. Tätä menetelmää ei mutta lukuisia muita löytyy T. Vuoren laatimasta dokumentista Tarkistusmerkkien laskentamekanismeja, josta ilmenee myös miten moninaisissa yhteyksissä tarkistuksia käytetään.
Seuraavaksi esiteltävä yksisuuntainen tiivistäminen lisää tarkistusominaisuuteen kryptografista kätkemistä, joka on tarpeen, jottei esim. virus voisi viilata saastuttamaansa tiedostoa sellaiseksi, että se tuottaisi saman tarkistussumman kuin alkuperäinenkin.
Yksisuuntaisen tiivistefunktion eli hash-funktion (oikeastaan one-way hash function) tarkoitus on tuottaa viestistä (yleisemmin bittijonosta) 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 edellytetty yksisuuntaisuus merkitsee siis sitä, että kun on annettu h, ei voida millään kohtuullisella vaivalla löytää x:ää, jolle olisi H(x)=h. Usein vaaditaan enemmän: ei saisi löytyä yhtään paria viestejä jotka "törmäävät" eli tiivistyvät samaksi h:ksi - joko niin, että vaatimus koskee mitä tahansa h:ta tai niin, että mitään annettua x:ää kohti ei saa löytyä (eri) y:tä, joka toteuttaisi ehdon H(x)=H(y).
Yleinen yksisuuntaisen tiivistämisen periaate: käytetään "kutistusfunktiota" (compression function (!)), jolle syötetään iteratiivisesti aiempi kutistustulos ja seuraava viestilohko (kumpikin esim. 128 bittiä). Alussa tarvitaan alustusvektori (siis "nollas" kutistustulos) ja viestin täydennys lohkon monikerran mittaiseksi (täydennystä voidaan tehdä myös lohkokohtaisesti). Useimmiten viestin loppuun liitetään sen pituus. Kutistusvaiheen jälkeen voidaan tehdä vielä jokin toisenlainen muunnos.
Tunnetuimmat (yksisuuntaiset) tiivistealgoritmit kuuluvat MD4-perheeseen, jonka kehitystä (joka tapahtui 1990-luvun alkupuoliskolla) kuvaa seuraava kaavio:
MD4 --> MD5 -----> SHA --> SHA-1 | \___________ | \ ext-MD4 ----> RIPEMD -------> RIPEMD-160(Erikoinen kryptosysteemi, joka nopeuttaa tarkistussumman laskentaa: Incremental cryptography with application to virus protection.)
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ä sen sijaan ei saa olla vaikeaa. Seuraavassa on esimerkkejä yksisuuntaisista funktioista. Kaikille niistä on ominaista, että parametreina olevat luvut ovat suuria, useamman sadan desimaalinumeron pituisia.
Lohkosalaus eli blokkikryptaus moodeineenMotivointia
Sisältöä ja tavoitetta
|
Edellä mainitut kaksi periaatetta tulevat selvimmin esille lohkosalauksessa, jossa algoritmia sovelletaan yhteen viestilohkoon eli kiinteään määrään viestibittejä kerrallaan. Kyseessä on siis funktio, jolla on parametrina avain ja joka muuntaa jokaisen n-bittisen vektorin joksikin toiseksi samanmittaiseksi. Pidentäminen olisi tilan haaskausta ja lyhentävää funktiota taas ei voisi kääntää. Kompressio ennen kryptausta on sitten eri juttu (ja varsin suositeltava, koska se vähentää selvätekstin redundanssia). Tyypillinen n eli lohkon koko on 64 tai 128.
Oheisessa kuvassa sovelletaan yksinkertaista lohkoalgoritmia viiden tavun mittaiseen selkotekstiin. Avaimena tässä on (tai sellaiseksi voidaan tulkita) lukunelikko (25413, 1, 3, 2). Ensimmäinen ilmaisee permutaation (yhden 125 mahdollisesta), kaksi seuraavaa siirtojen pituudet ja neljäs kierrosten lukumäärän.
Lohkoalgoritmilla salattaessa ajetaan siis aina yksi tekstilohko kerrallaan koko algoritmin läpi. Algoritmin käyttötavasta (moodista) riippuen tekstinä voi tosin olla muutakin kuin pelkkää selvätekstiä tai ei lainkaan sitä ja kryptotekstiä voi kerralla muodostua vähemmän kuin lohkon verran (moodeista on kerrottu erikseen).
Useimmat algoritmit pohjautuvat Feistel-periaatteeseen: On jokin kiinteä funktio f, jota sovelletaan avaimeen (tai siitä laskettuun lukuun) ja viestin loppupuolikkaaseen. Tulos XOR-summataan viestin alkupuolikkaan kanssa. Seuraavaa kierrosta varten puolikkaat vaihdetaan, eli loppuun tulee äskeinen summa ja alkuun äskeinen loppupuolikas sellaisenaan. Kierroksia tehdään tietty määrä. Joka kierroksella käytetään avaimesta eri tavalla muodostettua osa-avainta. Salauksen purku ei edellytä funktion f kääntämistä vaan XOR-operaation ominaisuuden ansiosta riittää toistaa samat kierrokset, kunhan osa-avainten muodostama jono käydään lopusta alkuun.
Valitsemalla erilaisia funktioita f, ja erilaisia osa-avainjonoja (eli avainsekvenssejä), saadaan erilaisia algoritmeja. On myös useita läheisiä muunnoksia Feistel-periaatteesta.
DES on vuonna 1977 standardoitu algoritmi, joka muodostuu 16 Feistel-kierroksesta. Avain on 56-bittinen. Joka 8:nneksi lisätään pariteettibitti, joten avain näyttää 64-bittiseltä. Lohkon koko on 64. Yksi tapa parantaa DES:n turvallisuutta on käyttää sitä kolminkerroin kahdella avaimella k1 ja k2. Merkitään: Ei = kryptaus ja Di = dekryptaus avaimella ki. Viestin M triple-DES-kryptaus on E1( D2 ( E1( M))). (Kolmeakin eri avainta voi tietysti käyttää, kuten PGP:ssä tehdäänkin, mutta em. tekniikka on standardoitu.)
DES oli alunperin IBM:n ehdotus standardiksi vuodelta 1974. DES:n seuraajaksi
tarkoitetun AES:n (Advanced Encryption Standard) luominen alkoi vuoden 1997
alussa. Virallinen kutsu ehdotuksille oli syyskuussa 1997. Elokuussa 1998
ensimmäisen AES-konferenssin yhteydessä NIST (National Institute of Standards
and Technology) julisti 15 virallista ehdokasta julkisesti tutkittaviksi. Toinen
konferenssi pidettiin maaliskuussa 1999. Ensimmäisen kierroksen julkinen
kommentointiaika päättyi huhtikuussa 1999. Elokuussa 1999 julkistettiin
loppukilpailuun hyväksytyt algoritmit, jotka ovat nimeltään MARS, RC6, Rijndael,
Serpent ja Twofish. Lokakuussa 2000 standardoitavaksi valittiin Rijndael ja
joulukuussa 2001 standardi oli valmis. [NIST:n AES-sivusto]
Lohkoalgoritmien (käytön) moodit
Jos lohkosalausalgoritmia käytetään kryptaamaan jokainen lohko erikseen, sanotaan,
että kyseessä on elektroninen koodisanakirja, ECB (electronic code book
mode). Siinä samanlainen lohko tuottaa aina saman kryptotekstin, mikä ei ole
hyvä ominaisuus, jos teksti on pitkä. Tällöinhän murtajalle tarjoutuu
tilaisuus tilastolliseen analyysiin (siis esim. 64 bitin eli 8 kirjaimen mittaisten tekstinpätkien esiintymisestä). Algoritmi on kuitenkin nopea, koska
se on mahdollista rinnakkaistaa.
Useimmiten on syytä käyttää jotain seuraavista ketjuttavista moodeista, joissa seuraavan lohkon kryptaus riippuu aiemmista. Kaikissa niistä tarvitaan yhden lohkon mittainen alustusvektori (IV) eli bittijono, joka toimii lohkoalgoritmin ensimmäisenä syötteenä. Sen ei tarvitse olla salainen, mutta sen on syytä olla joka kerta uusi - ainakin OFB-moodissa.
Eri moodeilla on paitsi erilaiset kryptologiset ominaisuudet myös erilainen kyky toipua kryptotekstiin siirron aikana tulleista virheistä.
Harjoitus: Päteekö kaikkiin em. moodeihin seuraava? Jos salausalgoritmia sovellettaessa käytetään joka kerta eri avainta (tai jopa eri algoritmia, jossa on kuitenkin sama lohkokoko), niin salauksen purku onnistuu entiseen malliin, kunhan eri avaimia (algoritmeja) käytetään samassa järjestyksessä.
VuokryptausMotivointia
Sisältöä ja tavoitetta
YhteyksiäTässä jaksossa on hyödyksi, jos on tutustunut lohkoalgoritmien käytön moodeihin.
|
Selvätekstiin summattavaa bittijonoa sanotaan myös avainvirraksi tai -vuoksi (key stream) ja sen mukaisesti kryptausmenetelmää sanotaan vuosalaukseksi tai jonosalaukseksi (stream cipher). Hyvässä algoritmissa avainvirta muodostetaan kryptografisesti vahvalla satunnaislukugeneraattorilla, mikä tarkoittaa, että seuraavaa bittiä ei pysty ennustamaan, vaikka edelliset olisikin saanut selville. Tämähän ei päde tavallisissa satunnaislukugeneraattoreissa, vaikka ne olisivat tilastollisilta ominaisuuksiltaan kuinka hyviä.
Jos avainvirta on riippumaton selvätekstistä (kuten esim. lohkoalgoritmin OFB-moodissa), se voidaan vaikkapa laskea etukäteen, mutta vastaanottajan avainvirran täytyy olla samassa vaiheessa lähettäjän virran kanssa. Tällaista vuokryptausta sanotaan synkroniseksi. Voidaan myös muodostaa ns. itsesynkronoivia systeemejä, jotka toipuvat automaattisesti häiriöistä. Perusidea on se, että avainvirta riippuu vain avaimesta ja tietystä rajoitetusta määrästä aiempia kryptotekstibittejä (näin on vaikka selvätekstibiteistä kaikki aiemmat vaikuttavat kryptotekstiin). Tavallisin tällainen systeemi on lohkoalgoritmin CFB-moodi, jossa r=1 (eli kunkin lohkosalauksen tuloksesta käytetään vain yksi bitti).
Vaikka vuosalaus voidaan toteuttaa lohkoalgoritmin avulla, näin ei tehdä silloin kun tavoitellaan suurta salausnopeutta. Yleensä vuokryptaus toteutetaan lineearisilla takaisinkytketyillä siirtorekistereillä (linear feedback shift registers, LFSR). Kovototeutuksina näin päästään tyypillisesti suurempiin nopeuksiin kuin lohkoalgoritmeilla. Pienten puskureiden tai tiukkojen reaaliaikavaatimusten yhteydessä, esim. telekommunikaatiossa vuosalaus on usein välttämätöntä (vrt. kaapeli-TV:n tai puhelun "scrambler" tai GSM-puhelun kryptaus radiotiellä).
LFSR koostuu n:stä yhden bitin rekisteristä R0, R1, ..., Rn-1, joihin on aluksi syötetty jotkin alkuarvot (avaimen bitit kryptauskäytössä). Kellon antaessa sykäyksen bitit siirtyvät ("shift") yhtä pienempään rekisteriin siten, että R0:sta muodostuu rekisterin ulostulo. Tämä bitti syötetään samalla toiseen päähän ("feedback") eli rekisteriin Rn-1, kuitenkin siten, että siihen on XOR-summattu ("linear") joidenkin muiden rekisterien sisältö.
Kun siirtorekisterillä on jokin alkutila, se tulostaa bittijonon, joka toteuttaa tietyn lineaarisen rekursioyhtälön ja on jaksollinen. Jakson pituus on korkeintaan 2n-1. Tämä maksimaalinen jakso saavutetaan (kaikilla ei-nollilla alkutiloilla), mikäli takaisinkytkettävät rekisterit valitaan jonkin n:ttä astetta olevan ns. primitiivisen polynomin kertoimien mukaisesti.
Esimerkiksi polynomi on 1+x+x4 on primitiivinen ja vastaava rekursioyhtälö on si = si-1 + si-4 modulo 2 (i >=4). Tässä si vastaa polynomin 1:ä, si-1 vastaa x:ää ja si-4 x4:ää. Modulo 2 -laskun, eli XOR:n, mukaanhan + on sama kuin - ja yhtälö on yhtäpitävästi 0 = si + si-1 + si-4 modulo 2.)
Alkuarvoina ovat si, i=0,1,2,3. Ne ovat myös Ri:den alkutilat ja neljä ensimmäistä ulostuloa. Viidennestä eli s4:stä eteenpäin ulostulo saadaan yhtälön mukaisesti.
Harjoitus. Jos ulostulossa jossain vaiheessa esiintyy ....1110 (eli viimeisenä tuli 0), laske seuraavat kaksi bittiä. Ohje: Käytä yhtälöä tai: Piirrä 1,1,1 ja 0 vierekkäisiin ruutuihin, merkitse takaisinsyöttö vasemmalta oikealle ja kytke siihen 0:n kohdalta XOR ja ala siirrellä. Tulosta vasemmalta. Miksei tarvinnut tietää varsinaista alkutilaa?
LFSR:n lineaarisuutta häivytetään vuokryptausalgoritmeissa kytkemällä useita sellaisia erityisin tavoin toisiinsa. Esimerkiksi GSM:n A5-algoritmissa on kellon kontrolloimina kolme LFSR:ää, pituuksiltaan 19, 22 ja 23. (Lisää A5:stä toisaalla.)
Julkisen avaimen kryptosysteemit, RSA, allekirjoitusMotivointia
Sisältöä ja tavoitetta
Yhteyksiä
|
(2) Katsotaan, mitä tapahtuu, kun moduulina on 21 eli kahden alkuluvun tulo: Huomataan ensin, että 3:lla tai 7:llä jaolliset luvut ovat sikäli kehnoja, että ne "jakavat nollan" eli ne voivat olla toisena tekijänä kertolaskussa, jonka tulos on 0 eli jaollinen 21:llä. Tutkitaan siis vain lukuja, joissa ei ole tekijänä 3:a eikä 7:ä, eli sellaisia joiden syt 21:n kanssa on 1. Näitä osoittautuu olevan 12, joka on = (7-1)(3-1) eli Eulerin phi-funktio arvolla 21. (Kyseiset luvut muodostavat multiplikatiivisen ryhmän modulo 21. Edellä laskettiin sellaisessa modulo 7. Phi arvolla alkuluku p on p-1.)
Lasketaan toiset potenssit, toteamalla etukäteen että x:llä ja sen vastaluvulla eli (21-x):llä on sama neliö. Katsotaan, minkä verran luvuilla on neliöjuuria. Yritetään generointia potenssiin korottamalla. Osoittautuu että viimeistään 6. potenssi on aina 1 (ja usein jo 2. tai 3.; erityisesti generaattoria ei siis ole eli ryhmä ei ole syklinen. Silti aina myös Phi's eli 12. potenssi on 1.)
Mitäpä sitten, jos joku tunteekin p:n ja q:n? Tällöin hän voi laskea erikseen x:n neliöjuuret modulo p ja modulo q, sillä kun moduulina on alkuluku (joka on =3 mod 4), on olemassa tehokkaita algoritmeja neliöjuuren laskemiseen. Yhdistelemällä kaksi juurta modulo p ja kaksi juurta modulo q hän saa selville neljä ehdokasta x:ksi. Jos x:ään on koodattu jokin viesti, jossa on mukana hieman redundanssia (esim. luonnollista kieltä tai tarkistussumma), niin viesti erottuu ratkaisujen joukosta. Lievä epäinjektiivisyys ("4-to-1") ei siis haittaa.
Jos p ja q ovat riittävän suuria alkulukuja, niiden tuloa n on erittäin vaikea jakaa tekijöihin, joten valittuaan p:n ja q:n satunnaisesti, käyttäjä voi huoletta paljastaa n:n ja antaa toisten lähettää "neliö"viestejä hänelle. Kukaan muu ei niitä saa auki. Tämä on julkisen avaimen kryptografiaa ja luonnosteltu systeemi kantaa Rabinin nimeä (vuodelta 1979). Tämän systeemin murtaminen on yhtäpitävää luvun n tekijöihinjakamisen kanssa, seikka jota ei ole voitu todistaa seuraavaksi esiteltävästä RSA:sta.
Yleisesti salausavain (edellä "n") voi siis olla kaikkien saatavilla eli se on julkinen avain. Purkamiseen tarvitaan tietenkin jokin salausavaimesta riippuva tieto, ns. yksityinen, tai salainen, avain (tässä "p ja q"). Se, että nämä ovat erilaiset, antaa aiheen kutsua julkisen avaimen systeemejä myös epäsymmetrisiksi kryptosysteemeiksi. Joissain tapauksissa, kuten edellä, algoritmikin on hyvin erilainen eri suuntiin. Sitä, että julkisen avaimen laatija tietää, mitä sen takana on (tässä siis tekijöihinjako), 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.
Hieman teoriaa taustaksi. Tässä (p-1)(q-1) = Phi(n) =
Eulerin phi-funktio arvolla n (myös "Euler's totient function"). Yleisesti,
siis muunkinlaisilla n:n arvoilla, pätee xPhi(n) = 1 mod n, jos
syt(x,n)=1. Seuraava lasku osoittaa, miksi RSA toimii. Merkitään siinä F =
Phi(n). Tällöin ed=1+vF, missä v on jokin vakio. Tätähän tarkoittaa se, että ed
= 1 mod F. Nyt
Olkoon viesti m=13. Tällöin kryptoteksti on c=me mod n =
133 mod 55 =2197 mod 55 = 52.
Laskimella, jossa tarkkuus riittää, voi heti todeta että cd mod n =
5227 mod 55 = 13. Suoraan korotettuna potenssi on noin
2·1046. On selvää, ettei tällaista operaatiota ehdi eikä
mahdu tekemään millään kohtuullisilla resursseilla, kun luvut ovat
monisatanumeroisia. Sen vuoksi potenssilasku tehdään seuraavaan
tapaan, joka tekee tämän esimerkinkin mahdolliseksi vaikka laskimessa ei
olisi kuin vaikkapa kahdeksan numeron tarkkuus.
Esitetään eksponentti kakkosen potenssien summana: 27 = 16+8+2+1, eli
binäärilukuna 11011. Tämä tarkoittaa, että
(xe mod n)d mod n =
(xe)d mod n = xed mod n = x1+vF mod
n = x1(xF)v mod n = x*1v mod n = x
mod n.
Esimerkki. Valitaan alkuluvut p=5 ja q=11, jolloin n=55 ja
Phi=4·10=40.
Olkoon e=3. Seuraavaksi pitäisi ratkaista yhtälö ed=1 mod Phi eli 3d=1 mod 40.
Tämä onnistuu päässälaskullakin: 3d=41 ei tosin käy, mutta
3d=81 (=9·9) toteutuu kun d=27.
c27=c1· c2·
c8· c16 =
Laskemalla vaiheittain neliöitä ja kertomalla niitä keskenään, päästään 26
kertolaskun sijasta 7:llä. Kun lisäksi joka välissä redusoidaan modulo 55,
muistissa oleva luku ei koskaan ylitä arvoa 2916 (=54·54).
c· c2· (x2)2·
y2,
missä on merkitty x= c2 ja y = (x2)2.
Oleellista RSA:n turvallisuuden kannalta on, 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). Ovathan e ja d toistensa käänteislukuja modulo juuri tämä luku.
Eksponenttilasku on hidas operaatio, vaikka julkiselle eksponentille e olisikin valittu usein käytetty arvo 3. Tämän vuoksi RSA:ta ei kannata käyttää pitkien viestien salaamiseen. Sama koskee tosin muitakin julkisen avaimen systeemejä - kaikki ovat hitaampia kuin symmetrinen salaus.
Kannattaakin muodostaa ns. digitaalinen kirjekuori. Valitaan satunnainen symmetrisen salausalgoritmin avain k ja salataan viesti sen avulla. Salataan sitten k käyttäen vastaanottajan julkista RSA-avainta. Lähetetään nämä salatekstit vastaanottajalle yhdessä asianmukaisten otsikkotietojen kanssa, joilla tyypillisesti yksilöidään käytetyt algoritmit ja se mitä julkista avainta on käytetty. Näin vastaanottaja tietää, mitä viestin osille pitää tehdä. Tällaista menettelyä käytetään usein osana jotain laajempaa protokollaa, joista tällä kurssilla esiintyy PGP.
RSA:n kehittivät ja sittemmin patentoivat Rivest, Shamir ja Adleman. Alkuperäinen artikkeli vuodelta 1978 on "A method for obtaining digital signatures and public key cryptosystems".
Epäsymmetrisillä kryptosysteemeillä voidaan saada aikaan todellisia digitaalisia allekirjoituksia. Perusidea on, että allekirjoittaja A luo epäsymmetrisen avainparin (V,S) ja sitoo julkisesti avaimen julkisen osan V (=verifiointiavain) omaan identiteettiinsä ja käyttää salaista osaa S (=signeerausavain) dokumenttien allekirjoittamiseen. Kuka tahansa B voi vakuuttua allekirjoituksen aitoudesta, koska vain A on voinut laatia ne: vain A tuntee S:n ja vain S:llä allekirjoitetun dokumentin voi verifioida V:llä. Lisäksi A:n julkinen sitoutuminen V:hen saa aikaan sen, ettei hän voi kiistää S:llä allekirjoitettuja dokumentteja - paitsi yrittämällä väittää, että hänen avaimensa on paljastunut. Periaatteessahan mistä tahansa julkisesta avaimesta voi laskea vastaavan salaisen avaimen. Yksilöitä ja avaimia toisiinsa sitovien järjestelmien täytyy tämän vuoksi olla varuillaan, ettei kukaan yritä ottaa käyttöön helposti murrettavaa julkista avainta, jolloin myöhemmin esitettävälle murtumisväitteelle olisi ikäänkuin jälkikäteen löydettävissä selityskin.
RSA soveltuu epäsymmetrisistä systeemeistä sikäli luontevimmin allekirjoitukseen, että julkisen ja salaisen eksponentin roolit ovat matemaattisessa mielessä symmetriset (vrt. eo. laskelma, kyse on kommutatiivuudesta). Allekirjoitusta varten avaimia vain käytetään toisessa järjestyksesä kuin salauksessa. Dokumentin m allekirjoitus s muodostetaan salaisella eksponentilla d laskemalla s=md mod n. Kun m ja s lähetetään yhdessä, kuka tahansa, joka tuntee vastaavan julkisen avaimen e, voi verifioida eli todentaa, että m = se mod n.
Symmetrisellä algoritmilla salattavan viestin redundanssilla on merkitystä puretun viestin aitouden todentamiselle. Vastaava pätee epäsymmetristen systeemien allekirjoitukseen. Koska RSA:n tapauksessa pelkästä potenssista s=md mod n saa selville koko m:n, ei m:ää tarvitsisi välttämättä liittää mukaan, jos siinä on redundanssia. Toisaalta, kuten on jo todettu, RSA:n eksponenttilasku on hidas operaatio, minkä vuoksi yleensä vain viestin tiivistelmä allekirjoitetaan. Lähetys on siis:   m, (H(m))d mod n,   missä H on hash-funktio.
Harjoitus: Miksi luotettu osapuoli on sitä luotettavampi mitä vähemmän se luottaa sinuun? Keksi esimerkkejä.
Harjoitus: Jos sinun pitää osoittaa henkilöllisyytesi, niin miksei se ei onnistu paperille kirjoittamasi allekirjoituksen avulla? Miten digitaalinen allekirjoitus muuttaa tilannetta?
Kryptologia, kooste/kertausMotivointia
Sisältöä ja tavoitetta
Yhteyksiä
|
Suuri osa varsinkin perinteisestä tietoturvasta on silti toteutettavissa ilman salakirjoitusta, mutta mitä enemmän tieto on pelkästään digitaalisessa muodossa ja mitä enemmän sitä siirretään tietokoneiden välillä, sitä enemmän tarvitaan salausta ja muita kryptografisia toimintoja. Kaikissa niissä ei käytetä lainkaan avainta ja toisaalta on järjestelmiä, joissa yhteen suuntaan toimiva avain on hyödyllinen vasta julkaistuna ja vieläpä varmennettuna. Tällöinkin toiseen suuntaan toimivan avaimen on pysyttävä salassa.
Sopivilla ja riittävän turvallisilla kryptografisilla algoritmeilla ja niitä käyttäen rakennetuilla protokollilla voidaan luoda pohja useimpien tietoturvatavoitteiden toteuttamiselle, kunhan rakennetaan turvallinen implementaatio ja sille puolestaan turvallinen installaatio.