Episode I
Alice és Bob
9. fejezet
Alice és Bob nyilvános kulcsot használ
A 6., a 7. és a 8. fejezetben egy algoritmuselméleti kitérő keretében eléggé pontosan tisztáztuk, hogy mit értünk "könnyű" illetve "nehéz" algoritmikus feladat alatt. Ezért ebben a fejezetben visszatérünk Alice és Bob fő problémájához, és ott folytatjuk, ahol az 5. fejezetben abbahagytuk. Nevezetesen: ahhoz, hogy biztonságosan tudjanak kommunikálni egymással, Alice-nak és Bob-nak először egy kulcsnak nevezett közös titokban kell megállapodniuk. Ezt neveztük a kulcsmegosztás problémájának. A 20. század végéig tartotta magát az a hittétel, miszerint ez kizárólag biztonságos csatornán keresztül – például személyes találkozó – oldható meg. De vajon mit tehet Alice és Bob, ha ilyen csatorna nem áll rendelkezésükre? Hogyan működik és hogyan támadható a Diffie-Hellmann kulcscsere protokoll? Mi az az aszimmetrikus kulcsú rejtjelezés? Ebben a fejezetben erről lesz szó...
Figyelem! Ennek a fejezetnek a megértéséhez erősen ajánlott elolvasni az 5. fejezetet is.
Az összes eddig vizsgált rejtjelezési eljárás nagyon hasonlóan működött. Alice-nak lényegében egy rejtjelezőt, míg Bob-nak egy dekódolót kellett paramétereznie egy közös kulccsal ahhoz, hogy biztonságosan kommunikálni tudjanak egymással.
Ez a kommunikációs folyamat látható a 9.1. ábrán.
A -val paraméterezett rejtjelező az nyílt szövegből előállítja az kódszöveget, míg a vételi oldalon a szintén -val paraméterezett dekódoló az kódszövegből visszaállítja az nyílt szöveget. A biztonság szempontjából megköveteljük, hogy amennyiben a támadó nem ismeri a kulcsot, akkor számára algoritmikusan nehéz feladat legyen az nyílt szöveget előállítani pusztán az kódszöveg ismeretében. Ezt a felállást szimmetrikus kulcsú titkosításnak nevezzük, mivel Alice ugyanazt a kulcsot használja a rejtjelezéshez, mint amit Bob használ a dekódoláshoz. Ilyenekre a korábbi fejezetekben láttunk pár példát: Caesar-kód, Vigenére-kód, a német Enigma vagy akár az 5. fejezetben bemutatott, ténylegesen feltörhetetlen one-time-pad.
1976-ban azonban megjelent Whitfield Diffie és Martin Hellman Új direktívák a kriptográfiában című írása, amely két forradalmian új ötletet tartalmazott. Egyrészt ez az írás ismerteti az úgynevezett Diffie-Hellman kulcscsere protokollt, amelynek a segítségével Alice és Bob képes megállapodni egy közös kulcsban egy nem biztonságos csatornán keresztül oly módon, hogy az mégis rejtve marad a csatornát lehallgató Eve elől. Másrészt pedig az írásból körvonalazódott az úgynevezett aszimmetrikus kulcsú titkosítás alapgondolata – habár a konkrét eljárást végül nem ők, hanem Ron Rivest, Adi Shamir és Len Adleman fejlesztették ki 1977-ben. Ezt a feltalálók vezetékneveinek kezdőbetűi után RSA-eljárásnak nevezzük, amely napjaink egyik leggyakrabban használt titkosítási eljárása. Ez a rejtjelezésen kívül partner- és üzenethitelesítést is biztosít Alice és Bob számára. Mindkét eljárás működése az úgynevezett egyirányú függvényeken alapszik, ezért először ezzel a fogalommal – és általánosságban a függvény fogalmával – ismerkedünk meg.
9.1Ismét a függvényekről
A 6.2. szakaszban a Turing-gépek kapcsán már felmerült a függvény fogalma. Ott adva volt egy Turing-gép, amely a bemeneti szalagjára írt jelsorozatból a futása során a kimeneti szalagján előállított egy másik jelsorozatot. Azt mondhatjuk tehát, hogy a Turing-gép valamilyen hozzárendelést valósít meg a szimbólumkészletéből alkotható jelsorozatok között. Ezt a hozzárendelést a 6.4. szakaszban a Turing-gép által kiszámított függvénynek neveztük. Az alábbiakban egy ennél általánosabb definíciót adunk a függvény fogalmára.
Általánosságban egy függvény is egy hozzárendelést valósít meg két tetszőleges – nem feltétlenül különböző – halmaz között. Egy halmazt úgy kell elképzelni, mint bizonyos objektumok – például számok – gyűjteményét. Alaphalmaznak nevezzük azt a halmazt, amelyek közül a bemenetek, míg képhalmaznak nevezzük azt a halmazt, amelyek közül a kimenetek kerülhetnek ki. Az alaphalmaz és a képhalmaz lehet különböző, ezt azonban nem követeljük meg. A mostani példánkban jelöljük -val az alaphalmazt, -vel pedig a képhalmazt.
Ekkor egy olyan hozzárendelést, amely az halmaz minden eleméhez legfeljebb egy -beli elemet rendel hozzá, az alaphalmazból a képhalmazba képező függvénynek nevezzük és így jelöljük:
Ha például az alaphalmaz egy olyan eleme, amelyhez az függvény hozzárendel egy -beli elemet, akkor ezt az elemet az képének nevezzük és így jelöljük:
Elképzelhető, hogy az alaphalmaz nem minden elemének van képe, azonban fontos megkötés, hogy minden elemnek legfeljebb egy képe lehet. Az alaphalmaz azon részét, amely a képpel rendelkező elemeket tartalmazza, a függvény értelmezési tartományának nevezzük. Hasonlóan elképzelhető, hogy a képhalmaz nem minden eleme képe az alaphalmaz valamely elemének, itt viszont már nincs megkötés arra vonatkozóan, hogy a képhalmaz egy adott eleme hány alaphalmazbeli elemnek lehet képe. Ha például és az alaphalmaz két különböző eleme, akkor elképzelhető, hogy a képük ugyanaz az elem a képhalmazban, azaz . A képhalmaz azon részét, amely azokat az elemeket tartalmazza, amelyek képei legalább egy alaphalmazbeli elemnek, a függvény értékkészletének nevezzük.
A 9.2. ábrán a most ismertetett fogalmakat szemléltetjük. Itt az függvény alaphalmaza , képhalmaza , értelmezési tartománya , értékkészlete pedig .
A halmazok közötti ilyen jellegű tartalmazási viszonyokra azt mondjuk, hogy a szűkebb halmaz részhalmaza a bővebb halmaznak. Itt például a értelmezési tartomány részhalmaza az alaphalmaznak, mivel minden eleme egyben -nak is eleme. Hasonlóan a értékkészlet is részhalmaza a képhalmaznak, mivel minden eleme egyben -nek is eleme.
Jogosan merülhet fel a kérdés az Olvasóban, hogy mi értelme van az értelmezési tartományon kívül az ennél – adott esetben – bővebb alaphalmazról beszélni, ha a függvény úgyis csak az értelmezési tartományban lévő elemekhez rendel képet? Hasonlóan jogos kérdés, hogy mi értelme van az értékkészleten kívül az ennél – adott esetben – bővebb képhalmazról beszélni, ha a függvény úgyis csak az értékkészletben lévő elemeket rendeli hozzá képként az alaphalmazban lévő elemekhez? Ennek pusztán praktikussági okai vannak, ugyanis sok esetben nehéz pontosan meghatározni akár az értelmezési tartományt, akár az értékkészletet. Ezért célszerűbb olyan alap- és képhalmazt választani, amelyeket könnyen meg tudunk határozni, ugyanakkor nem túl tágak a tényleges értelmezési tartományhoz és értékkészlethez képest.
Hogy ne csak a levegőbe beszéljünk, nézzük is rögtön egy egyszerű példát. Tekintsük például azt a függvényt, amely tetszőleges egész számhoz hozzárendeli mondjuk a -nek az -edik hatványát, azaz a egész számot. Nevezzük ezt a függvényt -nek.
Ekkor az alábbi képlettel írhatjuk le ezt a függvényt:
Látható, hogy ennek a függvénynek a bemenetei és a kimenetei is ugyanabból a halmazból, nevezetesen az egész számok közül kerülnek ki. Az egész számok halmazát konvencionálisan -vel szokták jelölni, ezért a korábbi jelölésekkel ezt írhatjuk:
A fenti függvény különleges abból a szempontból, hogy le lehet írni csak az változótól függő explicit képlettel: . Ez sok esetben nem, vagy csak nehezen tehető meg.
Tekintsük például a híres Fibonacci-függvényt, amely a pozitív egész számokon van értelmezve. Ennek az értéke és esetén , azaz és , minden további -re pedig teljesíti az alábbi, úgynevezett függvényegyenletet:
A Fibonacci-függvény néhány további értékét ennek alapján könnyedén kiszámíthatjuk:
Látható, hogy ez az -re adott kifejezés nem explicit, mivel a függvény két korábbi helyén felvett értékétől függ. Ha például ez alapján az -at szeretnénk kiszámítani, akkor előbb ki kell számítanunk a függvény alatti számokra adott értékeit is.
Érdekességképp megjegyezzük, hogy a Fibonacci-függvény esetén létezik csak -től függő explicit képlet is:
Az Olvasó behelyettesítésekkel könnyen leellenőrizheti ennek a képletnek a helyességét. Az persze más kérdés, hogy hogyan lehet egy ilyen képletre rájönni. Ennek ismertetését a szükséges absztrakt algebrai ismeretek hiányában mellőzzük. Sok olyan fontos függvény van azonban, amelyre ilyen explicit képlet nem is létezik, ezért általánosságban az értelmezési tartomány vagy az értékkészlet meghatározása nem egyszerű feladat.
9.2Egyirányú függvények
Most térjünk vissza az függvényhez, és ennek kapcsán vizsgáljuk meg, hogy mit jelent az egyirányú függvény fogalma. A pontos matematikai definíció helyett egy gyakorlati példán keresztül mutatjuk meg a fogalom lényegét. Tekintsük az függvénynek azt a megszorítását, amely csak az , , , , , , , , és számokra van értelmezve. Ezekre az értékekre algoritmikusan könnyű meghatározni a függvény értékét, hiszen csak hatványozni kell. Az értékek rendre a , , , , , , , , és számok lesznek.
Tegyük fel, hogy ennek a függvénynek a megfordítása a feladat, azaz olyan algoritmust kell készítenünk, amely bemenetként kap egy számot ebből az értékkészletből, és azt kell kiszámítani, hogy ez melyik értéknek a képe az függvény szerint. Nézzük például az egész számot, mint bemenetet. Keressük tehát azt az kitevőt, amelyre -t emelve épp -t kapunk. A szemfülesebb olvasók egyből észreveszik, hogy itt az -nek a 2-es alapú logaritmusának a kiszámításáról van szó, de tegyük most félre ezt a fogalmat és szorítkozzunk a "józan paraszti eszünkre".
Jobban megvizsgálva észrevehetjük, hogy a függvényünk ad bizonyos támpontokat. Nevezetesen értékét növelve (illetve csökkentve) az mennyiség is határozottan növekszik (illetve csökken). Ezt a tulajdonságot okosan kihasználva igen hatékonyan megtalálhatjuk az -höz tartozó értékét megfelelő szisztéma szerinti próbálgatással.
Végezzünk például egy próbát az értelmezési tartomány közepe táján lévő -re. Ebben az esetben . Ez ugyan -nél kisebb, viszont a függvényünk fenti tulajdonsága miatt egyből következik, hogy a keresett csak nagyobb lehet -nél. Azaz a lehetőségek felét kizárhatjuk, és a továbbiakban elegendő értékét a , , , és egész számok között keresnünk. Most végezzünk egy újabb próbát ennek a szűkített számsornak a közepén lévő -ra. Ebben az esetben . Ez még mindig kisebb, mint , azaz a keresett biztos, hogy csak a és számok valamelyike lehet, vagyis újra kizárhattuk a lehetőségek felét. Végül egy utolsó próbával megkapjuk, hogy , azaz a keresett értéke .
Általánosságban bináris keresésnek hívjuk az olyan módszereket, amikor egy véges halmazban kell keresnünk a megoldást, és minden lépésben ki tudjuk zárni a lehetőségek felét. Ez egy rendkívül hatékony algoritmikus módszer, mivel a szükséges lépések száma a halmaz méretének kettes alapú logaritmusával arányos. Ha például a megoldást egy ezermilliárdszor milliárdszor milliárd nagyságú halmazban kell is keresnünk, a szükséges lépések száma akkor is nagyságrendileg mindössze körül van. Többek között ezért tudunk megtalálni hamar egy keresett szót egy szótárban. Habár nem tudatosul bennünk, de ilyenkor is lényegében egy bináris keresést hajtunk végre a szavak halmazán, csak ebben az esetben a rendezést az ábécé-sorrend határozza meg.
Az olyan függvényeket, amelyek esetén az alaphalmaz elemeinek képe algoritmikusan könnyen kiszámítható, de a képhalmaz tetszőleges eleméhez algoritmikusan nehéz olyan elemet találni az alaphalmazban, amelynek épp ő a képe, egyirányú függvényeknek nevezzük. Az egyirányú függvényeket egy adott irányban nyíló csapóajtóhoz hasonlíthatjuk. Az egyik irányban (az alaphalmazból a képhalmaz irányába) könnyű áthaladni rajta, azonban ha egyszer bezárult mögöttünk az ajtó, akkor nehezen juthatunk vissza rajta a másik irányba (a képhalmazból az alaphalmazba).
A fenti példában szereplő függvény nyilván nem egyirányú függvény, hiszen a megfordítása egy algoritmikusan könnyű bináris keresési feladathoz vezet, azonban egy aprónak tűnő módosítással ezt a megfordítást reménytelenül nehézzé tehetjük egy potenciális támadó számára. Ehhez teszünk egy kis kitérőt az úgynevezett moduláris aritmetika irányába, amelyet most az egyszerűség kedvéért csak óraaritmetikának fogunk nevezni. Az elnevezés mindjárt világossá válik. A 18. fejezetben részletesen ki fogunk térni a moduláris aritmetikára, most azonban az elsődleges cél az alapgondolat megértése.
9.3Számolás az óralapon
Az általános iskolából jól ismert szokásos összeadás és szorzás műveletek a mindkét irányban végtelen számegyenesen vannak értelmezve. Vizsgáljuk meg először, hogy ezen a számegyenesen hogyan adunk össze két számot, például a -at és a -et. Elindulunk az egyik számtól, mondjuk a -tól, és a másik számnak megfelelő számú, azaz jelen esetben lépést teszünk jobbra a számegyenesen. Az összeadás eredménye az a szám lesz, ahová megérkeztünk, ez ugye a . A hagyományos összeadás esetén tehát , mint ahogy az a 9.3. ábrán látható.
Most átértelmezzük egy kicsit az összeadás műveletét. Vágjunk ki a számegyenesből egy -val kezdődő számból álló szakaszt. Az így kapott szakasz két végét képzeletben ragasszuk össze, így egy óra számlapjához hasonló elrendezést kapunk. A különbség pusztán annyi, hogy itt nem -től -ig futnak a számok, hanem -tól -ig. Ez látható a 9.4. ábrán.
Ezen az óralapon egy nagyon hasonló műveletet tudunk definiálni, mint amilyen a hagyományos összeadás volt. Ezt a műveletet modulo összeadásnak nevezzük, vagy általánosságban – egy darab számot tartalmazó óralap esetén – modulo összeadásról beszélünk. Adjuk össze ismét az előző példában szereplő és számokat, de ezúttal a számegyenes helyett ezen az óralapon végezzük a számolást. Induljunk el a -as számtól, és tegyünk meg lépést az óramutató járásával megegyező irányban. Az összeadás eredménye az a szám lesz, ahová megérkeztünk, ami jelen esetben az .
A modulo összeadás esetén tehát a és a összege , amit így jelölünk:
Az óralapon számolva ezt az összeadást a 9.5. ábra szerint végezzük el.
Az összeadáshoz hasonlóan szorzást is értelmezhetünk ebben a furcsa óraaritmetikában. Legyen például a két összeszorzandó szám a és az . Ilyenkor a -ról indulunk, és annyiszor lépünk az egyik tényezőnek megfelelő lépést, mint amennyi a másik tényező. A hagyományos számegyenesen jobbra kell lépkedni, így a -as számhoz jutunk, azaz . Ezzel szemben az óraaritmetikában ismét az óramutató járásával megegyező irányban kell lépkedni, így nem egész két kör megtétele után a -es számhoz jutunk, azaz .
A 9.6. ábrán a szorzás eredményét láthatjuk a hagyományos aritmetikában.
Ugyanez az óraaritmetikában számolva a 9.7. ábrán látható módon néz ki.
Most, hogy van már szorzásunk is, nem lesz nehéz értelmezni a modulo hatványozást sem. Egy szám -edik hatványát – hasonlóan a hagyományos hatványozáshoz – úgy kapjuk meg, hogy veszünk egy olyan darab tényezőből álló szorzatot, amelyben minden tényező . A különbség annyi a hagyományos hatványozáshoz képest, hogy a szorzások elvégzésekor most is az imént bevezetett modulo szorzást alkalmazzuk:
Most vizsgáljuk meg, hogy mi történik a 9.2. szakaszban bevezetett függvénnyel, ha a hagyományos számegyenes helyett a modulo óraaritmetikában értelmezzük azt.
9.4A diszkrét logaritmus fogalma
Az alábbi táblázat első oszlopa az változó, míg a második és harmadik oszlopa az függvény értékét tartalmazza rendre a hagyományos és a modulo hatványozás esetén:
Ha megvizsgáljuk a táblázat harmadik oszlopát, akkor láthatjuk, hogy ez a sorozat – a második oszloppal ellentétben – teljesen véletlenszerűen ugrál össze-vissza a függvény értékkészletét alkotó számokon. Ezúttal nem kapunk semmiféle támpontot a függvény megfordításához.
Ennek érzékeltetéséhez képzeljük most magunkat egy potenciális támadó – például Eve – helyébe. Tegyük fel, hogy a támadási kísérlet során Eve-nek ki kell számítania azt az kitevőt, amely esetén . Ezt a kitevőt a -os szám kettes alapú diszkrét logaritmusának nevezik. Mivel modulo óraaritmetikában számolunk, ezért Eve csak annyit tud, hogy a megoldás az , , , , , , , , , számok közül kerülhet ki.
Eve azt megteheti, hogy elkezdi sorban kipróbálni ezeket a kitevőket, ez azonban reménytelenül sokáig tarthat neki, amennyiben nem egy elemű, hanem egy ennél sokkal nagyobb óralapon kell keresgélnie. Sebaj – gondolja magában Eve –, szerencsére a fentebb már ismertetett bináris keresést épp az ilyen esetekre találták ki.
Eve tehát először tesz egy próbát az értelmezési tartomány közepén lévő értékre. Erre azt kapja, hogy . Az így kapott eredmény nagyobb, mint , ezért Eve a bináris keresés logikáját követve azt a következtetést vonja le, hogy a keresett kitevő biztosan -nél kisebb. Ez azonban hibás feltételezés, hiszen a megoldás ebben az esetben a lenne. A modulo hatványozás tehát nem ad olyan támpontokat, mint a hagyományos, így Eve ezzel a módszerrel nem tudja kizárni minden lépésben a kitevőjelöltek felét.
Sőt, jelenleg nem is ismeretes semmilyen más módszer sem, ami a modulo hatványozás megfordítására lényegesen gyorsabb megoldást szolgáltatna, mint az összes lehetséges kitevőjelölt végigpróbálgatása. Ez viszont egy megfelelően nagy méretű óralap esetén reménytelen feladat elé állítja Eve-et. A modulo hatványozás tehát valóban egy egyirányú függvénynek tűnik, amelyet Alice és Bob kulcsmegosztásra használhatnak. A 8.8. szakaszban a prímfaktorizációról tett megjegyzéshez hasonlóan azonban itt is kénytelenek vagyunk megjegyezni, hogy a diszkrét logaritmus problémájáról sem bizonyított, hogy NP-teljes lenne.
9.5A Diffie-Hellman kulcscsere protokoll
Tegyük fel, hogy Alice és Bob szeretnének megegyezni egy közös kulcsban, amelyet aztán egy valamilyen szimmetrikus kulcsú titkosításhoz fognak használni. Az 5.6. szakaszban már láttuk, hogy az Alice és Bob közötti kommunikáció gyakorlatilag számok küldözgetéséből áll, így a rejtjelező és dekódoló komponensekre nyugodtan tekinthetünk matematikai függvényekként, amelyeket egy kulcsnak nevezett egész számmal paraméterezhetünk. Alice és Bob feladata tehát megegyezni ebben a kulcsban olymódon, hogy arról Eve nehogy tudomást szerezzen. Jelen esetben azonban nem tudnak egymással személyesen találkozni, így a kulcsban való megegyezést egy nembiztonságos csatornán keresztül kell megoldaniuk.
Alice ezért felhívja Bob-ot telefonon, és megállapodnak egy egyirányú függvényben. Legyen ez az egyirányú függvény például a 9.3. szakaszból már ismerős modulo hatványozás:
Miután ezt megbeszélték, mindketten kiválasztanak maguknak egy-egy titkos kitevőt, ezt azonban titokban tartják még egymás előtt is. Tegyük fel, hogy Alice az , míg Bob a titkos kitevőt választja magának. Most mindketten alkalmazzák ezekre a kitevőkre a megbeszélt egyirányú függvényt, és az eredményt elküldik egymásnak. Alice tehát elküldi a -ös számot Bob-nak – mivel –, Bob pedig elküldi a -as számot Alice-nak – mivel .
Végül a kapott számot mindketten a saját titkos kitevőjükre emelik szintén modulo hatványozással. Alice ugye a -as számot kapta Bob-tól, a saját titkos kitevője , ezért ő a értéket fogja kapni végeredményül. Bob ehhez hasonlóan jár el: ő a -ös számot kapta Alice-tól, a saját titkos kitevője , így az általa kiszámított végeredmény a lesz. Láss csodát: mindketten ugyanúgy a -es számot kapták végeredményül. Ez lesz tehát a közös kulcs.
A kulcscsere folyamat a 9.8. ábrán látható. A vízszintes nyilak jelzik azokat az üzeneteket, amelyeket Alice és Bob egymásnak küldenek a folyamat során.
Mielőtt azt a kérdést megválaszolnánk, hogy hogyan kaphatta Alice és Bob is ugyanazt az eredmény, először vizsgáljuk meg, hogy mit lát ebből az egészből Eve. Róla ugye az 5.2. szakaszból már tudjuk, hogy minden olyan üzenetnek ő is a birtokába kerül, amely áthalad a kommunikációs csatornán. Az első ilyen alkalom az, amikor Alice telefonon megbeszéli Bob-bal azt az egyirányú függvényt, amely alapján a kulcscserét végre fogják hajtani. Eve tehát megtudja, hogy Alice és Bob az függvényt fogják használni.
Ezután Eve elfogja az Alice által Bob-nak küldött -ös és a Bob által Alice-nak küldött -as számot, és nyilván szeretné ő is kiszámítani a közös kulcsot. Eve-nek ezen a ponton két választása van: vagy Bob-hoz hasonlóan az vagy pedig Alice-hoz hasonlóan a értéket számítja ki. Mindegy melyiket választja, hiszen mindkettő ugyanazt az eredmény – a kulcsot – adja. A probléma csak annyi, hogy Eve nem ismeri sem az , sem pedig a kitevőt, hiszen ezeket Alice és Bob nem közölte egymással.
Eve mindössze két dolgot tud az és kitevőkről. Egyrészt az Alice által Bob-nak küldött -ös számból tudja, hogy . Másrészt pedig a Bob által Alice-nak küldött -as számból tudja, hogy . Bármelyik kitevőt is szeretné kiszámítani, kénytelen megoldani a 9.4. szakaszban ismertetett diszkrét logaritmus problémáját. Ez azonban jóval nagyobb számok esetén – mint tudjuk – gyakorlatilag lehetetlen feladat a számára még a világ összes számítógépével is. Ezzel szemben Alice-nak és Bob-nak mindössze két modulo hatványozást kell csak elvégeznie, amely – ahogy azt majd a 21.4. szakaszban látni fogjuk – egy algoritmikusan könnyű feladat számukra.
Most vizsgáljuk meg, hogy miből adódik a Diffie-Hellman kulcscsere protokoll helyessége. Bob ugye megkapja Alice-tól a számot, és ezt hatványozza a saját titkos kitevőjével. Azaz végeredményként a kulcsot fogja kapni. Ehhez hasonlóan Alice megkapja Bob-tól a számot, és ezt hatványozza a saját titkos kitevőjével. Azaz végeredményként a kulcsot fogja kapni.
A Diffie-Hellman kulcscsere protokoll ezek után nyilván akkor helyes, ha ez a két szám ugyanaz, vagyis:
Erre a figyelmetlen Olvasó – aki jól megtanulta általános iskolában a hatványozás azonosságait – rögtön rávágná, hogy nyilvánvalóan teljesül. Vigyázzunk azonban, itt ugyanis nem a hagyományos, hanem modulo hatványozás történik. Szerencsére ezek az összefüggések a moduláris aritmetikában is érvényesek, ez azonban korántsem magától értetődő. Ezt majd a 18.4. szakaszban fogjuk igazolni.
9.6A Diffie-Hellman kulcscsere protokoll festékekkel
A fentiek megértéséhez most egy egyszerű analógiát ismertetünk. Ennek ugyan semmi köze nem lesz a kriptográfiához, ám jól szemlélteti az egyirányú függvények működését. Képzeljük el, hogy Alice és Bob most nem számokkal, hanem festékekkel dolgozik. A közös titok, amelyben meg szeretnének egyezni, egy adott színű festékkeverék. Ennek érdekében először megegyeznek egy közös kiinduló színben. Ebben a példában ez legyen mondjuk egy-egy liter fehér festék.
Most mindketten kiválasztanak maguknak egy-egy liter festéket valamilyen titkos színből, és hozzákeverik a náluk lévő fehér festékhez, de nem árulják el még egymásnak sem, hogy mi volt a titkos szín. Ezután az így képződött színkeveréket elküldik egymásnak postán. Bob-hoz kerül tehát Alice, Alice-hoz pedig Bob keveréke. Végül a kapott keverékhez ismét hozzáöntenek mindketten egy-egy liter festéket a saját titkos színükből. Így mindkettejüknél lesz három liter festékkeverék, amelyekben egy-egy liter fehér festék van összekeverve két-két literrel Alice és Bob titkos festékéből. Következésképp a végső festékkeverék mindkettejüknél ugyanolyan színű kell legyen, ez lesz tehát a közös titok. Ez a folyamat látható a 9.9. ábrán.
Vegyük észre, hogy Eve megint hasonló szituációban van, mint a modulo hatványozásra épülő példában. Nevezetesen: hiába ismeri a kiinduló fehér színt, és hiába kukkant bele az egymásnak küldött köztes keverékekbe, ezekkel az információkkal nem tud mihez kezdeni, mivel nem ezek alkotják a kulcsot. Ahhoz, hogy Eve is elő tudja állítani a végső színkeveréket, ismernie kéne Alice és Bob titkos színei közül legalább az egyiket. Ehhez azonban külön kéne választania ezeket a kiinduló fehér színtől, amikor a köztes keverékeket elfogja a kommunikációs csatornán. Ez Eve számára gyakorlatilag lehetetlen feladat, tekintve, hogy a festékkeverés egy egyirányú művelet.
9.7A Diffie-Hellman kulcscsere protokoll támadása
Jelenleg ugyan – mint azt a 9.4. szakaszban már említettük – még nincs bizonyítva a diszkrét logaritmus problémájának NP-teljessége, de tegyük fel, hogy ez valóban egy reménytelen feladat. Ezután jogosan merül fel a kérdés, hogy vajon milyen módszerek állnak egy passzív támadó – például Eve – rendelkezésére ahhoz, hogy sikeres támadást hajtson végre a protokoll ellen, és megszerezze Alice és Bob kulcsát.
A protokoll egy gyenge pontja lehet az, amikor Alice és Bob megállapodnak a használt egyirányú függvény paramétereiben. Egy Diffie-Hellman kulcscsere során használt függvény általános alakja így néz ki:
Itt a paramétert generátorelemnek, az paramétert pedig modulusnak nevezzük. A 9.5. szakaszban ismertetett egyszerű példában Alice és Bob a generátorelemben és az modulusban egyeztek meg. Ám egy valódi kulcscsere esetén ennél jóval nagyobb számokat használunk. Egy tipikus modulus például nagyságrendileg kétszáz számjegyből áll.
Előfordulhat, hogy bizonyos szerencsétlenül megválasztott generátorelem és modulus esetén Eve-nek lényegesen könnyebb dolga van egy ilyen függvény megfordításával még akkor is, ha nagy számokat használnak. Azonban eléggé jól ismerjük azokat a számelméleti kritériumokat, amelyeket e paramétereknek teljesíteniük kell a megfelelő biztonság érdekében. Ezekről a 26.6. szakaszban lesz szó, most azonban nyugodtan feltételezhetjük, hogy Alice és Bob ilyen értelemben megfelelő körültekintéssel választja meg a használt paramétereket.
Ilyen feltételezések mellett kimondhatjuk, hogy a Diffie-Hellman protokoll egy passzív támadó – például Eve – számára gyakorlatilag feltörhetetlen. Sajnos azonban egy aktív támadó – például a csaló Mallory – könnyedén ki tud csalni titkos információkat Alice-tól és Bob-tól egy úgynevezett közbeékelődéses támadás (man-in-the-middle attack) segítségével.
Mallory ezt úgy tudja elérni, hogy Alice és Bob közé ékelődik a kommunikációs folyamat során, és elhiteti velük, hogy egymással folytatják le a kulcscsere folyamatot. Valójában azonban Alice és Bob is Mallory-vel kommunikál közvetlenül, nem pedig egymással.
Mallory ezt úgy tudja elérni, hogy Alice és Bob közé ékelődik a kommunikációs folyamat során, és elhiteti velük, hogy egymással folytatják le a kulcscsere folyamatot. Valójában azonban Alice és Bob is Mallory-vel kommunikál közvetlenül, nem pedig egymással. Ennek a támadásnak a folyamatát a 9.10. ábra mutatja.
Itt Alice kulcscserét kezdeményez Bob-bal, ez a kezdeményezés azonban nem jut el Bob-hoz, mivel Mallory eltéríti az üzenetet. Bob helyett tehát Mallory folytatja le a kulcscserét Alice-szal, méghozzá Bob-nak kiadva magát. Így Alice azt hiszi, hogy Bob-bal állapodott meg a közös kulcsban. Mallory ezzel párhuzamosan Bob-bal is kezdeményez egy kulcscserét, amikoris Alice-nak adja ki magát. Így Bob azt hiszi, hogy Alice-szal állapodott meg a közös kulcsban.
A kulcscserét követően tehát Alice és Bob valójában Mallory-n keresztül kommunikál egymással, aki gond nélkül dekódolni tudja Alice üzeneteit a kulccsal, ezáltal birtokába jut a bizalmas információknak, majd a kulccsal titkosítva továbbítja azokat Bob-nak. Visszafele: a Bob-tól érkező üzeneteket dekódolja a kulccsal, majd a kulccsal titkosítva továbbítja Alice-nak. Ráadásul mindez teljesen rejtve marad Alice és Bob számára, akik azt hiszik, hogy közvetlenül egymással kommunikálnak.
Ez igen pofátlan dolog, nemde? A kérdés tehát az, hogy Alice hogyan tudja igazolni Bob-nak, hogy ő valóban Alice, és viszont? Erre a következő fejezetben fogjuk megadni a választ, amelyhez most felvázoljuk egy olyan rejtjelező rendszer alapjait, amely ezt lehetővé teszi.
9.8Aszimmetrikus kulcsú rejtjelezés
Ennek a fejezetnek az elején felvázoltuk az eddig ismertetett rejtjelezők közös működési modelljét, amelyet szimmetrikus kulcsú rejtjelezésnek neveztünk. Ebben az esetben Bob ugyanazt a kulcsot használja a dekódoláshoz, mint amit Alice használ a rejtjelezéshez. Diffie és Hellman fentebb már említett forradalmi írásában azonban az úgynevezett aszimmetrikus kulcsú rejtjelezés merőben új alapgondolata körvonalazódott.
Az 5.7. szakaszban a háromutas kulcsforgalom kapcsán már éltünk egy olyan analógiával, amely ládákat, lakatokat és kulcsokat használt a rejtjelezés szemléltetésére. Ezzel az analógiával élve a szimmetrikus kulcsú rejtjelezés úgy fogható fel, hogy Alice a Bob-nak szánt üzenetet beteszi egy ládába, amelyet lezár egy lakattal. Bob csak akkor tudja kinyitni a ládát, ha neki is van egy másolata a lakatot nyitó kulcsról. A problémát itt az okozza, hogy hogyan tudjuk eljuttatni a kulcsmásolatokat a kommunikáló felekhez biztonságosan.
Az aszimmetrikus kulcsú rejtjelezés egy egészen más gondolatra épül. A kulcsos, lakatos analógiával élve ez kicsit olyan, mintha nem a kulcsról, hanem a lakatról készítenénk másolatokat. Képzeljük el, hogy Bob szeretné, ha bárki tudna neki titkos üzenetet küldeni. Ennek érdekében Bob a saját lakatját minél több példányban publikusan elérhetővé teszi bárki számára. A trükk abban van, hogy a Bob-féle lakatokat mindössze egyetlen kulcs nyitja, amely végig ott lapul Bob zsebében.
Tegyük fel, hogy Alice szeretne Bob-nak egy titkos üzenetet küldeni. Elmegy hát a postára, kér egy Bob-féle lakatot, az üzenetet beleteszi egy ládába, amelyet lezár ezzel a lakattal. Ezt könnyedén megteheti, hiszen a lakatot csak rá kell pattintani a ládára. Innentől kezdve azonban kizárólag Bob fogja tudni kinyitni ezt a lakatot, hiszen csak ő rendelkezik az ehhez szükséges egyetlen kulccsal. Olyannyira, hogy a láda lezárása után még maga Alice sem tudja többé kinyitni azt.
A lakatokat félretéve itt tehát arról van szó, hogy egy üzenet dekódolásához szükség van egy plusz információra ahhoz képest, mint ami a rejtjelezéséhez kell. A dekódoláshoz szükséges plusz információt privát (titkos) kulcsnak, míg a rejtjelezéshez szükséges információt publikus (nyilvános) kulcsnak nevezzük. A rendszerben lévő valamennyi résztvevőhöz tehát nem egy kulcs, hanem egy kulcspár tartozik. E kulcspár privát részét csak az adott résztvevő ismeri, és azt soha nem adja ki a kezéből. Ezzel szemben a kulcspár publikus része bárki számára elérhető egy nyilvános kulcstárban egy telefonkönyvhöz hasonlóan.
Tegyük fel, hogy Alice szeretne Bob-nak elküldeni egy üzenetet. Ehhez előkeresi a nyilvános kulcstárból Bob publikus kulcsát, és ezzel paraméterezi az rejtjelező függvényt. Ily módon előáll az kódszöveg, amelyet elküld Bob-nak. Ezt az üzenetet kizárólag Bob tudja visszafejteni, mivel a publikus kulcshoz tartozó privát kulcsot csak ő ismeri. Bob tehát a privát kulccsal paraméterezve a dekódoló függvényt könnyedén vissza tudja állítani az eredeti üzenetet. A támadó azonban csak a publikus kulcsot ismeri, ez azonban nem elegendő információ a dekódoláshoz.
Tegyük fel, hogy Alice szeretne Bob-nak elküldeni egy üzenetet. Ehhez előkeresi a nyilvános kulcstárból Bob publikus kulcsát, és ezzel paraméterezi az rejtjelező függvényt. Ily módon előáll az kódszöveg, amelyet elküld Bob-nak. Ezt az üzenetet kizárólag Bob tudja visszafejteni, mivel a publikus kulcshoz tartozó privát kulcsot csak ő ismeri. Bob tehát a privát kulccsal paraméterezve a dekódoló függvényt könnyedén vissza tudja állítani az eredeti üzenetet. A támadó azonban csak a publikus kulcsot ismeri, ez azonban nem elegendő információ a dekódoláshoz. Ez a folyamat látható a 9.11. ábrán.
Ez az alapgondolat forradalmat indított el a kriptográfiában, megindult ugyanis a versenyfutás a dicsőségért, amely a fentieknek megfelelő és függvények elsőként való megtalálásáért járt. A dicsőség Ron Rivestnek, Adi Shamirnak, és Len Adlemannak jutott, akik 1977-ben publikálták az úgynevezett RSA-algoritmust, amely alapjaiban változtatta meg világunkat.
Ebben a fejezetben tehát megismerkedtünk a modern kriptográfia két alapvető felfedezésével. Az első a Diffie-Hellman kulcscsere protokoll volt, amely lehetővé teszi, hogy Alice és Bob a pofátlan Eve szeme láttára állapodjanak meg egy közös titkos kulcsban, teljes biztonságban. Láttuk azonban, hogy egy aktív támadó könnyedén kijátszhatja ezt a rendszert, hacsak nem tudjuk kibővíteni a protokollt valamilyen partnerhitelesítéssel. Ezért megismerkedtünk az úgynevezett aszimmetrikus kulcsú rejtjelezés alapgondolatával. A következő fejezetben erre építkezve bemutatjuk a digitális aláírás és partnerhitelesítés működésének alapjait, majd a 11. fejezettől kezdve elkezdünk megismerkedni az RSA-algoritmus számelméleti hátterével.