Episode I
Alice és Bob
23. fejezet
Alice és Bob prímszámok után nyomoz
Az előző fejezetben igazoltuk, hogy az RSA rejtjelezési eljárás valóban minden esetben helyesen működik. Ezt alapvetően két fontos számelméleti összefüggés biztosította számunkra. Az első a kis Fermat-tétel, amely a 20.7. szakaszban ismertetett Euler-Fermat tétel következménye a prímekre nézve. A másik összefüggés pedig a 22.3. szakaszban szereplő kínai maradéktétel, amely az úgynevezett kongruenciarendszerek megoldhatóságával, illetve a megoldások számával volt kapcsolatos. Végül egyrészt ennek következményeként egy – egyébként a számelmélet más területein is – rendkívül fontos gyűrűizomorfizmussal, másrészt a kis Fermat-tétel egy egyszerű következményével ismerkedtünk meg, amelyek együtt lehetővé teszik a kommunikáló felek számára az RSA dekódolás felgyorsítását.
De vajon hogyan képes Alice és Bob az RSA kulcsgeneráláshoz szükséges többszázjegyű prímszámokat találni? Hogyan tudják ezt megtenni anélkül, hogy az idők végezetéig osztáspróbákat kellene végezniük? Mik azok a prímtesztek, és pontosan hogyan működnek? Mely számokat nevezzük univerzális álprímeknek, és hogyan tudunk megszabadulni tőlük? Ebben a fejezetben erről lesz szó...
Figyelem! Ez a fejezet erőteljesen épít a 16., 20. és 22. fejezetekben felépített alábbi definíciókra, valamint a hozzájuk kapcsolódó tételekre:
Ezek kontextusba helyezése miatt erőteljesen ajánlott elolvasni a 16., 20. és 22. fejezeteket, mivel gyakran hivatkozni fogunk rájuk.
Alice és Bob tehát ott ülnek az RSA algoritmus 21. fejezetben ismertetett leírása felett, és mindketten szeretnének maguknak egy-egy kulcspárt generálni. Ezután ezek publikus részeit megosztják majd egymással, és indulhat a biztonságos kommunikáció, azaz mindenki boldog. Igenám, csakhogy a kulcsgenerálási eljárás első lépéseként először is mindkettejüknek kellene találnia két-két többszázjegyű prímszámot. Azt a 16.14. és a 17.12. Tétel következményeként tudják, hogy az egész számok gyűrűjében a prímek és felbonthatatlan elemek köre éppenséggel egybeesik. Emiatt a továbbiakban ezt a két – egyébként teljesen különböző – gyűrűelméleti fogalmat egymás szinonímájaként fogjuk használni az egész számok kontextusában.
A prímszámok keresése szempontjából lényeges kérdés, hogy azok mennyire gyakran fordulnak elő ebben a számtartományban. Az úgynevezett prímszámláló függvény egy olyan függvény, amely azt adja meg bármilyen pozitív egészre, hogy mennyi az -nél nemnagyobb pozitív prímek száma. Ezt a függvényt -vel jelöljük. Az alábbiakban a prímszámláló függvény értékét láthatjuk néhány pozitív egész számra:
A 23.1. ábrán pedig a függvény grafikonja látható az első 60 pozitív egész számra.
Sajnos a prímszámláló függvényre nincs képletünk, amelybe tetszőleges pozitív egész számot behelyettesítve varázslatos módon megkaphatnánk az értékét. Azonban az úgynevezett analitikus számelmélet egy nevezetes tétele szerint ez az érték viszonylag jól becsülhető egy másik, könnyen kiszámítható függvénnyel. Ez "nagy prímszámtétel" néven ismeretes, amelynek részleteire ebben a cikksorozatban nem térünk ki. Ez alapján kiszámítható, hogy abban a számtartományban, amelyben Alice-nak és Bob-nak prímeket kéne keresnie az RSA kulcsokhoz, hogyan alakul a prímek eloszlása. Eszerint ha Alice és Bob teljesen véletlenszerűen kisorsol számokat ebből a tartományból, akkor nagyjából minden párszázadik próbálkozásnál belebotlanak egy-egy prímszámba.
Így már csak az a kérdés, hogy Alice és Bob hogyan tudja gyorsan eldönteni egy konkrét egész számról, hogy prím-e vagy sem. Az erre szolgáló algoritmusokat prímteszteknek nevezzük. A most következő prímtesztelő eljárás ismerős lehet az általános iskolából is.
23.1Prímtesztelés osztáspróbákkal
Alice és Bob némi gondolkodás után néhány korábbi fejezetben ismertetett összefüggés alapján az alábbi egyszerű, és mindenki számára jól ismert következtetésre jut a prímszámokkal kapcsolatban.
Ez alapján tehát egy adott egész szám esetén elegendő osztáspróbákkal ellenőrizni, hogy teljesül-e valamelyik oszthatóság az alábbiak közül:
Ha ezek közül akárcsak egyetlen oszthatóság is teljesül, akkor az iménti tétel alapján a prímtesztelő algoritmus leállhat azzal a válasszal, hogy biztosan összetett. Ezzel szemben ha egyetlen oszthatóság sem teljesül a fentiek közül, akkor ugyancsak az iménti tétel alapján biztosan prím. Például az biztosan prím, hiszen:
Viszont az biztosan összetett, hiszen:
Főhőseink tehát ez alapján bármilyen egész számról el tudják dönteni, hogy prímszám-e vagy sem. Csakhogy van egy kis probléma ezzel az eljárással, amely akkor jelentkezik, amikor a gyakorlatban előforduló nagyságrendű számokra kezdjük el lefuttatni. Vizsgáljuk ezért meg, hogy mekkora az eljárás számításigénye a bemenet méretének függvényében. A "bemenet mérete" alatt itt értelemszerűen a leírásához szükséges számjegyek számát fogjuk érteni. Jelöljük ezt a számot mondjuk -val, és tegyük fel, hogy tízes számrendszerben dolgozunk.
A lehető legkisebb számjegyből álló egész szám a lesz. Vagyis ha a bemenet történetesen prímszám, akkor ez nagyságrendileg legalább ennyi osztáspróba után fog csak kiderülni. Ez bizony a bemenet méretének exponenciális függvénye, és így az algoritmus sajnos a 7. fejezetben tanultak alapján nem nevezhető hatékonynak. Nem sokkal jobb a helyzet akkor sem, ha a bemenet összetett szám, kivéve persze az olyan ritka eseteket, amikor viszonylag kicsi prímtényezője is van. A 21. fejezetben már említettük, hogy az RSA rejtjelezéshez manapság tipikusan 600-1200 számjegyből álló prímszámokat használnak, ezért az algoritmus futása ebben a számtartományban az idők végezetéig is eltarthat, és így a gyakorlatban nem használható.
Alice és Bob tehát tovább töri a fejét, hogyan tudnának ennél jóval kevesebb osztáspróbával is célt érni, és némi gondolkodás után az alábbi következtetésre jutnak.
Ez alapján tehát az osztáspróbákkal elegendő addig a számig elmenni, amelynek a négyzete még épp alatt marad. Ha eddig nem találunk osztót, akkor az iménti tétel szerint garantáltan ezután sem fogunk. Például az biztosan prím, hiszen:
A további osztáspróbákat már nem érdemes elvégezni, hiszen , így ha -ig bezárólag nincs osztója a -nek, akkor -nél nagyobb osztója sem lesz. Ez első látásra lényeges gyorsításnak tűnik, de sajnos nem az. Most nem teljes matematikai precizitással felvázoljuk, hogy miért.
Tegyük fel ismét, hogy a bemeneti szám darab számjegyből áll, és tízes számrendszerben dolgozunk. A lehető legkisebb számjegyből álló szám a . Egy ekkora számnak a teszteléséhez az iménti tétel alapján nagyságrendileg darab osztáspróbát kell elvégezni, ahol a legnagyobb olyan szám, amelyre teljesül, hogy . Tegyük fel, hogy a tízes számrendszerben darab számjeggyel írható le, azaz . Ezt négyzetre emelve azt kapjuk, hogy . Összefoglalva:
Azaz:
Ez az exponenciális függvény tulajdonságai miatt azt jelenti, hogy felírásához legalább feleannyi számjegy kell, mint ahány számjegyből az eredeti szám áll. Mivel az elvégzendő osztáspróbák számát jelenti, ezért ez sajnos még mindig a bemenet méretének exponenciális függvénye.
Alice és Bob tehát továbbra sem mennek sokra ezzel a prímtesztelési eljárással abban a számtartományban, ahol prímszámokat szeretnének keresni. Ezért most szintet lépünk, és egy lényegesen más elven működő prímtesztet ismertetünk.
23.2A Fermat-prímteszt
Ennek a prímtesztelő eljárásnak az alapja a 22.1. szakaszban megismert kis Fermat-tétel. Ez a tétel azt állítja, hogy ha egy pozitív egész szám prímszám, akkor minden -hez relatív prím egész szám esetén teljesülni fog az alábbi kongruencia:
Más megfogalmazásban azt is mondhatjuk, hogy amennyiben akárcsak egyetlen olyan -hez relatív prím egész szám is létezik, amelyre nem teljesül a fenti kongruencia, akkor biztosan nem prím – azaz összetett. Vigyázzunk azonban, mivel a dolog a másik irányba nem működik. Vagyis abból, hogy találunk -hez egy olyan egész számot, amelyre teljesül a fenti kongruencia még nem következik, hogy prím. A kis Fermat-tétel utáni megjegyzésben mutattunk is néhány ellenpéldát erre. Kérdés, hogy ennek ellenére az ilyen találatok megerősíthetik-e bennünk azt a feltételezést, hogy esetleg tényleg prím, és ha igen, akkor milyen mértékben?
Egy szemléletes analógiával élve képzeljük el azt, hogy egy összetett egész szám a "vádlott" egy bírósági tárgyaláson, ahol az ő "bűnösségét" – vagyis azt, hogy összetett – szeretnénk bizonyítani. Azok az egész számok, amelyekre nem teljesül a fenti kongruencia, tulajdonképpen "leleplezik" bűnösségét – vagy mondhatjuk úgy is, hogy "tanúsítják" összetettségét a bíróság előtt. Ha viszont egy egész számra teljesül a kongruencia, akkor egy ilyen egész szám akadályozza a bíróságot, hiszen nem árul el semmit bűnösségével kapcsolatban. Vagy mondhatjuk úgy is, hogy ebben az esetben "cinkosa" -nek. Természetesen amennyiben nem bűnös – azaz valóban prím –, akkor a kis Fermat-tétel értelmében nyilván nem létezik hozzá olyan, a fenti értelemben vett tanú, amely ennek ellenkezőjét bizonyítaná.
A fenti gondolatmenetből egy valószínűségi alapon működő prímtesztelő eljárást kaphatunk. Ehhez elsősorban azt a kérdést kell megvizsgálnunk, hogy bűnösség esetén mennyi a valószínűsége annak, hogy egy véletlenszerűen választott, -hez relatív prím egész szám ezt a bűnösséget tanúsítja. Tegyük fel, hogy ez a valószínűség kellőképpen nagy. Amennyiben szúrópróbaszerűen kiválasztunk néhány ilyen egész számot, és valóban összetett, akkor ezt szinte biztosan tanúsítani fogja valamelyik azáltal, hogy nem teljesül rá a fenti kongruencia. Vagy megfordítva: amennyiben néhány szúrópróbaszerűen kiválasztott jelölt mindegyike teljesíti a kongruenciát, akkor szinte biztosan prím.
Mielőtt megvizsgálnánk, hogy ténylegesen hogyan alakulnak ezek a valószínűségek, először öntsük precíz matematikai formába, hogy pontosan mit értünk "tanú" alatt a fenti értelemben.
Könnyen adódik, hogy ha egy egész szám "tanú", akkor minden olyan egész szám is "tanú", amely -val azonos modulo maradékosztályban van. Ekkor ugyanis teljesül az kongruencia, és így a 20.2. Tétel 6. pontja miatt teljesül az alábbi kongruencia is:
Mármost ha a baloldal nem kongruens -gyel – mivel ugye "tanú" –, akkor a jobboldal sem lehet kongruens -gyel – azaz ilyenkor is "tanú". Hasonló megfontolásból: ha a baloldal nem "tanú", akkor a jobboldal sem. Az alábbi definícióban tehát a "tanú" fogalmát praktikus módon komplett maradékosztályokra fogjuk vonatkoztatni.
A kis Fermat-tétel eszerint úgy is megfogalmazható, hogy amennyiben egy egész számnak létezik Fermat-tanúja, akkor biztosan összetett. Így ha -ről azt szeretnénk bizonyítani, hogy összetett, akkor nincs más dolgunk, mint keresni egy Fermat-tanút a modulo redukált maradékosztályok között. Igenám, csakhogy e maradékosztályok száma borzasztóan nagy, így reménytelennek tűnik bármiféle ezek között való keresgélés. Az az érdekes, hogy ennek ellenére viszonylag gyorsan tudunk Fermat-tanút találni, amennyiben egyáltalán létezik ilyen. Most ennek okát fogjuk megvizsgálni.
Az alábbi táblázatban néhány adatot láthatunk az összes és közötti páratlan egész számról. A táblázat első oszlopa magát a vizsgált számot tartalmazza. A második oszlopban azt láthatjuk, hogy összesen hány modulo redukált maradékosztály létezik. Ez ugye a 20.7. Definíció alapján épp az Euler-féle -függvény értéke. A harmadik oszlop tartalmazza azt, hogy e darab redukált maradékosztály között mennyi Fermat-tanú van. Ezt az értéket -nel jelöltük. Végül a negyedik oszlop azt tartalmazza, hogy ténylegesen prím-e vagy sem:
Az nyilvánvaló, hogy a prímeknek nincs egyetlen Fermat-tanúja sem, hiszen az ellentmondana a kis Fermat-tételnek. A táblázatot tovább vizsgálva úgy tűnik továbbá, hogy amennyiben viszont egy egész szám összetett, akkor ezt rendkívül sok – sőt, majdnem mindegyik – modulo redukált maradékosztály tanúsítja. Ez abból látszik, hogy az összetett számok esetén a értéke csak alig kisebb -nél. Van azonban egy kakukktojás ebben a számtartományban, méghozzá az . Neki ugyanis nincs egyetlen Fermat-tanúja sem annak ellenére, hogy összetett. Őt most tegyük félre egy kicsit, és térjünk vissza rá a 23.4. szakaszban.
Az látszik tehát, hogy véletlenszerűen választott redukált maradékosztályok vizsgálatával jó eséllyel nagyon hamar "leleplezhetjük" -t, amennyiben összetett, hiszen kicsi az esélye, hogy nem találunk el egyetlen Fermat-tanút sem abból a rengeteg sokból. Ráadásul egy-egy ilyen vizsgálatot a 21.4. szakaszban tanult ismételt négyzetreemelések módszerével rettentően hamar el is tudunk végezni. Hamarosan általánosságban is igazolni fogunk egy alsó becslést a Fermat-tanúk számára vonatkozóan. Ez ugyan jóval szerényebb lesz annál, mint ami a táblázatból látszik, ám egy hatékonyan működő prímteszthez még ez is bőven elég lesz.
Ehhez azonban először két segédtételre lesz szükségünk. Az első arra vonatkozik, hogy egy Fermat-tanúból hogyan tudunk előállítani egy másik Fermat-tanút.
A második segédtétel arra vonatkozóan mond ki egy fontos állítást, hogy mi történik akkor, ha egymástól különböző maradékosztályokat egyesével végigszorozzuk ugyanazzal a redukált maradékosztállyal.
E két segédtétel segítségével mostmár könnyedén igazolhatjuk a Fermat-tanúk számára vonatkozó alsó becslésünket.
Na és akkor mi van?! – kérdezhetné az Olvasó. Nos, az a helyzet, hogy ezt az első látásra nem túl érdekes tényt Alice és Bob egy meglehetősen pofátlan kis trükkel prímteszteléshez tudja felhasználni.
23.3„Valószínűleg” prím?!
Az alábbiakban ismertetett eljárást Fermat-prímtesztnek nevezzük. Az algoritmus bemenete egy pozitív egész szám, amelyről el kellene dönteni, hogy prím-e vagy összetett:
- Válasszunk véletlenszerűen egy tetszőleges és közötti egész számot, azaz legyen .
- A 17.18. Tétel bizonyításában ismertetett euklidészi algoritmus segítségével számítsuk ki az kitüntetett közös osztót. Ha ennek értéke , akkor folytassuk az eljárást a 3. lépéstől. Egyébként az algoritmus leáll a következő válasszal: az egész szám biztosan összetett, és az egyik osztója .
- A 21.4. szakaszban ismertetett ismételt négyzetreemelések módszerével ellenőrizzük le, hogy teljesül-e az kongruencia.
- Amennyiben nem teljesül a kongruencia, akkor az algoritmus leáll a következő válasszal: az egész szám biztosan összetett, de nem találtuk meg egyetlen osztóját sem.
- Amennyiben teljesül a kongruencia, akkor az algoritmus a következő válasszal áll le: az egész szám "valószínűleg" prím.
Ez az egész elsőre teljesen értelmetlennek tűnik, ezért most vizsgáljuk meg, hogy miről is van szó tulajdonképpen. Képzeljük el, hogy a bemenő egész szám valójában összetett, ám ezt szeretné minél jobban eltitkolni előlünk. Mi azonban a kis Fermat-tételből tudjuk, hogy esetleges összetettségét egy Fermat-tanú egyértelműen leleplezné.
Ezért az összes nemnulla modulo maradékosztályt szépen bedobáljuk egy képzeletbeli kalapba, majd becsukjuk a szemünket, és teljesen véletlenszerűen kihúzunk közülük egyet. Olyan ez, akárcsak egy lottósorsolás. Ez lenne tehát az algoritmus 1. lépése. A 2. lépésben azt vizsgáljuk meg, hogy egy redukált maradékosztályt húztunk-e ki. Annak, hogy nem, gyakorlatilag semmi esélye, de ha mégis, akkor ez leleplezi -et, ráadásul még egy osztóját is megkapjuk. Majdnem biztos azonban, hogy tovább kell mennünk a 3. lépésre.
Ezen a ponton már tudjuk, hogy a kiválasztott maradékosztály egy redukált maradékosztály. Ebben a lépésben azt ellenőrizzük le, hogy véletlenül nem egy Fermat-tanút húztunk-e ki a kalapból. Ha igen – azaz a vizsgált kongruencia nem teljesül – akkor lelepleződött, hiszen a kis Fermat-tétel miatt biztosan összetett. Ha azonban egy Fermat-nemtanút húztunk ki – azaz a vizsgált kongruencia teljesül –, akkor nem tudunk semmi biztosat mondani -ről, ugyanis a kis Fermat-tétel megfordítása nem igaz.
Azt viszont a 23.2. szakaszban bizonyított 23.6. Tétel alapján tudjuk, hogy a kalapban lévő redukált maradékosztályoknak legalább a fele – ám a tapasztalat alapján általában ennél jóval nagyobb része – Fermat-tanú. Így annak valószínűsége meglehetősen kicsi, hogy pont belehúztunk abba a néhány Fermat-nemtanúba, miközben összetett. Ennél sokkal valószínűbb, hogy ténylegesen prím, és emiatt valóban nincs egyetlen Fermat-tanú sem abban a bizonyos kalapban. Ám biztosat ezen a ponton nem tudunk mondani, és ez az oka ennek a meglehetősen furcsán hangzó "valószínűleg prím" válasznak.
A Fermat-tanúk számára vonatkozó, a 23.6. Tételben bizonyított alsó becslés ugyan önmagában nem túl erős, azonban Alice és Bob megteheti, hogy többször is húz a kalapból. A Fermat-tanúság ellenőrzése ugyanis – mint említettük – az ismételt négyzetreemelések módszerével rendkívül gyorsan elvégezhető. Tegyük fel, hogy a lehető legrosszabb a helyzet, és a redukált maradékosztályoknak mindössze csak a fele Fermat-tanú. Ekkor 50% annak valószínűsége, hogy főhőseink egy véletlenszerű választással pont a másik feléből választanak egy redukált maradékosztályt. Annak pedig már csak 25%, hogy ez kétszer egymás után is megtörténik. Az, hogy egy újabb, harmadik húzással sem találunk Fermat-tanút, már csak 12.5% valószínűséggel következik be. És így tovább, minden újabb húzással megfeleződik annak valószínűsége, hogy tévesen prímszámmá nyilvánítjuk -et.
Tegyük fel például, hogy 100 teljesen véletlenszerűen kiválasztott redukált maradékosztály egyike sem bizonyul Fermat-tanúnak. Ennek már csupán annyi az esélye, mint százszor zsinórban eltalálni, hogy egy feldobott pénzérme fej vagy írás lesz-e. Ez nagyságrendileg kevésbé valószínű, mint hogy valakinek háromszor egymás után telitalálata lesz az ötöslottón.
Van azonban egy kis probléma ezzel a prímteszttel, amivel mindenképpen fogalkoznunk kell: sajnos léteznek olyan összetett egész számok, amelyeket nem lehet ilyen módon kiszűrni.
23.4Univerzális álprímek
Térjünk vissza egy kicsit a 23.2. szakaszban szereplő táblázathoz. Itt a második oszlop a modulo redukált maradékosztályok számát mutatja – amely ugye az Euler-féle -függvény értéke –, a harmadik pedig azt, hogy ezek között hány Fermat-tanú van – ezt -nel jelöltük.
Értelemszerűen a prímszámok esetén ez utóbbi , hiszen egy prímszámhoz nyilván nem létezik az összetettségét igazoló Fermat-tanú. Kérdés, hogy vajon létezik-e olyan összetett szám, amelyhez szintén nincs Fermat-tanú a redukált maradékosztályok között. A táblázatban felhívtuk a figyelmet az egész számra, amely épp ezzel a szemtelen tulajdonsággal rendelkezik, és sajnos nem ő az egyetlen. Ezeknek a számoknak külön nevük is van.
Ha tehát véletlenül épp egy Carmichael-számba botlunk, akkor a Fermat-prímteszt azt nagyon nagy valószínűséggel tévesen prímnek fogja minősíteni, hiszen akárhány redukált maradékosztályt is húzunk ki a kalapból, azokra mind teljesülni fog a kis Fermat-tételben szereplő kongruencia. Az ilyen számok összetettségét egyedül akkor fogjuk tudni detektálni, ha sikerül épp egy nem redukált maradékosztályt kihúzni a kalapból. Ilyenkor ugyanis a 2. lépésben végrehajtott euklidészi algoritmus -től különböző eredménye lebuktatja a számunkat. Erre azonban gyakorlatilag semmi esély nincs, hiszen egy nagy szám esetén a maradékosztályoknak általában csak elenyésző hányada nem redukált maradékosztály.
A figyelmes Olvasó észreveheti az említett táblázatból, hogy egy univerzális Fermat-álprímet mindössze az különbözteti meg egy valódi prímtől, hogy összetettsége miatt a maradékosztályon kívül vannak még egyéb, nem redukált maradékosztályai is. Ez onnan látszik, hogy a táblázat második oszlopában az Euler-féle -függvény értéke nem , ahogyan a prímek esetében a 21.5. Tétel alapján elvárható, hanem egy ennél kisebb szám. Ez valóban lebuktatja álprímünket. A gond csak az, hogy – mint ahogyan a 21.3. szakaszban már említettük – az Euler-féle -függvény kiszámítására csak prímtényezőinek ismeretében van esélyünk, máskülönben az idők végezetéig is eltarthat. Így erre itt nem tudunk támaszkodni.
Érdekes kérdés, hogy vajon hány Carmichael-szám létezik? Ha esetleg ezek száma véges, akkor ezeket nyilvántarthatnánk a számítógép memóriájában, az algoritmus pedig leellenőrizhetné, hogy véletlenül nem szerepel-e ebben a listában. Régóta ismeretes, hogy tetszőleges egész szám esetén végtelen sok alapú álprím létezik, az azonban sokáig nyitott kérdés volt, hogy vajon az univerzális Fermat-álprímek száma is végtelen-e. Sajnálatos módon 1994-ben ezt is sikerült igazolni. Emiatt nem mehetünk el szó nélkül a probléma mellett, és az kongruencia ellenőrzésén kívül egyéb dolgokat is meg kell vizsgálnunk annak érdekében, hogy a Carmichael-számokat is ki tudjuk szűrni.
23.5A Miller-Rabin prímteszt
Ebben a szakaszban tehát a Fermat-prímtesztünket fogjuk egy kicsit feljavítani annak érdekében, hogy a Carmichael-számok se okozhassanak gondot. Ezt az új eljárást Miller-Rabin-prímtesztnek fogjuk nevezni. Előszöris szögezzük le, hogy a továbbiakban csak a páratlan egész számokkal fogunk foglalkozni. Ez nem jelent tényleges megszorítást, hiszen az utolsó számjegyből azonnal látszik, hogy páratlan vagy páros-e a bemenetünk. Ez utóbbi esetben nyilván megállhatunk, és összetettnek nyilváníthatjuk -et, hiszen az osztható -vel.
Az általánosság megsértése nélkül feltételezhetjük tehát, hogy egy páratlan egész szám. Ekkor azonban a kis Fermat-tételben szereplő kongruencia baloldalán az kitevő biztosan páros lesz. Vagyis létezik olyan egész szám, amelyre teljesül az alábbi – és ezt meg is kapjuk, ha -et "elosztjuk" -vel:
Ezután -re vizsgáljuk meg, hogy páratlan-e vagy páros. Utóbbi esetben hasonlóképpen tovább bonthatjuk -et, azaz létezni fog olyan egész szám, amelyre teljesül az alábbi:
És így tovább, mindaddig bontjuk tovább a jobboldali tényezőt, amíg páratlan számot nem kapunk. Ez garantáltan be fog következni véges számú lépés után, máskülönben prímtényezős felbontásában végtelen sok -es tényező szerepelne, ami lehetetlen. Tegyük fel, hogy darab lépés után egy valamilyen páratlan számot kapunk. Ekkor -re tulajdonképpen az alábbi kifejezést kaptuk:
Például ha az Carmichael-szám a bemenetünk, akkor -ra az iménti felbontás után és adódik, hiszen:
Ilymódon kiszámítva az és értékét, a kis Fermat-tételben szereplő kongruencia az alábbi alakot ölti:
Amennyiben tehát egy redukált maradékosztály és prím, akkor teljesül a fenti kongruencia. Ez viszont a 20.1. Tétel 3. pontja alapján azt jelenti, hogy teljesül az alábbi oszthatóság:
Most ennek az oszthatóságnak a jobboldalán szereplő kifejezést fogjuk szorzattá alakítani a következő tétel segítségével.
Tegyük fel például, hogy továbbra is az Carmichael-szám a bemenetünk. Az -ból ugye már korábban kiszámítottuk az és értékeket. Ekkor az kifejezés az iménti tétel alapján így alakítható szorzattá:
Ha tehát egy tetszőleges redukált maradékosztály, és az egy prímszám lenne, akkor ő garantáltan osztója lenne a baloldali kifejezésnek. Természetesen ez az oszthatóság teljesülhet egészen más okból is, és – minthogy az egy Carmichael-szám – jelen esetben teljesül is bármilyen redukált maradékosztályra. A Fermat-prímteszt ezen a ponton annak rendje és módja szerint meg is bukik, hiszen néhány véletlenszerűen kiválasztott redukált maradékosztály vizsgálata után tévesen arra a következtetésre jut, hogy az "valószínűleg prím".
A Miller-Rabin-prímteszt viszont nem elégszik meg ennyivel, és az esetleges prímtulajdonságát próbálja meg cáfolni a kiválasztott redukált maradékosztály segítségével. Ha ugyanis osztója a baloldali egész számnak, akkor a prímtulajdonság miatt a 16.13. Definíció utáni megjegyzés szerint osztója kell legyen legalább az egyik jobboldalon szereplő tényezőnek is. Vagyis az alábbi oszthatóságok közül legalább az egyiknek teljesülnie kell tetszőleges redukált maradékosztály esetén:
Ez viszont a 20.1. Tétel 3. pontja alapján azt jelenti, hogy teljesülnie kell legalább az egyik alábbi kongruenciának tetszőleges redukált maradékosztály esetén:
Más megfogalmazásban ez azt jelenti, hogy amennyiben találunk egy olyan redukált maradékosztályt, amely esetén a fenti kongruenciák közül egyik sem teljesül, akkor az biztosan nem lehet prím. Egy ilyen maradékosztály tehát "leleplezi", vagy "tanúsítja" az összetettségét.
Vizsgáljuk meg például a redukált maradékosztályt, azaz legyen . A 21.4. szakaszban ismertetett ismételt négyzetreemelések módszerével viszonylag gyorsan leellenőrizhetjük a kérdéses kongruenciákat. Az alábbi eredményeket fogjuk kapni:
Minthogy egyetlen kongruencia sem teljesül, ezért az eddigi okfejtés alapján az Carmichael-szám biztosan összetett, azaz megbukott a Miller-Rabin-prímteszten.
Az eljárás általános megfogalmazásához most bevezetünk egy új tanú-fogalmat.
Felmerül a kérdés, hogy vajon a tanú-fogalom kiszélesítését nem vittük-e túlzásba. Azaz nem lehetséges-e, hogy ha Fermat-tanúja nem is, de Miller-Rabin-tanúja már lehet esetleg prímszámoknak is. Az alábbi tétel szerint szerencsére nem ez a helyzet.
Ezekután ismertetjük a Miller-Rabin-prímtesztet, amely tehát a Fermat-prímtesztnek a továbbfejlesztett változata. Az algoritmus bemenete egy páratlan egész szám, amelyről el kellene dönteni, hogy prím-e vagy összetett:
- Válasszunk véletlenszerűen egy tetszőleges és közötti egész számot, azaz legyen .
- A 17.18. Tétel bizonyításában ismertetett euklidészi algoritmus segítségével számítsuk ki az kitüntetett közös osztót. Ha ennek értéke , akkor folytassuk az eljárást a 3. lépéstől. Egyébként az algoritmus leáll a következő válasszal: az egész szám biztosan összetett, és az egyik osztója .
- Képezzük azt az kitevőt és páratlan számot, amelyre teljesül.
- A 21.4. szakaszban ismertetett ismételt négyzetreemelések módszerével ellenőrizzük le, hogy -ra teljesül-e legalább az egyik a 23.9. Definícióban felsorolt kongruenciák közül.
- Amennyiben nem teljesül egyetlen kongruencia sem, akkor az algoritmus leáll a következő válasszal: az egész szám biztosan összetett, de nem találtuk meg egyetlen osztóját sem.
- Amennyiben teljesül legalább az egyik kongruencia, akkor az algoritmus a következő válasszal áll le: az egész szám "valószínűleg" prím.
Már megint csak "valószínűleg" prím? – kérdezhetné teljes joggal az Olvasó. Látszólag valóban nem kerültünk közelebb a prímek azonosításához, hiszen ismét csak összetett számokat tudunk egyértelműen leleplezni. Ha azonban szerencsétlenül épp egy olyan maradékosztályt sikerült kihúzni a kalapból, amely Miller-Rabin-nemtanú, akkor ismét csak annyit mondhatunk, hogy a kérdéses szám "valószínűleg" prím.
Ez valóban így van, azonban a Fermat-prímteszthez hasonlóan itt is megtehetjük, hogy többször húzunk a kalapból. Ezen túlmenően a 23.9. Definíció utáni megjegyzés alapján egy adott -hez tartozó Miller-Rabin-tanúk köre biztosan nem szűkebb, mint az ugyanezen -hez tartozó Fermat-tanúk köre. Sőt, azt is láthattuk, hogy az -nek egyáltalán nincs Fermat-tanúja, hiszen Carmichael-számról van szó. Ezzel szemben például a maradékosztály "lebuktatja" ezt a számot is, hiszen ő egy Miller-Rabin-tanú, amely bizonyítja az összetettségét.
Úgy tűnik tehát, mintha a Miller-Rabin-prímteszt elől még a Carmichael-számok sem tudnának "elbújni", ami kétségkívül hatalmas előrelépés. De vajon tényleg nem léteznek univerzális álprímek erre a tesztre nézve? Sajnos ahhoz, hogy ezt megválaszolhassuk, az absztrakt algebra egy rendkívül fontos ágának, az úgynevezett csoportelméletnek az eszköztárára lesz szükségünk. Így ezt csak a következő fejezetben tudjuk majd igazolni.
Most azonban térjünk vissza egy kicsit az RSA kulcsgenerálás kérdésköréhez. Nem árt ugyanis, ha felhívjuk Alice és Bob figyelmét néhány fontos dologra, amire vigyázniuk kell, ha nem akarják, hogy Eve és Mallory borsot törjön az orruk alá.
23.6A Fermat-faktorizáció
Az RSA implementációja során sok apró részleten múlhat a biztonság. Számos hatékony támadás ismert ugyanis, amelyek az üzenethalmaz, a kulcsgeneráláshoz használt prímek, valamint a kódoló és dekódoló kulcs nem elég körültekintő megválasztását használják ki. Ezt néhány példán keresztül illusztráljuk, amelyek közül az első az úgynevezett Fermat-faktorizációs algoritmus.
Ez az eljárás bizonyos körülmények között lehetővé teszi egy támadó számára, hogy hatékonyan kiszámíthassa a kódoláshoz és dekódoláshoz használt modulus prímtényezőit, és így tulajdonképpen ő maga is a titkos kulcs birtokába juthasson. Erre akkor nyílik lehetősége, ha a prímtényezők közötti különbség nem eléggé nagy. Ebben az esetben a két prímtényező közel van a 23.2. Tételben szereplő számhoz. Ez ugye a legnagyobb olyan egész szám, amelynek négyzete még éppen nemnagyobb -nél. Így ennek a környékén jó eséllyel hamar megtalálhatjuk a prímtényezőket. Az erre szolgáló alább ismertetett módszer magától Pierre de Fermat-tól származik, amely a 23.8. Tétel bizonyításának elején már említett összefüggésen alapul.
Képzeljük magunkat Eve helyébe, és tegyük fel, hogy az RSA modulus prímtényezőit szeretnénk megtalálni. Azaz keressük azokat a és prímszámokat, amelyekre teljesül az alábbi egyenlet – itt nyugodtan feltételezhetjük, hogy , ha pedig mégsem, akkor nevezzük el őket fordítva:
Ez első látásra reménytelennek tűnik, azonban abban bízhatunk, hogy az ismeretlen és prímtényezőket a kulcsgeneráláskor óvatlanul választották ki, és a különbségük kicsi. Most megmutatjuk, hogy mindig léteznek olyan és egész számok, amelyeknek összege -vel, különbsége pedig -val egyenlő. Azaz:
Adjuk össze, és vonjuk ki egymásból a két egyenletet:
Mivel és is biztosan páratlan – hiszen a az egyetlen páros prímszám – ezért a fenti két egyenlet baloldalán álló összeg és különbség biztosan páros, azaz osztható -vel. A keresett és egész számok tehát valóban léteznek. Ekkor a fentebb említett összefüggés alapján:
Ha valóban igaz a feltételezésünk, miszerint a két prímszám egymáshoz közel van, akkor a összefüggés alapján kicsi. Ha viszont kicsi, akkor a négyzete is kicsi, amit az összefüggés jobboldaláról elhanyagolhatunk. Azaz feltételezhetjük, hogy a keresett közel lesz a 23.2. Tételben szereplő számhoz, ami ugye a legnagyobb olyan egész szám, amelynek a négyzete nemnagyobb -nél. Ha most az összefüggésből kifejezzük -et, akkor az alábbit kapjuk:
Feladatunk megkeresése. Azt tudjuk, hogy környékén van, ezért innen kiindulva elkezdünk tippelni mindaddig, míg a jobboldali kifejezésre nem négyzetszámot kapunk. A fenti példában tehát . Ekkor , mivel ez az a legnagyobb egész szám, amelynek a négyzete még nemnagyobb -nél. Ebből kiindulva adunk tippeket -ra, és vizsgáljuk, hogy az négyzetszám-e:
Meglepően gyorsan, mindössze lépés után négyzetszámot kaptunk a második oszlopban, amely tehát -tel egyezik meg. Ebből adódik, és mivel -t is sikerült megtippelnünk, végülis megkaptuk a két prímtényezőt is:
Látható, hogy eléggé hatékonyan sikerült prímtényezőire bontani a bemeneti számunkat. Mostmár látszik is, hogy miért: a két prím különbsége mindössze volt, ami nagyon kicsi a két prímhez képest.
Amikor tehát Alice és Bob RSA kulcspárt generálnak maguknak, vigyázniuk kell, hogy a kiválasztott prímszámok átlagosan az őket leíró bitek felében különbözzenek egymástól. Ezzel viszonylag hamar elvehetik Eve kedvét a fenti eljárástól, a keresett ugyanis ebben az esetben nagyon messze lesz -től, amelyet így az idők végezetéig keresgélhet.
23.7A kicsi kódoló kulcsok problémája
A 22.6. szakaszban a RSA dekódolás gyorsítási lehetőségei kapcsán megemlítettük, hogy az RSA biztonsága nem függ a publikus kódoló kitevő megválasztásától. Az ismételt négyzetreemelések módszerét vizsgálva a 21.4. szakaszban megállapítottuk, hogy célszerű olyan kitevőt választani, amelynek bináris számábrázolásában kevés számú -es bit szerepel. Emiatt racionális megfontolásnak tűnhet, ha a megvalósítás során úgy döntünk, hogy egy viszonylag alacsony számtartományból választjuk ki a rendszer felhasználóihoz tartozó publikus kitevőket a kulcsgenerálás során. Ez azonban bizonyos körülmények között a nyílt üzenet kiszámítására adhat lehetőséget egy támadó számára anélkül, hogy feltörné az eljárást.
Tegyük fel ugyanis, hogy egy sokfelhasználós rendszerről van szó, és kicsi az a számtartomány, amelyből kisorsoljuk a felhasználók számára a publikus kitevőt. Ekkor előfordulhat, hogy több felhasználó is ugyanazt a kitevőt kapja. Tegyük fel, hogy darab felhasználó kapta ugyanazt az kitevőt. Szerencsétlen, ugyanakkor nem túl ritka esetekben még az is megeshet, hogy is teljesül. Ez látszólag nem jelent problémát, hiszen természetesen más és más prímpárokat sorsolunk hozzájuk, tehát e darab felhasználóhoz különböző modulusok és dekódoló kitevők fognak tartozni.
Képzeljük el azonban, hogy valaki egy bizalmas körlevelet küld felhasználók egy csoportjának, amelybe történetesen a fenti darab felhasználó is beletartozik. Ebben az esetben tehát az nyílt szöveg ugyanaz lesz. A küldő fél egyenként előkeresi a publikus kulcstárból a címzettek publikus kulcsait, és mindenki számára egyedileg kódolja az üzenetet a 21. fejezetben leírt módon.
A szerencsétlenül járt darab felhasználónak kiküldött , , ..., rejtett üzenetekből a támadó az alábbi kongruenciarendszert tudja felírni:
Ebben a kongruenciarendszerben a támadó számára egyedül az nyílt üzenet ismeretlen, hiszen a felhasználókhoz tartozó kitevő és a modulusok számára is elérhetők a publikus kulcstárból, az , , ..., rejtett üzeneteket pedig a kommunikációs csatorna lehallgatásával ismeri meg. Most megmutatjuk, hogy a támadó a fent ismertetett szerencsétlen körülmények fennállása esetén ebből a kongruenciarendszerből egy pillanat alatt megkaphatja az nyílt üzenetet.
Azt mindjárt az elején feltehetjük, hogy az , , ..., modulusok páronként relatív prímek. Ezek ugyanis véletlenszerűen sorsolt prímpárok szorzataiként állnak elő, így annak gyakorlatilag nincs esélye, hogy van közöttük két olyan, amelyeknek közös legalább az egyik prímtényezője. Emlékeztetnénk az olvasót a kínai maradéktételhez kapcsolódó 22.3. Tételre, valamint a 22.4. Tételre, amelyek így már alkalmazhatók.
Ezek többszöri alkalmazásával azt kapjuk, hogy a szorzatgyűrű elemei kölcsönösen egyértelmű megfeleltetésben állnak a maradékosztálygyűrű elemeivel. A fenti kongruenciarendszer a szorzatgyűrűben tulajdonképpen az alábbi elemet írja le:
Ennek a maradékosztálygyűrűben a 22.4. Tétel alapján az alábbi maradékosztály felel meg:
Tegyük fel, hogy az nyílt üzenetet a küldő az előkódolás során szerencsétlenül úgy választotta meg, hogy az és a legkisebb modulus közé essen. Az előkódolásról a 21.8. szakaszban írtunk bővebben. Teljesülnek tehát az alábbi egyenlőtlenségek:
Mivel azt mondtuk, hogy szerencsétlen módon az egyenlőtlenség is fennáll, ezért ebben az esetben nyilván teljesül az alábbi is:
Így a támadó valójában az maradékosztály legkisebb nemnegatív reprezentánselemét kapja meg, amely nem más, mint a nyílt üzenetnek ténylegesen az -edik hatványa – és nem pedig annak modulo megfelelője. Ebből viszont az nyílt üzenetet már egyszerűen megkaphatja.
Alice-nak és Bob-nak tehát azt javasolhatjuk, hogy a kulcsgeneráláskor semmiképpen se korlátozzák az kitevőt egy szűk számtartományra, nehogy a fenti kellemetlenségben legyen részük. A kódolás gyorsasága szempontjából a lényeg úgyis az, hogy kevés számú -es legyen bináris ábrázolásában, nem pedig az, hogy ő maga kicsi legyen. Ezen túlmenően amikor ugyanazt az üzenetet nagyszámú résztvevőnek továbbítjuk, akkor célszerű az üzenet egyes példányaiba valamilyen véletlentől függő elemet is belevinni. Például megtehetjük, hogy az utolsó valahány biten hasznos tartalom helyett elhelyezünk egy véletlenszámot.
Ennek az az előnye, hogy így az eredeti üzenet egyes példányai különböző kódolandó nyílt üzenetekké válnak, amivel a fenti támadás lehetőségét egycsapásra kiiktattuk. Természetesen ekkor a küldő és fogadó félnek meg kell egyezniük egymással, hogy melyek lesznek a haszontalan bitek.
23.8Közös modulus választásának hibája
Végül egy nagyon súlyos potenciális rendszertervezési hibára hívnánk fel a figyelmet. Mivel az RSA meglehetősen számításigényes, ezért csábító lehet az a gondolat, hogy a teljes rendszer számára egyetlen modulust generálunk, és csak az egyes felhasználókhoz tartozó publikus és titkos kitevők lesznek különbözőek a kulcsgenerálás során. Ez látszólag előnyös lehet, hiszen így például előre le tudunk gyártatni egy célhardvert, amely a modulo maradékosztálygyűrűben való számolásra van optimalizálva.
Képzeljük el, hogy az előző szakaszhoz hasonlóan ismét egy közös üzenet – például egy körlevél – érkezik mondjuk két felhasználóhoz. Tegyük fel, hogy e két felhasználóhoz az és publikus kitevők vannak rendelve. Nagy az esély rá, hogy e két kitevő egymáshoz relatív prím – azaz –, és ebben az esetben egy támadó sajnos meg tudja fejteni az nyílt üzenetet. Ő ugyanis az alábbi kongruenciákat írhatja fel:
Ebben a kongruenciarendszerben a támadó számára ismét egyedül az nyílt üzenet ismeretlen, hiszen az összes többi paraméter a nyilvános kulcstárból, valamint a kommunikációs csatorna lehallgatásával megismerhető. Nézzük, hogy mihez kezd mindezzel a támadó. A Bézout-lemmából tudjuk, hogy bármely két egész szám kitüntetett közös osztója kifejezhető a két szám lineáris kombinációjaként. Ezt jelen esetben az és kitevőkre alkalmazhatjuk.
Mivel róluk azt mondtuk, hogy relatív prímek – azaz –, ezért a Bézout-lemma alapján léteznek olyan és egész számok, amelyekre teljesül az alábbi:
Ráadásul a támadó a keresett és egész számokat hatékonyan elő tudja állítani a kibővített euklidészi algoritmus segítségével, amelyről a 21.1. szakaszban volt szó részletesen. Most vizsgáljuk meg, hogy a kiszámított és egész számokból, valamint a kommunikációs csatornán elfogott és kódszövegekből képzett alábbi kifejezés mivel kongruens modulo :
Mivel és az RSA kódolás alapján, ezért a kongruencia tulajdonságairól szóló 20.2. Tétel 6. és 4. pontjait alkalmazva ezt kapjuk:
A baloldali kifejezést a hatványozás azonosságairól szóló 18.8. Tétel 2. és 3. pontjai alapján átírhatjuk az alábbi módon:
A Bézout-lemma alapján a kitevőről viszont már tudjuk, hogy az az kitüntetett közös osztóval egyezik meg, azaz teljesül az alábbi:
A támadó tehát pusztán publikusan, illetve a csatorna lehallgatása által megszerezhető információkból ki tudja számítani az nyílt szöveget anélkül, hogy feltörte volna az RSA eljárást. A fentiek alapján ugyanis nincs más dolga, mint kiszámítani az kifejezést, amely tehát biztosan az nyílt üzenettel lesz kongruens modulo .
Felhívnánk a figyelmet azonban egy apró "csalásra", amelyet a fenti okfejtésben elkövettünk. Vizsgáljuk meg ugyanis jobban a Bézout-lemmából kapott egyenletet. Mivel itt az és kitevők mindketten pozitívak, ezért ebből következik, hogy és közül pontosan az egyik szükségképpen negatív. Ők viszont a fenti kifejezésben kitevőkként szerepelnek. Márpedig ebben az esetben elvileg nem használhatnánk a hatványozás azonosságairól szóló 18.8. Tételt és a kongruencia tulajdonságairól szóló 20.2. Tételt, hiszen ezeket csak pozitív kitevőkre bizonyítottuk. Arról már nem is beszélve, hogy az eddigi definícióink alapján negatív kitevőket egyelőre nem is tudunk értelmezni.
Ezt a kis hiányosságot a 24.5. szakaszban fogjuk pótolni, mivel ehhez fel kell építeni néhány újabb fontos algebrai fogalmat. Ám elöljáróban megjegyezzük, hogy a hatványozás azonosságai és a kongruenciák tulajdonságai ebben a kibővített értelmezésben is érvényben fognak maradni. Így válik majd a fenti érvelés teljessé. Konklúzióként azonban elmondhatjuk, hogy a közös modulus választását mindenképpen el kell kerülni az RSA eljáráson alapuló kriptográfiai rendszerekben.
Ebben a fejezetben tehát főként azzal a problémával foglalkoztunk, hogy hogyan tud Alice és Bob az RSA kulcsgeneráláshoz szükséges óriási prímszámokat találni. Ennek keretében megmutattuk, hogy a hagyományos, osztáspróbákon alapuló módszer a gyakorlatban a lassúsága miatt nem alkalmazható. Ezért bemutattunk két valószínűségi prímtesztet, amelyek a kis Fermat-tételen alapulnak. Az első a Fermat-prímteszt volt, amelynek fő hátránya, hogy léteznek olyan összetett számok, amelyeket nem tud kiszűrni. Ezeket univerzális Fermat-álprímeknek vagy Carmichael-számoknak nevezzük, amelyekről a közelmúltban kimutatták, hogy sajnos végtelen sok van belőlük. Ezt a problémát kiküszöbölendő bemutattuk a Miller-Rabin-prímtesztet, amely – úgy tűnik – kiszűri a Carmichael-számokat is. Végül felhívtuk a figyelmet pár olyan dologra, amelyekre Alice-nak és Bob-nak oda kell figyelniük a kulcsgenerálás során.
A következő fejezetben megismerkedünk az absztrakt algebra talán legfontosabb ágának, az úgynevezett csoportelméletnek az alapjaival. Ezután az így felépített eszközök segítségével igazolni fogjuk, hogy a Miller-Rabin-prímtesztre nézve valóban nem léteznek univerzális álprímek. Végül adunk egy felső korlátot is annak valószínűségére, hogy egy összetett számot tévesen prímmé nyilvánít ez a teszt.