8. fejezet - Kriptográfiai alapismeretek

Ma az adatfeldolgozás döntően számítógépeken, megfelelően tervezett és kódolt programokkal történik. Az adatokat jogi vagy ügyviteli eszközökkel a feldolgozás folyamatában résztvevő emberekkel szemben lehet védeni. A számítógépnek ezek az előírások semmit sem jelentenek mindaddig, amíg nem fogalmazzuk meg számukra érthető nyelven. Ez a nyelv algoritmusokból és protokollokból áll, amelyeket program formájában teszünk érthetővé a számítógépekkel. Az adatvédelem „számítógépbarát” elemeit algoritmikus adatvédelemnek nevezzük.

Ezek alapját olyan matematikai módszerek képezik, amelyek lehetővé teszik adatok bizalmas tárolását és továbbítását. Korábban már rámutattunk, hogy adatvédelmi szempontból a tárolás is információtovábbítást jelent csak nem térben, azaz például Debrecenből Budapestre, hanem időben, azaz máról holnapra vagy egy évvel későbbre. Természetesen a tárolással kapcsolatban felmerülnek olyan problémák, amelyek a továbbításnál nem fontosak. Ilyen speciális igény információk hosszú időtartamú tárolása, azaz archiválása. Másrészt, a továbbításnál általában lényeges a kommunikáció sebessége, ami tárolás esetén általában nem kiemelt igény.

Elfogadva tehát, hogy a tárolás és továbbítás adatvédelmi szempontból egységesen kezelhetőek, azt vizsgáljuk meg, hogy miért van szükség bizalmas adattovábbításra. A jegyzet korábbi fejezeteiben sokat foglalkoztunk az azonosítással. A 6.3 fejezetben magyaráztuk meg részletesen, hogy amikor egy számítógépbe vagy egy alkalmazásban be akarunk lépni, akkor azonosítani kell magunkat, azaz be kell bizonyítani a számítógépnek, hogy ismerjük a felhasználói nevünkhöz tartozó jelszót. A belépés általában nem a számítógéppel összekötött terminálon történik, hanem egy nyilvános hálózaton keresztül. Ha a jelszót eredeti formájában küldjük át a hálózaton, akkor ahhoz illetéktelenek könnyen hozzáférhetnek és kaméleont játszva, a nevünkben léphetnek be a számítógépbe, hozzáférve ezzel minden hozzánk rendelt erőforráshoz és információhoz. A jelszót tehát úgy kell kódolni a nyilvános hálózaton történő küldés előtt, hogy azt illetéktelen ne tudja dekódolni.

Amikor egy vállalat vezető tisztviselője távoli terminálról, otthonról, szállodai szobából vagy a gépkocsijából bejelentkezik a vezetői információs rendszerbe, akkor nem kívánatos, hogy a forgalmazott adatok kódolás nélkül utazzanak a nyilvános hálózaton. Azt sem szeretnénk, ha banki tranzakcióink tartalma a hálózaton bárki számára olvasható legyen. Hasonló példákat hosszan lehetne sorolni, de ennyinek is elegendőnek kell lenni a bizalmas üzenettovábbítás fontossága alátámasztására. Bizalmas üzenettovábbításhoz olyan kódolással érhető el, amikor a kódolt üzenetet csak az arra illetékesek tudják dekódolni. Az ilyen kódolást titkosításnak nevezzük.

A 4.2 fejezetben foglalkoztunk az elektronikus aláírással, amelynek az információs társadalomban betöltött kiemelt szerepét mutatja, hogy szinte minden ország törvényben szabályozza az alkalmazását. Nem nyilvánvaló, de később meg fogjuk mutatni, hogy a digitális aláírás is titkosítási eljáráson alapul.

A kriptográfiai szakirodalom elsősorban angolul érhető el, ezért a magyar kifejezéseknek, azok első előfordulásakor megadjuk az angol megfelelőjét is.

8.1. Alapfogalmak

A bizalmas üzenettovábbítás elvének bemutatására tökéletesen alkalmazható Claude Shannon (1916 – 2001) amerikai matematikus modellje, amelyet a 8.1 ábrán jelenítünk meg. A modell három szereplője: az Adó, aki bizalmas üzenetet akar küldeni a Nyelőnek és végül a Figyelő, aki az üzenetet minden rendelkezésére álló eszközzel meg akarja szerezni. Az üzenetet szokás nyílt szövegnek (plain text) is nevezni. A Figyelő elsősorban a csatornán férhet hozzá az üzenethez, de egyéb fontos információkat is szerezhet az Adó és a Nyelő oldalán is. A Figyelő dolgát megnehezítendő, az Adó az üzenetet nem az eredeti formájában küldi át a csatornán, hanem egy titkosító eljárásnak (encryption) veti alá. A csatornán tehát már nem a nyílt szöveg, hanem annak kódolt változata a titkos üzenet (ciphertext) megy át. Közvetlenül a Nyelő sem tud mit kezdeni a titkos üzenettel, de ismerve a megfejtő, dekódoló eljárást (decryption) vissza tudja állítani az eredeti szöveget és értelmezni tudja azt.

Bizonyos alkalmazásoknál a modellből hiányozhat a dekódoló egység, illetve a kódoló átkerülhet a nyelő oldalára. Ilyen példákkal találkoztunk a 6.3 fejezet jelszavas azonosításról szóló részében, illetve látni fogunk a digitális aláírásnál is (hash függvény).

8.1 ábra

Jelöljük a lehetséges üzenetek halmazát P-vel, a titkosított üzenetek halmazát pedig C-vel. Ekkor a titkosító eljárás egy E: P --> C, visszafejtés pedig egy D: C --> P leképezés. Bizonyos esetekben a titkosító és a visszafejtő eljárás nemcsak a nyílt üzenettől, hanem egy további paramétertől, kulcstól (key) is függ. Ha a lehetséges kulcsok halmazát K-val jelöljük, akkor a titkosító, illetve visszafejtő leképezések definíciója a következőképpen alakul: E: P x K --> C, D: C x K --> P, ahol most x halmazok direkt szorzatát jelöli.

A titkosítás klasszikus alkalmazásainál arra törekedtek, hogy a kódoló eljárás és a kulcs is titokban maradjon. Ekkor persze az adónak és vevőnek a kommunikáció megkezdése előtt meg kell állapodnia a titkosító módszerben és a kulcsban. Ez nagyon lecsökkenti a potenciális partnerek számát. A következő fejezetben ismertetünk ilyen példát. Internetes világunkban ez az út nem járható. Ha például az APEH minden adózó állampolgárral más-más titkosító algoritmussal kommunikálna, akkor néhány millió, jól tesztelt eljárást kellene alkalmaznia, ami sem anyagi sem technikai szempontból nem realizálható. A kriptográfiában ma a titkosító és visszafejtő függvényt ismertnek, sőt szabványosnak tételezzük fel, így a titkosítás minősége a kulcstól függ. A szabványosítás nagyon fontos követelmény. Gondoljuk tovább az előbbi APEH-es példát. Napjainkban néhány százezer adóalany nyújt be elektronikus úton adóbevallást. Ezeket egy kulcscsere után, DES-el kódolva juttatják el az APEH szerverének. Az adózók számítógépei sokféle operációs rendszert használhatnak, és sokféle alkalmazással végezhetik az adóbevallás kódolását. Ha ezek valamelyike nem a szabványos DES kódolást végezné, akkor az APEH-es szerver nem tudná helyesen dekódolni az adatokat.

A továbbiakban azt vizsgáljuk, hogy az E és D függvényeknek milyen tulajdonsággal kell rendelkeznie, hogy alkalmasak legyenek titkosításra. Mint fentebb megállapítottuk a titkos üzenetnek olyannak kell lenni, hogy a Figyelő csak nagyon nehezen tudja azt megfejteni. Ez annyit jelent, hogy tetszőleges u üzenetre és k kulcsra, ha m = E(u,k), akkor a Figyelő E és m ismeretében nagyon nehezen tudja u-t, esetleg k-t is meghatározni. A Figyelő közvetlen célja a bizalmas üzenet kiderítése, de ha az alkalmazott kulcsot is megismeri, akkor más üzeneteket is dekódolhat, illetve megszemélyesítheti az Adót. Az eléggé homályos „nagyon nehéz” heurisztikusan annyit jelent, hogy a meghatározás igen nagy számítási erőt feltételezve, az ismert módszerekkel néhány száz évig is eltarthat.

Egy titkosító függvény csak akkor használható a gyakorlatban, ha a kódolást gyorsan el tudja végezni. Olyan eljárást, amely néhány kilobájtnyi adatot percekig kódol, nyugodtan el lehet felejteni.

A követelményrendszer heurisztikus ismertetését a dekódoló függvény elemzésével tesszük teljessé. Mint említettük néhány fontos alkalmazásnál erre a függvényre nincs is szükség. A dekódolás azt jelenti, hogy vissza akarjuk állítani az eredeti üzenetet. Ehhez persze egy dekódoló kulcs is kell. A D függvénynek tehát olyannak kell lennie, hogy minden kt titkosító kulcshoz legyen egy kd visszafejtő kulcs úgy, hogy minden u üzenetre D(E(u,kt),kd) = u.

Szavakban kifejezve az előző egyenlőség annyit jelent, hogy ha az u üzenetet a kt kulccsal titkosítjuk, majd a titkos üzenetet a kd visszafejtő kulccsal dekódoljuk, akkor visszakapjuk az eredeti üzenetet.

Két bekezdéssel korábban, az E-vel kapcsolatban megfogalmaztuk, hogy „a Figyelő E és m ismeretében nagyon nehezen tudja u-t, esetleg k-t is meghatározni”, amit most kiegészítünk a következőre: a Figyelő E, m és D ismeretében nagyon nehezen tudja u-t, esetleg kt -t is meghatározni. Végezetül a kd ismeretében a dekódolásnak is gyorsnak kell lenni.

Pontosabb definícióhoz először a modellünkben szereplő halmazokat kell precízebben meghatározni. Vegyük észre, hogy a gyakorlatban a P, C és K halmazok véges hosszúságú bináris szavakból állnak, így maguk is véges halmazok. Az E illetve D függvényeket könnyű kiszámítani, ha maximális bonyolultságuk kis kitevőjű polinommal becsülhető. A legjobb, ha a kitevő egy, azaz a kiszámítás bonyolultsága lineáris. Ha E bonyolultsága polinomiális, akkor persze m hossza is becsülhető u és kt összhossza polinomiális függvényével. Ugyanennek kell teljesülnie kd -re is, mert különben a visszafejtés kd ismeretében sem lehet gyors. A Figyelő tehát exponenciális időben mindig vissza tudja fejteni az eredeti üzenetet. A jó kriptográfiai függvény tehát olyan, amelyre a dekódolás egyetlen inputra sem történhet meg exponenciálisnál lényegesen gyorsabban. A fentiekben leírt E függvényeket szokás egyirányú függvénynek (one way function) nevezni. Azokat az egyirányú függvényeket pedig, amelyeknek van a fentiekben leírt dekódoló D párja, egyirányú csapóajtó függvénynek (one way trapdor function) nevezzük.

Digitális információk kódolása kétféleképpen történhet: vagy az egész üzenetet egyszerre kódoljuk, amit folyamkódolásnak (stream cipher) nevezünk, vagy pedig az üzenetet feldaraboljuk, a darabokat külön-külön kódoljuk és az eredményt a nyelő oldalán ismét összefűzzük. Az utóbbit blokk kódolásnak (block coding) nevezzük.

Folyamkódolásra példa a Vernam titkosítás. A digitális u üzenetet a {0,1} abc feletti szónak tekintjük. Ezután generálunk az u-val egyforma hosszúságú véletlen és egyenletes eloszlású k bitsorozatot. Végezetül az u és v bitjeire bitenként a kizáró vagy műveletet alkalmazva nyerjük az m titkosított üzenetet. A dekódoláshoz a nyelőnek ismernie kell a v kulcsot. Ekkor az m és a v bitjeire ismét bitenként alkalmazza a kizáró vagy műveletet és visszanyeri u-t. A dekódolás korrekt, hiszen a kizáró vagy művelete tetszőleges a, b bitre rendelkezik az (a ???1 b) ???1 b = a tulajdonsággal.

A Vernam titkosítás a lehető legbiztonságosabb, ha a v-t minden üzenetre egyedileg állítjuk elő, valamint bitjei egyenletes eloszlásúan és véletlenek. Nagy problémát jelent viszont, hogy nemcsak a titkosított üzenetet, hanem az egyedi dekódoló kulcsot is el kell juttatni a nyelőnek. Ez az üzenet hosszának megduplázását jelenti, ami gazdaságtalanná teszi az eljárást. A biztonságosság mellett a Vernam titkosítás jó tulajdonsága az is, hogy rendkívül egyszerű és gyorsan implementálható. A bitenkénti kizáró vagy műveletet ezért a modern titkosítási eljárásokban gyakran alkalmazzák.

Mint fentebb írtuk a blokk titkosítás során az üzenetet feldaraboljuk és az egyes darabokra külön-külön alkalmazzuk a titkosítási eljárást. A blokkok hossza lehet fix vagy változó. Titkosításra szinte csak a fix blokkhosszú változatot alkalmazzák. Hosszabb üzenetek továbbítására három módszer áll rendelkezésünkre, amelyeket a 8.2 – 8.4 ábrákon mutatunk be. Az üzenetblokkokat, melyeknek hossza n, uj -vel, a titkosított blokkokat cj -vel jelöljük.

A legegyszerűbb az ECB (Electronic Codebook) módszer, amely a 8.2 ábrán található. Ennél az üzeneteket egymás után titkosítva közvetlenül küldjük a nyelőnek. Adott kódoló eljárás mellett nyilván ez a legegyszerűbb és leggyorsabb továbbítási módszer. A csatorna azonban általában zajos, különböző hibát véthet az átvitel során. Ha a hiba olyan természetű, hogy néhány bittel lerövidíti vagy meghosszabbítja az átvitt blokkot, akkor vagy a következő blokkból kerül át néhány bit a megelőzőbe, illetve a következő blokk néhány bitje kerül át az előzőbe. A dekódolóra tehát nem cj , hanem egy ettől picit különböző blokk érkezik és ezért a dekódolás hibás eredményt ad. Egy ilyen hiba nemcsak azt a blokkot érinti, amelynél jelentkezett, hanem minden további blokkot is, így az üzenet jelentős része használhatatlanná válik. Hosszabb üzenetek átvitelére tehát nem javasolt.

8.2 ábra

Az ECB hibáját küszöböli ki a CCB (Cipher-block Chaining) módszer, amely a 8.3 ábrán látható. A módszer lényege, hogy a kódolt blokk egyrészt átkerül a nyelő oldalára, de vissza is csatoljuk a következő blokk kódolásához. Ilyenkor tehát a következő üzenetblokkot először bitenként xor-ozzuk az előző titkosított blokkal és az eredményre alkalmazzuk a kódoló eljárást. Persze a visszacsatolást a nyelő oldalán is el kell végezni. Az első üzenet blokk kódolásakor még nincs mit visszacsatolni, ezért szükség van egy IV-vel jelölt kezdőblokkra, amelyet persze a nyelő oldalán is hozzá kell adni az első titkosított blokkhoz.

8.3 ábra

A CCB módszer kiküszöböli az ECB hiányosságát, mert egy esetleges hiba csak az érintett blokk korrekt dekódolását teszi lehetetlenné. Ennek ára az, hogy a következő blokk feldolgozásához csak akkor lehet hozzákezdeni, ha az előző visszacsatolása megtörtént. Amennyiben a blokkhossz nagy, ami például az aszimmetrikus titkosításnál általános, akkor ez komoly késleltetéshez vezet.

A 8.4 ábrán bemutatott CFB módszer kompromisszumot jelent a visszacsatolás adta átviteli biztonság és a késleltetés miatti hátrány között. Az üzenetblokk hossza most r, de a kódoló ettől hosszabb, n > r bites blokkokat titkosít. A titkosított információ első r bitjét maszkoljuk az aktuális üzenetblokkhoz. Ha az r lényegesen kisebb, mint n, akkor a késleltetést lényegesen lehet csökkenteni. A CCB módszerhez hasonlóan most is szükség van egy inicializáló blokkra.

8.4 ábra