2016. augusztus 24.

Kriptográfia madártávlatból

Napjainkban az internet of things és a cloud világát éljük. A felhőben tároljuk a névjegyeinket, az aktuális pozíciónkat, elektronikusan kezeljük a pénzünket és bizonyára hamarosan az internetről vezérelhetjük az otthonunkat is. De mire hagyatkozunk amikor megbízunk az eszközeinkben? Hogyan valósítható meg egy biztonságos alkalmazás? Az olvasót ebben a cikkben a kriptográfia alapjainak áttekintésére invitálom, hogy megérthessük hogyan működik, és mit is jelent az elektronikus biztonság.

Amire a megoldást keressük


A titkosításra általában különlegességként gondolunk, mint valamire amire csak a titkosszolgálatoknak, bankigazgatóknak esetleg bűnözőknek van szüksége. A saját magánszféránk megőrzésére látszólag más eszközöket használunk. Például a postán feladott levelet borítékba tesszük, vagy egyszerűen csak bezárjuk a lakásunk ajtaját.

Az átlagembernek az internet világ kezdetéig nem igazán volt titkolnivaló információja. Az internet korában viszont szinte minden elektronikus információ. A bankszámla-egyenlegünk egy elektronikusan tárolt szám, és szinte minden rendszerhez egy titokkal - a jelszóval - férünk hozzá. De olyan helyen is van titkolnivalónk ahol nem is számítanánk rá: Ha például okos ajtózárunk van, akkor egy üzenetet - információt - kell a zár nyitásához ismerni.

Függetlenül attól hogy a lakásunkról, a magánéletünkről vagy államtitokról van szó: Az információ akkor van biztonságban ha jóval többe kerül megszerezni, mint amennyi az információ értéke lehet.

Ezért nem szükséges titkosítanunk a postai leveleinket. A hagyományos kommunikációt lehallgatni drága. Valahogyan a hordozót meg kell szerezni, költeni kell az információ kinyerésére, ügyelni kell rá hogy a csomagolás sértetlennek tűnjön, és persze valahogy vissza is kell juttatni a hordozót az eredeti helyére. Ez még profi titkosszolgálati eszközökkel is sokkal többe kerül levelenként, mint hogy valakit érdekeljen miről szoktunk levelezni a családdal.

Más a helyzet az elektronikus kommunikáció esetében. Az üzeneteinket mi magunk alakítjuk teljesen automatizáltan, gyorsan reprodukálható információvá. Erre van szükségünk ahhoz hogy átküldjük az interneten, vagy éppen az okos-zárnak Bluetooth-on, NFC-n. De ez azt is jelenti hogy az információ ellopása rendkívül olcsó, és gyors. Ha tehát nem szeretnénk hogy elolvassák a leveleinket, belépjenek a levelezésünkbe, vagy éppen bejussanak a lakásunkba, valamilyen védelemre lesz szükségünk.

Mivel semmit nem lehet tenni az elektronikus információ másolása ellen, más megoldást kell találni. El kell érni hogy az adat csak a címzettnek legyen könnyen értelmezhető. Meg kell oldani hogy ha bárki más lehallgatja a kommunikációt, abból még nagyon drága legyen megszerezni az értékes információt - az e-mailünk tartalmát, vagy éppen a zár következő kinyitásához szükséges kódot. Ehhez a kriptográfia eljárásait hívhatjuk segítségül.

Rejtjelezési algoritmusok


Ha egy üzenetben minden betű helyett az ábécében utána következő betűt írjuk az megfelelő titkosítás? Természetesen nem. Egyrészt intuitív módon rá lehet jönni a módszerre, másrészt a módszert nem nyújt univerzális megoldást. Titokban kell tartani, mert mindenki akinek megvan a módszer, minden információt meg is tud vele fejteni. Ezért nem építhető be szabadon elérhető programokba, nem osztható meg senkivel a biztonságának elvesztése nélkül. Ahhoz hogy egy titkosítás erősségéről, biztonságáról beszélgethessünk, és a titkosítás széles körben használható lehessen, természetesen szükség van rá hogy a titkosítási módszert ismerjük. Ki kell választani tehát valamilyen az algoritmusban felhasznált, szabadon változtatható információt, ami biztonság forrása lesz, minden mást pedig nyilvánosnak kell tekinteni.

A kriptográfia alapvetése, hogy a módszert ahogy titkosítunk (eljárás) különválasztjuk egy titoktól (kulcs) ami a módszeren kívül még szükséges a megfejtéshez. Az eljárás nyilvános, de a rejtjelezett információt megfejteni a kulcs ismerete nélkül, pusztán az eljárás birtokában nem lehet.

Az eljárásokat így bárki szabadon tanulmányozhatja, ezért az esetleges gyengeségeik és előnyeik is általában ismertek a nyilvánosság számára. A különböző típusú algoritmusok közül pedig bárki a számára legmegfelelőbbet alkalmazhatja, anélkül hogy a felhasználását (pl. a felhasználó programját) titokban kellene tartani. A kulcsokat persze külön kell kezelni, és különleges figyelmet fordítani rájuk. Ha egy kulcsot valaki megszerez, azzal képes lesz a kulcshoz tartozó titkosított üzenetek megfejtésére.

A kriptográfusok a különböző problémákra más-más módon működő, és mást garantáló algoritmusokat fejlesztettek ki. A biztonságos rendszert alapvetően a jól kiválasztott eljárások, és a hozzájuk tartozó kulcsok helyes használata határozza meg. Érdemes tehát mindet ismerni, - különös tekintettel a gyengéikre - és olyat kell választani, aminek a működési modellje jól illeszkedik az alkalmazáshoz.

Szimmetrikus kulcsú titkosítások


A szimmetrikus kulcsú titkosítás a rejtjelezés legáltalánosabban használt - és sokáig egyetlen - módja. Az ilyen eljárásoknál minden a titokhoz hozzáférő félnek ismernie kell a közös kulcsot, ezt kell használni az adatok titkosításához és visszafejtéséhez. Egy új kulcs választása gyors, általában bármilyen véletlen szám használható kulcsként. Sok különböző ilyen eljárás létezik, az informatikában gyakran használtakat három nagy csoportba oszthatjuk.

Egyszer használatos kulcs (one time pad)


A legegyszerűbb titkosítási módszer, és az egyetlen aminél bizonyítottan lehetetlen a titkosított adatból az eredeti adatot kinyerni.

A módszer lényege hogy a hasznos információt bináris számként tekintjük, és egy előre egyeztetett, az adattal azonos hosszúságú véletlen számot használunk kulcsként, amit kizáró vagy (xor) kapcsolatba hozunk az adattal.
A kizáró vagy működése:
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0

Jelölések:
C = rejtjelezett adat (ciphertext)
M = eredeti üzenet (message)
K = titkosító kulcs (key)

Titkosítás:
C = M xor K
M = C xor K

Ahhoz hogy a rejtjelezett adaton ne lehessen statisztikai támadást végezni, egy kulcs biztonságosan csak egyetlen üzenethez használható fel, és ugyan olyan hosszúnak kell lennie mint a hasznos adatnak. Így legalább olyan sok előre egyeztetett, titkos kulcsként használható információra van szükség, amennyi információ titkosítására szükség van. Az ilyen nagyméretű kulcsok nehéz kezelése miatt ezt a módszert csak nagyon ritkán használják.

Folyam rejtjelezők


A folyam rejtjelezők az egyszer használatos titkosításhoz szükséges óriási kulcs problémáját próbálják orvosolni. Ezek egy előre egyeztetett sokkal kisebb kulcsból nagy mennyiségű, olyan kvázi-véletlenszerű adatot generálnak ami biztonságosan használható a kizáró vagy művelethez.
Jelölések:
C = rejtjelezett adat (ciphertext)
M = eredeti üzenet (message)
K = titkosító kulcs (key)
s = segédkulcs
p = periódus
F = folyam titkosító függvény

Titkosítás:
s = F(K,p)
C = M xor s
M = C xor s

A kizáró vagy műveletben résztvevő segédkulcs továbbra is csak egyszer használható biztonságosan, ezért a folyam titkosító függvénynek a kulcson kívül egy plusz információra, a periódusra is szüksége van. A periódus értékét minden alkalommal növelve különböző segédkulcsokat fogunk kapni.

Bár a folyam rejtjelezők megoldják hogy ne kelljen előre óriási kulcsokat egyeztetni, használatuk korántsem olyan biztonságos mint az egyszer használatos kulcs esetében, mert a különböző periódusok segédkulcsai nem teljesen függetlenek egymástól. Ezen felül bár ezek az eljárások az információ kinyerése ellen védelmet nyújtanak, a hamisítása ellen korántsem. Tipikusan valamilyen egyéb, az üzenet érintetlenségét ellenőrző módszerrel együtt kell őket alkalmazni.
Tegyük fel hogy egy képzelt katonaságnál egy üzenet 3. bitjének jelentése igen/nem válasz az "elpusztítsuk-e a világot?" kérdésre. Ezt az üzenetet egy egyszer használatos kulcs segítségével titkosítva juttatják el a főhadiszállásra. Vegyük észre hogy a világ elpusztításához nincs szükség a titkosítás kulcsára! Ha a támadó tudja hogy éppen béke van, egyszerűen elfogja az üzenetet, bármi is a harmadik bit kicserél az ellenkezőjére, majd továbbküldi a főhadiszállásra. Mivel a harmadik bit jelentése útközben éppen az ellenkezőjére változott ...

Bár gyengeségeik miatt a folyam rejtjelezők lassan háttérbe szorulnak, ma is alkalmazzák őket kompatibilitási okokból, vagy olyan esetben ha a titkosításhoz kevés erőforrás áll rendelkezésre. Elterjedt folyam rejtjelező például a ma már feltörhetőnek számító RC4 algoritmus, vagy az RC4-et részben leváltó ChaCha20 is.

Blokk rejtjelezők


A blokk rejtjelező algoritmusok a folyami rejtjelezőktől teljesen eltérő elven működnek, itt a titkosító algoritmusok a hasznos adaton dolgoznak. Az eredeti adatot fix méretű blokkokra kell bontani, ebből készít az algoritmus - a kulcs felhasználásával - egy ugyanekkora méretű titkosított blokkot.
Jelölések:
C = rejtjelezett adat (ciphertext)
M = eredeti üzenet (message)
K = titkosító kulcs (key)
E = a titkosító eljárás (encryption)
D = a megfejtő eljárás (decryption)

Titkosítás:
C = E(M,K)
M = G(C,K)

A blokk titkosítók előnye, hogy 1-1 bit nem feleltethető meg az eredeti adat 1-1 bitjének, ezért sokkal nehezebb a titkosított adatot manipulálni. Ne feledjük viszont hogy a blokkok determinisztikusan következnek az eredeti szövegből, ezért ha csak önállóan használjuk őket (ECB - Electronic Codebook) akkor statisztikai módszerrel információt lehet szerezni az eredeti adatról. Ennek a kivédéséhez valahogy entrópiát kell adni a blokkoknak. A legelterjedtebb ilyen alkalmazása a blokk titkosítóknak a titkos blokk láncolási módszer (CBC - Cipher Block Chaining). Ebben a megoldásban a megelőző titkosított blokkot kizáró vagy művelettel hozzákeverjük a jelenlegi blokk eredeti adatához.
Jelölések:
Pn = az eredeti üzenet (M) n hosszúságú darabja (blokk)
C0 = inicializációs vektor

Titkosítás:
Cn = E(Cn-1 xor Pn, K)

Az legelső blokknál a hozzákeveréshez egy véletlenszerű inicializációs vektort használunk, ez lesz az entrópia forrása. Ennek a megváltoztatásával azonos forrás szöveg mellett is teljesen eltérő titkosított blokkokat kapunk.

Természetesen a láncoláson kívül sok más módszer is létezik a blokk titkosítók használatára, de bármit is választunk a legnagyobb hátrányt az alkalmazás bonyolultsága jelenti. Kiváló példa erre Padding Oracle sérülékenység, ami egy implementációs hibának köszönhetően tette megfejthetővé a titkosított kapcsolatokat. Ennek ellenére a blokk titkosítók a legelterjedtebben alkalmazott titkosítási eljárások. Helyes alkalmazásuk esetén ezek nyújtják a legnagyobb biztonságot. A legismertebb blokk titkosító az AES (Advanced Encryption Standard) de elterjedt a vele versenyző CAMELLIA is.

Nyilvános kulcsú titkosítás


Az eddig bemutatott bármelyik eljárást is szeretnénk alkalmazni, előbb-utóbb a közös kulcs egyeztetésének problémájával szembesülünk. Szükség van egy közös kulcsra, de hogyan oldható meg ennek a biztonságos megbeszélése? Ha a kulcsot titkosítatlanul egyeztetjük, az ugyanúgy lehallgatható, így az összes titkosított adat megfejthető. Erre a problémára egészen sokáig nem volt igazi megoldás. Mielőtt titkosítottan üzenhettünk volna valakinek, egy külön, biztonságos csatornán meg kellett állapodnunk a kulcsban. Először 1975-ben Diffie és Hellman amerikai kriptográfusok álltak elő egy eljárással, ami a kulcscsere problémáját másképp orvosolja.

A nyilvános kulcsú titkosítás elmélete


A nyilvános kulcsú titkosítások esetében az eljáráshoz nem egyetlen kulcsot, hanem egy kulcspárt kell használni. A nyilvános kulcs kizárólag titkosításra, az ehhez tartozó privát kulcs pedig csak az üzenet megfejtésére alkalmas, a megfelelő algoritmusokkal.
Jelölések:
M = üzenet (message)
P = nyilvános kulcs (pubkey)
K = privát kulcs (key)
C = titkosított üzenet (ciphertext)

Titkosítás:
C = E(M,P)
M = D(C,K)

Magától értetődően ennek csak úgy van értelme ha a nyilvános kulcsból a privát kulcs nem számolható ki. Hogyan lehetséges ez, amikor egyértelműen összefüggés van közöttük? Minden nyilvános kulcsú titkosítási módszer különböző matematikai problémák eltérő nehézségén alapul. A privát kulcs kiszámítható a nyilvános kulcsból csak éppen ez olyan sokáig tart, hogy valójában értelmetlen kivárni. Az összefüggésből bizonyára az olvasó is sejti hogy nem tudunk találomra kulcsot választani magunknak. Létezik viszont olyan eljárás amivel relatív gyorsan készíthetünk egy véletlenszerű privát és nyilvános kulcspárt. Matematikailag megfogalmazva F(x) = E(x,P) egy kiskapus csapóajtófüggvény.
Anélkül hogy kitérnénk a nyilvános kulcsú titkosítások matematikájára, egy egyszerű példával megpróbáljuk szemléletesé tenni működésüket az olvasó számára. Bontsuk prímtényezőire - papíron - a következő számot: 9999999959. Mennyi időbe telt?

Most szorozzuk össze a 163 és a 61349693 prímeket. Ez ugye sokkal gyorsabban megy?

A számítógépes gyakorlatban ha elég nagy prímeket választunk a kettő között olyan nagy az időkülönbség, hogy amíg két prímszámot találni, és a szorzatukat elkészíteni csak pár perc, a szorzatból a benne szereplő két prímet megtalálni több száz évbe is telhet. Ha a két prím szorzatából álló pq számmal úgy tudjuk módosítani egy nyilvános üzenetet, hogy azt csak a konkrét p és q prímek ismeretében lehet visszafordítani, akkor egy nyilvános kulcsú titkosításról beszélhetünk. Itt pq a nyilvános, p és q pedig a privát kulcsok. Napjaink legelterjedtebb nyilvános kulcsú titkosítása az RSA tulajdonképpen ennek a kidolgozása.

A nyilvános kulcsú titkosítás tehát lehetőséget nyújt arra, hogy előzetes kulcsegyeztetés nélkül kommunikáljunk biztonságosan: Készítsünk egy saját kulcspárt. A nyilvános részét szabadon megoszthatjuk bárkivel - így az interneten is nyugodtan átküldhetjük. Az ezzel a titkosított információ még a feladó számára sem, csak a számunkra lesz visszafejthető.

A leggyakrabban használt nyilvános kulcsú titkosítási eljárás az RSA, de egyre elterjedtebb a nála fiatalabb ECDHE is. Érdekesség hogy az elsőként felfedezett Diffie-Hellman algoritmus, az itt bemutatott nyilvános kulcsú kriptográfiában sosem terjedt el, más alkalmazásában kulcscserére viszont széles körben használják.

Hibrid titkosítás


A nyilvános kulcsú titkosítási algoritmusok amilyen univerzálisak, legalább annyira törékenyek is. Az algoritmusban nem biztos hogy bármilyen szám használható üzenetként, vagy éppen az is lehet hogy egy-egy konkrét üzenetre sokkal könnyebb visszafelé elvégezni az algoritmust mint egyébként. Van olyan algoritmus – DSA (Digital Signature Algorithm) – aminek ha nem biztosítunk megfelelő entrópiát, egyetlen üzenet felfedheti a privát kulcsot. Egy másik algoritmusnál pedig – RSA – ha túl sok különböző címzettnek küldjük el ugyan azt, akkor visszafejthetővé válik az üzenetünk. Ha túl kicsi szám reprezentálja az üzenetünket, ugyanez az algoritmus „elfelejti” titkosítani. Végső problémaként a nyilvános kulcsú algoritmusok lényegesen lassabbak is a szimmetrikus eljárásoknál.

Hogy ezeket a problémákat elkerüljük, az üzenetet az algoritmusnak megfelelő biztonságos alakra hozzuk – kipárnázzuk (padding, pl.: OAEP) – mielőtt átadjuk a titkosítási algoritmusnak. Ezen kívül a gyakorlatban minél kevesebb adatra használnak nyilvános kulcsú kriptográfiát.

Válasszunk egy robusztus, szimmetrikus titkosítót és hozzá egy véletlenszerű kulcsot. Titkosítsuk ezzel a hosszú, elküldeni kívánt üzenetet. Majd vegyük az előbbi kulcsot, és titkosítsuk le ezt valamilyen nyilvános kulcsú algoritmussal a címzettnek. Amellett hogy így a nyilvános eljárással csak egyetlen rövid blokkot titkosítunk, ez a blokk ráadásul egy titkosításhoz ideális véletlen szám. Ha a két kódolt üzenetet együtt juttatjuk el a címzetthez, akkor annak ellenére nincs szükség kulcsegyeztetésre hogy a valós adatot szimmetrikus eljárással titkosítottuk. Ezt a taktikát nevezzük hibrid titkosításnak, és a nyilvános kulcsú titkosítások szinte minden felhasználásánál ezzel találkozhatunk. Az egyik legelterjedtebb párosítás az RSA+AES.
Nem feltétlenül szükséges minden üzenethez külön nyilvános kulcsot egyeztetnünk. A titkosított weboldalak letöltése során például a webböngésző először – csatlakozáskor – generál egy véletlen kulcsot, amit elküld a szervernek a szerver nyilvános kulcsa segítségével, ezentúl pedig a szerver és a böngésző egyaránt ezt a véletlen kulcsot használja szimmetrikus titkosítással minden üzenethez, egészen addig amíg a kommunikáció be nem fejeződik.

A digitális aláírás


A nyilvános kulcsú titkosításoknak van egy másik speciális felhasználása is. Ha az eljárásokat fordított sorrendben használjuk, bizonyítani tudjuk hogy egy üzenet tőlünk származik vagy legalábbis mi magunk is jóváhagytuk. Természetesen a privát kulcs ilyenkor sem kerülhet nyilvánosságra!

Ne felejtsük hogy a privát kulcsból általában egyértelműen következik a nyilvános, a privát kulcs kiszivárgása mindig a teljes kompromittálódást jelenti.

Ha egy üzenetet a privát kulcsunkkal „titkosítunk” abból egy olyan üzenet lesz, amit a nyilvános kulcsunkkal bárki megfejthet. Az üzenet maga tehát nem titkos, viszont az, hogy a nyilvános kulccsal visszafejthető, garantálja hogy az üzenet a privát kulcs segítségével készült – tehát csakis a privát kulcs birtokosa készíthette. Ez pedig a digitális aláírás lényege.
M = E(D(M,K),P)

A figyelmes olvasó persze észrevehette, hogy ebben az alkalmazásban máris felrúgtuk az előző fejezetben tárgyalt, a lehető legkevesebb adatot titkosítsunk nyilvános kulcsú eljárással szabályt. A gyakorlatban éppen ezért nem az egész üzenetet „titkosítjuk”, hanem csak az üzenet ujjlenyomatát. Ezt a „titkosított” ujjlenyomatot nevezzük digitális aláírásnak. A fogadónak az üzenetet eredeti formában küldjük el és mellékeljük az aláírást. Így az ujjlenyomat kiszámítása után az aláírás dekódolásával tudja a címzett ellenőrizni az üzenet eredetiségét.
Jelölések:
M = üzenet (message)
h = az üzenet ujjlenyomata (hash)
S = digitális aláírás
P = nyilvános kulcs (pubkey)
K = privát kulcs (key)

Eljárás a feladó oldalán:
h = H(M)
S = D(h,K)

Eljárás a fogadó oldalán:
h0 = H(M)
h1 = E(S,P)
HA h0 = h1, CSAK AKKOR EREDETI

Az eddig bemutatott kriptográfiai eljárások garantálják hogy az aláírás (S) nem hamisítható, de mit kell elvárni a hash függvénytől (H) hogy az ujjlenyomat használható legyen az üzenet helyett? Mivel az ujjlenyomatok egyezése alapján feltételezzük az üzenetek egyezését, tulajdonképpen ez maga az elvárásunk: Ha két üzenet különbözik, az ujjlenyomatuknak is különböznie kell.

Az ujjlenyomat (hash) függvények


Ha egy kicsit jobban belegondolunk, a korábbiakban a hash függvények elé lehetetlen elvárást támasztottunk. Végtelen sok, tetszőlegesen hosszú üzenet létezhet, a hash függvénytől pedig rövid kimenetet várunk el, ezáltal véges sok lehetőség közé szorítva. Mivel végtelen sok esetnek feleltetünk meg véges sokat, biztosan lesz olyan – elméletben létező – két üzenet, amiknek azonos az ujjlenyomata. A megoldás kulcsát itt is az jelenti, hogy mennyi időre van szükség két azonos ujjlenyomattal rendelkező üzenet megtalálására.

Egy ideális n bit kimenetű hash függvény a következőképpen működne:

  • Csapóajtófüggvény, vagyis egy ujjlenyomathoz nagyon nehéz (~ 2n-1 ) egy üzenetet találni. (preimage ellenálló)

  • Egy adott üzenetből nem számítható ki egy másik, azonos ujjlenyomatú üzenet, vagyis nagyon nehéz (~ 2n-1 ) ilyen üzenetet találni. (2nd preimage ellenálló)

  • Nem lehet azonos ujjlenyomatú üzeneteket generálni, vagyis nagyon nehéz ( ~ 2n/2 ) két olyan üzenetet találni, amiknek azonos az ujjlenyomata. (ütközés ellenálló)

  • A kapott ujjlenyomatok eloszlása egyenletes, vagyis minden lehetséges ujjlenyomathoz nagyjából ugyanannyi üzenet tartozhat.


Hétköznapi módon megfogalmazva a hash függvényeket arra használhatjuk hogy két adat azonosságát ellenőrizzük, az adatok felhasználása nélkül. Ha két adathalmaz ujjlenyomata megegyezik, nagyon-nagyon kicsi az esélye annak hogy különbözhetnek, illetve egy támadótól nagyon sok időt venne igénybe két ilyen adathalmaz elkészítése.

Az ujjlenyomatokat nem csak a titkosítási eljárásokban használjuk. Gyakran ellenőrizzük velük például letöltések vagy elmentett fájlok sértetlenségét, bizonyos adatbázisokban a hash alapján kereshetőek meg fájlverziók, és a digitális aláírások - előző fejezetben bemutatott - módszere is az ujjlenyomatokra támaszkodik. A legelterjedtebb hash eljárások az SHA függvénycsalád tagjai. Közülük az SHA1 már nem számít igazán biztonságosnak, de az SHA2 függvények (pl. SHA256) napjainkban az egyik legbiztonságosabb hashnek számítanak.

A biztonság mérése


A cikk során sokszor láttuk hogy egy-egy módszer biztonságának alapja hogy valamit nem lehet vagy nagyon nehéz kiszámítani. De mennyire nehéz?

A titkosítási eljárásoknál általában bizonyított az eljárás helyessége - vagyis hogy a számítások elvégzése után valóban a várt eredményt kapjuk - de nem bizonyított az eljárás biztonsága. Ha egy eljáráshoz találnak egy egyszerű függvényként kiszámítható feltörési módszert, az eljárás nyilván teljesen értéktelenné válik. Általában viszont nem ez a helyzet. A lehetséges feltörési módszerek „nehéz” matematikai problémákra vezethetők vissza, vagyis a probléma megfejtéséhez nagyon sok számítást kell elvégezni. A leggyakrabban ez a számításigény lehetséges esetek kipróbálgatását jelenti.

Ha egy probléma megfejtéséhez 2n egyformán lehetséges megoldást kell kipróbálni, akkor az a probléma n bit biztonságot nyújt.

Ha találunk egy módszert, amivel a lehetséges megoldások fele kizárható, akkor ezzel 1 bittel meggyengítettük a problémát, hiszen 2n helyett csak 2n-1 lehetséges esetet kell kipróbálni. Egy titkosítási eljárás biztonságát akkor nevezzük n bitesnek, ha legjobb ismert feltörési módszerrel is legalább 2n lehetséges próbálkozás kell a feltöréséhez.

Hány bit biztonságra van szükségem


Minden titkosított üzenet feltörhető úgy, hogy kipróbálgatom az összes lehetséges kulcsot. A helyes kulcsot eltalálva az üzenetet biztosan meg lehet fejteni az. Ezt a nevezik nyers-erő támadásnak. Egy ideális n bites titkosítás kulcsának 0 és n között bármilyen számot választhatunk. Pl egy modern, 128 bites titkosítást választva ez 340282366920938463463374607431768211456 lehetséges kulcs. Ha nem létezik a nyers-erőnél jobb feltörési mód, akkor ez a titkosítás n bit biztonságot nyújt. Mekkora ez az 128 bit biztonság a gyakorlatban?
Összehasonlításként, 5-ös lottó szelvényből mindössze 43949268 különböző létezik ami azt jelenti hogy egy támadónak kicsivel több mint 7 kvintillió (7×1030) kulccsal kell próbálkoznia ahhoz, hogy ugyan annyi esélye legyen megfejetni az üzenetet, mint egyetlen szelvénnyel megnyerni a lottót.

Minden titkosítás feltörése csak idő kérdése, mennyi idő kell tehát egy 128 bites titkosítás feltöréséhez?

A világ leggyorsabb ma ismert szuperszámítógépe 93 PFLOPS-ra képes, vagyis 93×1015 számítást végez el másodpercenként. Ha egyetlen lépésben képes lenne egy feltörési mód egy esetét kipróbálni és ellenőrizni, akkor átlagosan 2n-1/(93×1015) másodpercre lenne szüksége egy n bit biztonságot nyújtó eljárás feltörésre. Ez egy megszokott 128 bites titkosítás esetén 58 billió évet jelent. Vegyük észre hogy a helyes kulcsméret megválasztása mennyire fontos: Ugyanezen a számítógépen egy 64 bites titkosítás feltörése átlagosan kevesebb mint 2 percet venne igénybe.
Vigyázz! Egy konkrét eljárás feltörésére a nyers-erőnél sokkal gyorsabb módszer is létezhet. Vannak olyan eljárások amik ugyan n bit méretű kulcsot használnak, de jóval kevesebb mint n bitnyi biztonságot nyújtanak.

Persze az hogy egy mai szuperszámítógépen 58 billió év megfejteni egy titkosítást, nem jelenti azt hogy a megfejtéshez ennyi időre lenne szükség. A Moore-törvényre hagyatkozva sokkal kevésbé derülátó számítást kapunk: Ha feltételezzük hogy az elérhető számítási teljesítmény két évente megduplázódik, akkor nagyjából 100 év múlva már csak egyetlen évre van szükség a titkosítás feltöréséhez. Ha pedig most azonnal nekilátnánk a feltörésnek, amit mindig az aktuálisan leggyorsabb gépen végzünk, 80 éven belül végezhetnénk.

Végszó


A kriptográfia tehát – ha elrejtve is – a modern mindennapi élet részét képezi. Az okostelefonos e-mail alkalmazás, HTTPS-en betöltődő weblapok, vagy az NFC-s bankkártyás fizetés mögött egyaránt ezek az algoritmusok garantálják, hogy a rendszerek működésébe jogosulatlan személyek nem tudnak beleavatkozni.

A modern kriptográfia praktikus gyakorlati alkalmazásával foglalkozunk még a Refaktor hasábjain. Addig is minden fejlesztőnek és felhasználónak egyaránt azt javasoljuk, ismerje meg és tartsa észben az általa használt technológiák gyengéit, korlátait.