6. Silmaring: krüpteerimine
Autor: Kristjan Krips
SISSEJUHATUS
Selle nädala silmaringi materjalis teeme lühikokkuvõtte sellest, mis on krüpteerimine ja miks seda vaja läheb. Ajaloo osas mainisime masinat nimega Enigma, mida kasutati Teise maailmasõja ajal militaarsõnumite kaitsmiseks pealtkuulajate eest. Enigma oli masin, mis võimaldas andmeid krüpteerida ning seega neid kaitsta kolmandate osapoolte eest (näiteks sakslaste andmete kaitsmist inglaste eest). Enigma muutis masinasse sisestatud andmeid nii, et masinast väljuvad andmed olid kolmandale osapoolele loetamatud.
KODEERIMINE
On oluline tähele panna, et Enigma puhul polnud tegu andmete lihtsa kodeerimisega, sest kodeeritud andmeid on kerge taastada. Lihtne kodeerimise näide on morsekood, mis muudab kindla eeskirja alusel andmeid ning võimaldab neid selle sama eeskirja alusel taastada.
Krüpteerimine erineb kodeerimisest selle poolest, et andmete töötlemisel kasutatakse võtit, mistõttu kolmas osapool ei saa ilma võtit omamata krüpteeritud andmetest esialgset taastada.
KRÜPTEERIMINE
Tänapäeval on krüpteerimine põhiline viis digitaalsete andmete kaitsmiseks. Krüpteerimise abil kaitstakse telefonikõnesid pealtkuulamise eest ning meditsiiniandmeid ja ärisaladusi lekkimise eest. Muuhulgas kasutatakse krüpteerimist tasuliste telekanalite edastamisel, wifi võrgu kaitsmisel, HTTPS protokolli kasutavate veebilehtedega suhtlemisel, digiallkirjastamisel ja e-hääletamisel. Krüpteeritud ühenduse kasutamine on üks oluline meetod turvalise internetipanga teenuse pakkumisel. Kuna krüpteerimine mõjutab meid iga päev, siis võib tekkida küsimus, kuidas ikkagi krüpteerimine toimib ning kas ründajal on võimalik krüpteeritud sõnumeid lahti murda.
SÜMMEETRILINE KRÜPTEERIMINE
Kõige lihtsam on krüpteerimist ette kujutada nii, et on olemas krüpteerimisalgoritm (eeskiri), mis saab sisendiks andmed ja krüpteerimisvõtme ning annab väljundiks krüpteeritud andmed. Nende krüpteeritud andmete taastamiseks on vaja kasutada dekrüpteerimise (lahtikrüpteerimise) võtit ning ilma vastava võtmeta pole võimalik andmeid esialgsel kujul taastada. Juhul kui krüpteerimisvõti ja dekrüpteerimisvõti on samad, siis on tegu sümmeetrilise krüpteerimisalgoritmiga. Niisuguseid algoritme kasutatakse suurte andmehulkade krüpteerimiseks, hea näide on kõvakettal või mälupulgal olevate andmete kaitsmine.
![](https://courses.cs.ut.ee/2023/prog-alused/spring/Main/SilmKrupteerimine?action=download&upname=krypteerimine.png)
Krüpteerimine ja dekrüpteerimine
Nüüd võib tekkida küsimus, et mis on see võti, mida krüpteerimisel ja dekrüpteerimisel kasutatakse. Vastav võti on mõnes mõttes sarnane tavalise lukuvõtmega — võtit tuleb valvata, et sellest koopiat ei tehtaks, ja võtit tuleb kaitsta kadumise eest, et võõrad võtit kasutada ei saaks. Lisaks sellele tuleb võtit enda jaoks säilitada, et tagada juurdepääs võtmega suletud hoiukohtadele või ruumidele. Oluline on märkida, et ka krüpteeritud andmetele on võimalik juurde pääseda ainult vastavat võtit kasutades. Võti on kahendsüsteemis arv ehk siis ühtedest ja nullidest koosnev jada. Tänapäevaste sümmeetriliste krüpteerimissüsteemide korral on võtmed enamasti 128-bitised või 256-bitised ehk siis ühtede ja nullide jadad pikkusega 128 või 256 märki. On väga oluline, et krüpteerimisel kasutatav võti oleks juhuslikult genereeritud, sest krüpteerimise tugevus sõltub nii krüpteerimisalgoritmi kui ka võtme tugevusest.
Samas toob juhuslike bitijadade kasutamise nõue endaga kaasa kaks probleemi:
- Esimene probleem seisneb selles, et juhuslike võtmete genereerimine ei ole lihtne, sest arvutid ei suuda päris juhuslikke arve genereerida.
- Teine probleem on seotud sellega, et inimesed ei ole võimelised meelde jätma pikki nende jaoks seosetuid bitijadasid.
Seetõttu krüpteeritakse võti enamasti parooliga, mida on inimesel lihtsam meelde jätta, ning krüpteeritud võti salvestatakse kas eraldi failina, lisatakse krüpteeritud faili päisesse või hoitakse eraldiseisval kiibil.
Andmete krüpteerimiseks on vaja valida sobiv krüptosüsteem. Krüptosüsteem koosneb:
- võtme genereerimise algoritmist,
- andmete kaitsmiseks mõeldud krüpteerimisalgoritmist ja
- andmete taastamiseks mõeldud dekrüpteerimisalgoritmist.
Krüptosüsteemi valikul tuleks lähtuda selle turvalisusest. Tänapäeval on sümmeetrilise krüpteerimise korral standardlahenduseks AES-i (Advanced Encryption Standard) kasutamine. AES krüpteerib andmeid 128-bitiste plokkide kaupa, täpsemat infot AES-i toimimise kohta leiate vastavalt Wikipedia lehelt: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard.
AES-i pakutavat krüpteeringut peetakse murdmatuks. See tähendab seda, et isegi superarvutid ei suuda AES-i abil krüpteeritud andmeid lahti murda, sest leitud pole ühtegi olulist krüptograafilist viga ning kõikide erinevate võtmete proovimiseks kuluks miljoneid aastaid. See kehtib ainult vastava süsteemi korrektsel kasutamisel, mis tähendab seda, et võti on genereeritud juhuslikult ning see ei leki. Juhul kui AES võtme kaitsmiseks kasutatav parool on lühike, näiteks kaheksa sümboli pikkune, siis on võimalik kõikvõimalike lühikeste paroolide proovimise teel vastav parool üsna kiiresti üles leida ning seega andmed dekrüpteerida. Samuti on vaikimisi eelduseks, et krüpteerimistarkvara on kirjutatud spetsialistide poolt, et see ei lekitaks infot krüpteeritavate andmete või võtmete kohta. Krüptoalgoritmide programmeerimine ei ole lihtne, sest info võib lekkida väga erinevatest kohtadest, näiteks protsessori energiatarbimise kaudu.
SÜMMEETRILISE KRÜPTEERIMISEGA SEOTUD PROBLEEMID
Sümmeetriline krüpteerimine võimaldab andmeid kaitsta, kuid probleemiks osutub krüpteeritud andmete jagamine teiste osapooltega. Kuna sümmeetrilise krüpteerimise korral kasutatakse krüpteerimiseks ja dekrüpteerimiseks sama võtit, siis oleks krüpteeritud andmete jagamisel vaja edastada ka võti.
Nüüd tekib küsimus, et kui turvaline on võtme jagamine ja edastamine. On oluline tähele panna, et kui võtit ja krüpteeritud andmeid edastatakse koos, siis saab pealtkuulaja juurdepääsu krüpteeritud andmetele ning seega poleks andmed kaitstud. Seega oleks võtme edastamiseks vaja turvatud sidekanalit. Samas, kui suhtluspartnerite vahel on juba olemas turvatud sidekanal, siis ei olegi enam vajadust andmeid eraldi krüpteerida.
Mida teha olukorras, kus suhtluspartnerite vahel ei ole turvatud sidekanalit ning nad peavad edastama konfidentsiaalseid andmeid? Võimalik on kasutada kahte erinevat ebaturvalist sidekanalit (näiteks edastatakse parool käsitsi ümbrikus), lootuses, et pealtkuulaja ei saa mõlemat kanalit pealt kuulata ning seetõttu ei saa juurdepääsu kas krüpteeritud andmetele või siis võtmele. Samas ei paku niisugune süsteem suhtluspartneritele kindlust, et nende saadetud konfidentsiaalsed andmed jäävad salajaseks.
Isegi kui õnnestub leida turvaline viis võtme edastamiseks, siis tekib teine probleem. Nimelt on vaja iga sõnumi jaoks genereerida uus võti, sest juhul kui suhtluspartner lekitab võtme (näiteks portaal ei turva paroole piisavalt hästi), siis saaksid kolmandad osapooled järgmisi sõnumeid lugeda. See omakorda tekitab vajaduse turvalise võtmehalduse jaoks.
Neid probleeme saab lahendada avaliku võtme krüptograafia ehk asümmeetrilise krüptograafia abil.
ASÜMMEETRILINE KRÜPTEERIMINE
Asümmeetrilise krüpteerimise ehk avaliku võtme krüpteerimise korral kasutatakse kahte võtit — avalikku ja salajast võtit. Need võtmed genereeritakse korraga ning nad on omavahel seotud nii, et avalik võti ei lekita informatsiooni salajase võtme kohta. Võtmete genereerimine peab olema juhuslik.
Nii nagu nimigi ütleb, on üks võti avalik ning seda võib kõigiga jagada. Samas tuleb salajast võtit kaitsta lekkimise eest. Asümmeetrilise krüpteerimise korral on kõigil osapooltel enda võtmepaarid. Näiteks on kõigil Eesti ID-kaardi omanikel kiibis võtmepaar. Samuti on kõigil HTTPS pakkuvatel veebilehtedel oma võtmepaar.
Avalikku võtit kasutatakse andmete krüpteerimiseks ning vastavat salajast võtit kasutatakse andmete dekrüpteerimiseks. Seega võimaldab asümmeetrilise krüptograafia kasutamine lihtsamat võtmevahetust, sest avalikku võtit saab edastada ebaturvalise sidekanali abil. Kui on vaja suhtluspartnerile saata konfidentsiaalseid andmeid, siis kõigepealt on vaja küsida suhtluspartneri avalikku võtit ning siis saab seda kasutada, et konfidentsiaalseid andmeid krüpteerida. Kuna krüpteerimiseks kasutati suhtluspartneri avalikku võtit, siis saab vastavalt krüpteeritud andmeid dekrüpteerida ainult see sama suhtluspartner, sest ainult temal on juurdepääs sobivale salajasele võtmele.
Selgituseks võtame näite, kus Kristjan tahab Taunole saata krüpteeritult salajast faili. Selleks peab:
- Tauno jagama Kristjaniga enda avalikku võtit. Näiteks on ID-kaardi kiibis võtmepaar (avalik ja privaatne võti) ja Tauno jagab Kristjaniga ID-kaardi avalikku võtit. See pole probleem, sest ID-kaardi avalikud võtmed ongi vabalt jagatavad.
- Seejärel Kristjan krüpteerib faili kasutades Tauno ID-kaardi avalikku võtit ning saadab krüpteeritud faili Taunole.
- Nüüd ei jää Taunol muud üle, kui kasutada ID-kaardi kiibil olevat privaatset võtit ja saabki esialgsele failile kenasti ligi.
Tegelikult küll kasutatakse suuremate andmete krüpteerimiseks alati sümmeetrilist krüptograafiat ning seega selles olukorras hübriidsüsteemi, kus genereeritakse sümmeetriline võti, sellega krüpteeritakse fail ja võti ise krüpteeritakse siis vastava avaliku võtmega.
Juhul kui aga võtmeid kasutatakse vastupidi, siis on tegemist digiallkirjastamisega. Sellisel juhul krüpteeritakse andmed salajase võtmega ning seda saab teha ainult salajase võtme omanik. Digiallkirja kontrollimiseks kasutatakse vastavat avalikku võtit ning seda saavad teha kõik, kellel on juurdepääs vastavale avalikule võtmele.
![](https://courses.cs.ut.ee/2023/prog-alused/spring/Main/SilmKrupteerimine?action=download&upname=krypteerimine2.png)
Krüpteerimine ja dekrüpteerimine salajase ja avaliku võtmega