Nagy prímek előállítása


A nyilvános kulcsú rejtjelezéshez nagy prímeket kell elő állítani. Mivel nincsen olyan módszer, amellyel direkt módon lehetne meghatározni egy prím számot, ezért próbálgatással kell egyet találni. Valahogyan generálunk egy jó nagy véletlenszámot és megnézzük, hogy prím-e. Ha nem prím, akkor veszünk egy másikat, és azt ellenőrizzük. Mindezt addíg ismételjük, amíg két megfelelő prím számot nem találunk a nyilvános kulcsú rejtjelezési algoritmushoz.

Prím számokat másképp is elő lehet állítani, például Mersenne prímeket, amelyek 2n-1 alakúak, ezek azonban kevesen vannak, és ha ilyen prímet használunk, akkor egyszerű próbálgatással gyorsan fel lehet törni a rejtjelezést.

Hogyan tudjuk eldönteni egy nagy számról, hogy prím-e? A válasz az, hogy teljes biztonsággal sehogy. Erre ugyanis csak egy módszer van: az, hogy végignézzük 1 és a szám négyzetgyöke közötti egészek mindegyikét, hogy osztója-e valamelyik a számnak. Ha egyik sem osztója, akkor a szám prím, ellenkező esetben az első osztó megtalálásakor abbahagyhatjuk a keresést, mert a szám nem prím. Ezt azonban nem tudjuk megtenni, hiszen pont olyan nagy prímet szeretnénk találni, amelyikkel ez már nem tehető meg belátható időn belül.

Ugyanakkor a jó hír az, hogy tetszőleges biztonsággal meg tudjuk mondani, hogy egy p szám prím-e, vagy sem. Ha a szám prím, akkor igaz rá a Fermat tétel. Ha viszont nem prím egy szám, akkor jó esélyünk van rá, hogy találunk olyan a egész számot, amely kisebb, mint p, és p nem osztója ap-1-1-nek. Mivel p elég nagy meglehetősen sok a egész áll rendelkezésünkre a teszteléshez. A gyakorlat azt mutatja, hogy ha p nem prím, akkor p az esetek felében nem osztója ap-1-1-nek. Ez pedig azt jelenti, hogy 100 sikeres teszt esetén annak a valószínűsége, hogy a szám mégsem prím 2-100*100%. Az ilyen valószínűségű eseményekre a köznapi életben nem azt szoktuk mondani, hogy nem valószínű, hanem azt, hogy lehetetlen.

Egy ilyen tesztelés persze nagyon nagy számítási kapacitást igényel, hiszen egy valamilyen a számhoz ki kell számítani ap-1-1 illetve ami ezzel ekvivalens ap-1-nek p-vel adott osztási maradékát. p pedig nagyságrendileg 64...128 bájtos bináris egész szám, ami azt lejenti, hogy decimális alakban több, mint 130 jegyű, és ez van a kitevőben!

A gyakorlat során egy tesztelés, azaz egy modulo hatványozás 486, 66MHz gépen másodperc nagyságrendbe esik. Mivel sok nem prímet találunk gyorsítani lehet az algoritmust azzal, ha például a páros számokat nem vizsgáljuk. Ezzel kétszeresére nő a sebesség. További gyorsítási lehetőség ha kihagyjuk a 3-mal, 5-tel sb. osztható számokat. Általánosabban megfogalmazva, mielőtt a kemény, és számításigényes Fermat tételen alapuló tesztelést elkezdjük megvizsgáljuk, hogy a szám osztható e valamilyen 2 és előre rögzített n közötti prímmel.

Természetesen nem minden prím rendelkezik olyan jó tulajdonsággal, mint a 2, hogy egy akárhány jegyű szám bináris ábrázolásánál elegendő az utolsó bitet megvizsgálni annak eldöntésére, hogy osztható-e a szám kettővel. Az 3-mal, 5-tel, 7-tel stb. való oszthatóság eldöntéséhez maradékot kell képezni, ami szintén nem túl gyors folyamat. Ha azonban egy tömbben tároljuk a kis, például száznál kisebb prímeket, mindegyiket a példa kedvéért 16 biten, és egy másik, ugyanennyi elemet tartalmazó tömbbe eltesszük a tesztelt p szám megfelelő prímmel való osztási maradékait, akkor p+j maradékainak megállapításához elegendő a már kiszámított maradék plusz j maradékát kiszámolni, ami abban az eseteben, ha j is 16 bites szám csak 16 bites aritmetikát igényel.

Ez azt jelenti, hogy az első, véletlenszerűen előállított p szám után nem egy véletlenszerűen előállított következőt vizsgálunk meg, hanem az eggyel nagyobbat, vagy kisebbet, és így a j értéke +-1,2,3,...65535 lehet. Ha ebben a tartományban nem találunk prímet, aminek egyébként a gyakorlat szerint igen kicsi a valószínűsége, akkor előállíthatunk egy újabb véletlen p értéket.


toc