RSA felirat mozgáselmosódott háttéren

Episode I

Alice és Bob

21. fejezet

Alice és Bob titkosít

Az előző fejezetben azt vizsgáltuk meg, hogy a 18. fejezetben bevezetett kongruencia, maradékosztály és maradékosztálygyűrű fogalmai mit jelentenek az egész számok esetében. Láthattuk, hogy a kongruenciákkal nagyjából ugyanúgy kell számolni, mint a hagyományos egyenletekkel, de azért bizonyos esetekben vigyázni kell. Ezután megismerkedtünk az Euler-féle \varphi-függvénnyel, amely a modulo m redukált maradékosztályok számát adja meg. Végül az úgynevezett lineáris kongruenciák megoldhatóságának feltételeit, valamint az Euler-Fermat tételt ismertük meg. Ugyanis az ebben a fejezetben ismertetett RSA eljárás esetén ezek teremtik meg a nyilvános és titkos kulcsok közötti számelméleti kapcsolatot.

De vajon hogyan lehet a kitüntetett közös osztó kiszámítására szolgáló, a 17.4. szakaszban ismertetett euklidészi algoritmust lineáris kongruenciák megoldásához is használni? Hogyan kell kiszámítani az Euler-féle \varphi-függvény értékét egy adott számra, és milyen információra van ehhez szükség? Hogyan működik az RSA nevű aszimmetrikus kulcsú rejtjelező eljárás? Ebben a fejezetben erről lesz szó...

Ezek kontextusba helyezése miatt erőteljesen ajánlott elolvasni a 17., 19. és 20. fejezeteket, mivel gyakran hivatkozni fogunk rájuk.

Kezdjük tehát a lineáris kongruenciák megoldásával. Rögzítsünk egy m\gt 0 pozitív modulust. A 20.8. Definíció és az utána lévő megjegyzés alapján egy ax\equiv b\pmod m lineáris kongruencia egy megoldása alatt egy olyan modulo m maradékosztályt értünk, amelynek bármely elemét behelyettesítve x helyére a kongruencia fennáll.

A 20.13. Tétel alapján a fenti lineáris kongruencia akkor és csak akkor oldható meg – azaz létezik ilyen maradékosztály –, ha megoldható az alábbi úgynevezett lineáris diofantoszi egyenlet:

ax+my=b

Ebben az esetben tehát megoldás alatt olyan egész számpárt értünk, amelyet a fenti egyenletbe x és y helyére behelyettesítve fennáll az egyenlet. Ha tehát egy ilyen egyenletet meg tudunk oldani, akkor bármilyen lineáris kongruenciát is meg tudunk oldani. Azok mindegyike ugyanis egy-egy ilyen egyenletre vezethető vissza. Nézzünk is egy gyors példát egy lineáris diofantoszi egyenlethez vezető egyszerű problémára.

A 7., 10. és 13. fejezetekben szó volt már a messzi-messzi Kompánia országáról. Tegyük fel, hogy ebben az országban az emberek aranytallérokon kívül bankjegyeket is használnak fizetőeszközként. Igenám, csakhogy ebben a furcsa országban mindössze kétféle címlet létezik: 79 és 47 aranytallér névértékű bankjegy. Tegyük fel, hogy Alice kinézett valamilyen ajándékot Bob-nak, amely 10000 aranytallérba kerül, viszont csak bankjegyek vannak nála.

Kérdés, hogy Alice ki tudja-e fizetni pontosan az összeget ezen bankjegyek segítségével, és ha igen, akkor hányféleképpen? Keressük tehát az alábbi lineáris diofantoszi egyenlet megoldásait:

\underbrace{79}_{=a}\cdot x+\underbrace{47}_{=m}\cdot y=\underbrace{10000}_{=b}

Ne feledjük, hogy x-nek és y-nak is egész számnak kell lennie, ráadásul ebben a példában nemnegatív egésznek, mivel a kifizetendő bankjegyek számáról van szó. A 20.13. Tétel alapján a fenti egyenlet akkor és csak akkor oldható meg, ha az (a,m)=(79,47) kitüntetett közös osztó osztója az egyenlet jobboldalának, azaz b=10000-nek. Előszöris tehát ki kell számítanunk a (79,47) kitüntetett közös osztót annak érdekében, hogy eldöntsük, egyáltalán létezik-e megoldás.

A 17.4. szakaszban ismertettük az euklidészi algoritmus alapgondolatát, amely pontosan erre való. Azt is megmutattuk, hogy ez az eljárás minden olyan gyűrűn végrehajtható, amelynek elemei között valamilyen absztrakt értelemben elvégezhető a maradékos osztás. Ezeket a 17.17. Definícióban euklidészi gyűrűknek neveztük el, és a 17.18. Tétel bizonyításában általánosságban is ismertettük az euklidészi algoritmus menetét.

Eszerint a gyűrű bármely a és b elemének kitüntetett közös osztóját megkapjuk az alábbi maradékos osztások során kapott utolsó nemnulla maradékként:

\begin{aligned}a&=k_1b+r_1\\b&=k_2r_1+r_2\\ _1&=k_3r_2+r_3\\ _2&=k_4r_3+r_4\\&\vdots\\ _{n-2}&=k_nr_{n-1}+r_n\\ _{n-1}&=k_{n+1}r_n+0\end{aligned}

Ez jelen esetben tehát r_n lesz:

\begin{aligned}(a,b)&\sim (b,r_1)\sim (r_1,r_2)\sim \ldots\\\ldots&\sim (r_{n-1},r_n)\sim (r_n,0)\sim r_n\end{aligned}

Itt a \sim szimbólum a 16.6. Definíció szerinti asszociáltság relációt jelöli.

Azt is megmutattuk, hogy az eljárás garantáltan végetér véges számú lépés után, mivel az euklidészi függvénynek a kapott maradékoknál felvett értékei egy szigorúan monoton csökkenő sorozatot alkotnak a természetes számok halmazán, és így a 17.15. Tétel értelmében előbb-utóbb biztosan elérik a 0-t.

Az egész számok \Z gyűrűjében a 17.19. Definíció szerinti abszolútérték-függvény a 17.20. Tétel értelmében egy euklidészi függvény – azaz \Z euklidészi gyűrű –, és így ezen a gyűrűn alkalmazható az euklidészi algoritmus. Végrehajtva az algoritmus lépéseit a 79 és 47 bemeneti számokon, az alábbi maradékos osztásokat kapjuk:

\begin{aligned}79&=1\cdot 47+32 \\ 47&=1\cdot 32+15 \\ 32&=2\cdot 15+2 \\ 15&=7\cdot 2+1 \\ 2&=2\cdot 1+0\end{aligned}

Az utolsó nemnulla maradék lesz a két bemeneti szám kitüntetett közös osztója, azaz jelen esetben (79,47)\sim 1. Ez a szám természetesen osztója a 79x+47y=10000 lineáris diofantoszi egyenlet jobboldalának, következésképp ennek az egyenletnek a 20.13. Tétel értelmében létezik megoldása. A 21.1. és a 21.2. szakaszban megmutatjuk, hogy egyrészt hogyan található meg az egyik megoldás az euklidészi algoritmus segítségével, másrészt, hogy ebből hogyan számítható ki az összes többi.

A kibővített euklidészi algoritmus

A 20.13. Tételben igazoltuk, hogy az ax+my=b lineáris diofantoszi egyenlet megolhatóságának szükséges és elégséges feltétele, hogy az egyenlet jobboldala – azaz b – osztható legyen az (a,m) kitüntetett közös osztóval. Az elégségesség bizonyításához a 20.5. szakaszban bemutatott Bézout-lemma volt a kulcs, amely kimondja, hogy ez a kitüntetett közös osztó minden főideálgyűrűben kifejezhető (a,m)=au+mv alakban alkalmasan választott u és v elemek segítségével.

Amennyiben tehát fennáll az (a,m)|b oszthatóság, az azt jelenti, hogy létezik olyan t elem, hogy teljesül az alábbi:

(a,m)\cdot t=b

Ezt összevetve a Bézout-lemmával a következőt kapjuk:

(\underbrace{au+mv}_{=(a,m)})\cdot t=b

Felbontva a zárójelet végsősoron megkapjuk az ax+my=b lineáris diofantoszi egyenlet egy megoldását:

a\cdot \underbrace{ut}_{=x}+m\cdot \underbrace{vt}_{=y}=b

Először tehát meg kell határoznunk az u és v együtthatókat. A Bézout-lemma főideálgyűrűk esetén ugyan garantálja ezek létezését, azonban a korábban ismertetett bizonyítás nem konstruktív abban az értelemben, hogy nem ad eljárást ezek kiszámítására. Szerencsére euklidészi gyűrűk esetén – amelyek ugye a 19.15. Tétel értelmében mindannyian főideálgyűrűk – egy ilyen eljárást is kapunk a kezünkbe, amennyiben a 17.4. szakaszban ismertetett euklidészi algoritmust egy kicsit kibővítjük.

Ezért most egy konstruktív bizonyítást mutatunk a Bézout-lemma euklidészi gyűrűkre vonatkoztatott változatára. Az eredeti bizonyítás nyilván automatikusan érvényes lenne ebben az esetben is, hiszen a 19.15. Tétel alapján minden euklidészi gyűrű főideálgyűrű. Ez azonban csak a keresett u és v együtthatók létezését garantálja, de nem ad eljárást a kiszámításukra. Ezzel szemben az alábbiakban bemutatott bizonyítás konstruktív, mivel ismerteti a kibővített euklidészi algoritmust, amelynek segítségével ezeket az együtthatókat meg is határozhatjuk. Cserébe viszont nem minden főideálgyűrűn, hanem speciálisan csak euklidészi gyűrűkön működik.

21.1. Tétel (Bézout-lemma euklidészi gyűrűkben):

Legyen R euklidészi gyűrű, továbbá legyenek a és b az R tetszőleges elemei. Ekkor az a és b elemek kitüntetett közös osztója kifejezhető a kettejük lineáris kombinációjaként

ua+vb

alakban az R alkalmasan választott u és v elemeinek a segítségével.

Bizonyítás:

Legyen a és b az R két tetszőleges eleme, és jelöljük 0_R-rel a nullelemet, 1_R-rel pedig az egységelemet – amely ugye létezik, hiszen a 17.17. Definíció alapján minden euklidészi gyűrű integritástartomány, tehát egységelemes.

Ha a és b közül mindkettő 0_R, akkor a 17.6. Tétel 5. pontja miatt a kitüntetett közös osztójuk 0_R, amely nyilvánvalóan kifejezhető a kívánt alakban, méghozzá tetszőleges u és v elemekkel:

\underbrace{0_R}_{=a}\cdot u+\underbrace{0_R}_{=b}\cdot v=\underbrace{0_R}_{=(a,b)}

Ha a és b közül csak az egyikük 0_R, akkor viszont ugyanezen tétel 4. pontja miatt a kitüntetett közös osztójuk a másik elem lesz. Ha például a\neq 0_R és b=0_R, akkor (a,b)=(a,0_R)\sim a. Ez nyilván kifejezhető a kívánt alakban u=1_R és tetszőleges v elemekkel:

a\cdot \underbrace{1_R}_{=u}+\underbrace{0_R}_{=b}\cdot v=\underbrace{(a,b)}_{\sim a}

Értelemszerűen ha a=0_R és b\neq 0_R, akkor pedig v=1_R és u tetszőleges.

Az általánosság megsértése nélkül feltételezhetjük tehát, hogy a\neq 0_R és b\neq 0_R. Ekkor lefuttathatjuk erre a két elemre, mint bemenetre a 17.18. Tétel bizonyításában ismertetett euklidészi algoritmust, amely az ott ismertetett gondolatmenet alapján garantáltan befejeződik véges számú lépés után.

Tegyük fel, hogy az algoritmus futtatásakor az n-edik maradékos osztás során kapjuk meg az utolsó nemnulla maradékot, amely ugye az (a,b) kitüntetett közös osztó lesz. Ez tehát az alábbi n darab maradékos osztást jelenti:

\begin{aligned} a&=k_1b+r_1 \\ b&=k_2r_1+r_2 \\ r_1&=k_3r_2+r_3 \\ r_2&=k_4r_3+r_4 \\ &\vdots \\ r_{n-2}&=k_nr_{n-1}+\underbrace{r_n}_{=(a,b)} \end{aligned}

Az utolsó maradékos osztást itt nem tüntettük fel, amelynek során végül a 0_R maradékot megkapjuk és amely terminálja az algoritmust.

Célunk tehát, hogy az n-edik lépésben megkapott r_n maradékot kifejezzük r_n=au+bv alakban valamilyen u és v elemek segítségével. Vegyük észre, hogy az első maradékos osztást leíró egyenlet mindkét oldalából k_1b-t kivonva kapunk egy ehhez hasonló kifejezést az r_1 maradékra. Jelöljük az így kapott együtthatókat u_1-gyel és v_1-gyel:

r_1=a-k_1b=a\cdot \underbrace{1}_{=u_1}+b\cdot \underbrace{(-k_1)}_{=v_1}

Az első lépésben kapott r_1 maradékot tehát ilymódon kifejeztük az a és b lineáris kombinációjaként az u_1=1 és a v_1=-k_1 együtthatók segítségével. Most tegyük meg ugyanezt a második lépésben kapott r_2 maradékkal is. Ehhez semmi mást nem kell tennünk, mint a második maradékos osztást leíró egyenlet mindkét oldalából levonnunk k_2r_1-et, majd r_1 helyére behelyettesíteni az előző lépésben kapott kifejezést. Jelöljük az így kapott együtthatókat u_2-vel és v_2-vel:

\begin{aligned}r_2&=b-k_2r_1=b-k_2(\overbrace{a-k_1b}^{=r_1})=\\&=a\cdot \underbrace{(-k_2)}_{=u_2} + b\cdot \underbrace{(1+k_1k_2)}_{=v_2}\end{aligned}

A második lépésben kapott r_2 maradékot tehát szintén kifejeztük az a és b lineáris kombinációjaként az u_2=-k_2 és a v_2=1+k_1k_2 együtthatók segítségével.

Ezt az eljárást persze folytathatnánk egészen az n-edik lépésig, amikor végül az r_n kitüntetett közös osztót is megkapnánk a és b lineáris kombinációjaként. Mi azonban lusták vagyunk, ezért adunk egy általános képletet, amely megadja, hogy a soron következő r_i maradékot hogyan lehet előállítani a és b lineáris kombinációjaként, ha egyébként az r_{i-2} és r_{i-1} maradékokra ez az előállítás már ismert.

Tegyük fel tehát, hogy az alábbi lineáris kombinációs előállításokat már ismerjük, azaz az alábbi kifejezésekben szereplő u_{i-2} és v_{i-2} valamint u_{i-1} és v_{i-1} együtthatókat már kiszámítottuk:

\begin{aligned}r_{i-2}&=a\cdot u_{i-2} + b\cdot v_{i-2} \\ r_{i-1}&=a\cdot u_{i-1} + b\cdot v_{i-1}\end{aligned}

Feladatunk előállítani az r_i maradékot az a és b elemek lineáris kombinációjaként. Ehhez először is tekintsük az euklidészi algoritmus futtatása során kapott i-edik maradékos osztást leíró egyenletet:

r_{i-2}=k_ir_{i-1}+r_i

Mindkét oldalából vonjunk le k_ir_{i-1}-et:

r_{i-2}-k_ir_{i-1}=r_i

Az i-edik lépésben kapott r_i maradékot tehát kifejeztük az r_{i-2} és r_{i-1} lineáris kombinációjaként. Ez utóbbi kettőről viszont azt mondtuk, hogy már előállítottuk őket a és b lineáris kombinációjaként. Helyettesítsük is be a fenti egyenletbe ezeket az előállításokat:

r_i=(\underbrace{au_{i-2} + bv_{i-2}}_{=r_{i-2}})-k_i\cdot (\underbrace{au_{i-1} + bv_{i-1}}_{=r_{i-1}})

Ezt a 14.12. Definícióban szereplő gyűrűaxiómáknak megfelelően átrendezve megkapjuk r_i-t is a és b lineáris kombinációjaként. Jelöljük az így kapott együtthatókat u_i-vel és v_i-vel:

r_i=a\cdot (\underbrace{u_{i-2}-k_iu_{i-1}}_{=u_i}) + b\cdot (\underbrace{v_{i-2}-k_iv_{i-1}}_{=v_i})

Ezzel a bizonyításunk teljes, mivel az első két lépésben kapott r_1 és r_2 maradékokat előállítottuk a és b lineáris kombinációjaként, az imént konstruált képlet alapján pedig elő tudjuk állítani a további maradékokat is. Ezek közül ugye az n-edik lépés során kapott r_n=au_n+bv_n előállítás épp az (a,b) kitüntetett közös osztó előállítása az a és b lineáris kombinációjaként.

Az iménti bizonyításban látott kibővitett euklidészi algoritmus tehát abban különbözik a 17.4. szakaszban ismertetett eredeti algoritmustól, hogy itt nem csak a futás során kapott r_1, r_2, ..., r_n maradékokat számítjuk ki, hanem a k_1, k_2, ..., k_n hányadosokat is felhasználjuk e maradékok lineáris kombinációs előállításához.

Hogy ne csak a levegőbe beszéljünk, térjünk most vissza a 17.4. szakaszban bemutatott példához, és futtassuk le ezúttal a kibővített euklidészi algoritmust a 12\space 439\space 705\space 049 és a 15\space 828\space 713\space 003 egész számokra. A feladat ismét e két szám kitüntetett közös osztójának kiszámítása – jelöljük ezt most d-vel –, ezúttal azonban ki is szeretnénk őt fejezni e két szám lineáris kombinációjaként. Azaz keressük az alábbi egyenletben szereplő u és v együtthatókat:

d=15\space 828\space 713\space 003\cdot u + 12\space 439\space 705\space 049\cdot v

Ehhez megint használhatunk bármilyen kalkulátort, csak most az osztási maradékokon kívül a hányadosokat is ki kell számolnunk. Ez elvégezhető egy közönséges osztással, aminek az eredményéből a tizedesjegyeket levágva kapjuk meg a keresett hányadost. Ez az egész osztásnak nevezett művelet – itt nem részletezett digitális áramköri okok miatt – az osztási maradék kiszámításához hasonlóan egy számítógép számára rendkívül gyorsan elvégezhető. Ezek után az u_i és v_i együtthatókat az iménti bizonyításban szereplő módon számíthatjuk ki. Az első két lépés együtthatóit tehát az alábbi képletekkel:

\begin{array}{ll}u_1=1 & u_2=-k_2 \\ v_1=-k_1 & v_2=1+k_1k_2\end{array}

A további lépések együtthatóit pedig a megelőző két lépés együtthatóiból az alábbi képletekkel:

\begin{aligned}u_i&=u_{i-2}-k_iu_{i-1} \\ v_i&=v_{i-2}-k_iv_{i-1}\end{aligned}

Ezek alapján az alábbi táblázat mutatja az algoritmus futását:

\begin{array}{c|c|c|c|c|c|c}i & r_{i-2} & r_{i-1} & r_i & k_i & u_i & v_i \\ \hline 1 & 15828713003 & 12439705049 & 3389007954 & 1 & 1 & -1 \\ \hline 2 & 12439705049 & 3389007954 & 2272681187 & 3 & -3 & 4 \\ \hline 3 & 3389007954 & 2272681187 & 1116326767 & 1 & 4 & -5 \\ \hline 4 & 2272681187 & 1116326767 & 40027653 & 2 & -11 & 14 \\ \hline 5 & 1116326767 & 40027653 & 35580136 & 27 & 301 & -383 \\ \hline 6 & 40027653 & 35580136 & 4447517 & 1 & -312 & 397 \\ \hline 7 & 35580136 & 4447517 & 0 & - & - & -\end{array}

A kitüntetett közös osztó az utolsó nemnulla maradék lett, azaz 4\space 447\space 517. Ennek lineáris kombinációs együtthatói pedig ugyanebben a sorban találhatók:

4\space 447\space 517 = \overbrace{(-312)}^{=u}\cdot 15\space 828\space 713\space 003 + \overbrace{397}^{=v}\cdot 12\space 439\space 705\space 049

Lineáris diofantoszi egyenlet megoldásai

Most vizsgáljuk meg, hogy a kibővített euklidészi algoritmus segítségével hogyan kapható meg egy lineáris diofantoszi egyenlet összes megoldása. Az alábbi tételben ezt a kérdést válaszoljuk meg.

21.2. Tétel:

Legyenek a, b és m tetszőleges egész számok úgy, hogy a és m közül legalább az egyik nemnulla. Tegyük fel továbbá, hogy az alábbi lineáris diofantoszi egyenlet megoldható:

ax+my=b

Jelöljük \frac{m}{(a,m)}-mel illetve \frac{a}{(a,m)}-mel azokat az egész számokat, amelyeket az (a,m) kitüntetett közös osztóval megszorozva rendre az m illetve az a egész számot kapjuk eredményül. Ekkor igazak az alábbiak:

1.
Az egyenlet egyik megoldását magkaphatjuk a 21.1. Tétel bizonyításában ismertetett kibővített euklidészi algoritmus segítségével.
2.
Ha az x=s, y=t számpár egy megoldás, akkor tetszőleges k egész szám esetén az alábbi számpár is egy megoldás:
\begin{aligned}x&=s+k\cdot \frac{m}{(a,m)} \\ y&=t-k\cdot \frac{a}{(a,m)}\end{aligned}
3.
Ha az x=s_1, y=t_1 számpár valamint az x=s_2, y=t_2 számpár két tetszőleges megoldás, akkor létezik olyan k egész szám, amelyre igaz az alábbi:
\begin{aligned}s_2&=s_1+k\cdot \frac{m}{(a,m)} \\ t_2&=t_1-k\cdot \frac{a}{(a,m)}\end{aligned}

Megjegyzés:

A tételben szereplő 2. és 3. állítást összevonva tulajdonképpen azt is mondhatjuk, hogy amennyiben az ax+my=b lineáris diofantoszi egyenlet valamelyik x=s, y=t megoldását már ismerjük, akkor az alábbi képlet segítségével megkaphatjuk az összes megoldást, amennyiben a k paraméterrel végigszaladunk az összes létező egész számon:

\begin{aligned}x&=s+k\cdot \frac{m}{(a,m)} \\ y&=t-k\cdot \frac{a}{(a,m)}\end{aligned}

Bizonyítás:

Az általánosság megsértése nélkül feltehetjük, hogy az m\neq 0 feltétel teljesül. Ha ugyanis mégsem így lenne, akkor a tétel szövege alapján szükségképpen teljesül az a\neq 0 feltétel, és az alábbi gondolatmenet az a és m együtthatók szerepének felcserélésével ugyanígy végigjátszható. Először az m\gt 0 esetet igazoljuk.

Az 1. állítás az m\gt 0 esetben: Mivel az egyenlet megoldható, ezért a 20.13. Tétel alapján teljesül az (a,m)|b oszthatóság. Vagyis létezik olyan egész szám, amellyel az (a,m) kitüntetett közös osztót megszorozva b-t kapunk. Jelöljük ezt az egész számot \frac{b}{(a,m)}-mel, azaz:

(a,m)\cdot \frac{b}{(a,m)} = b

A 21.1. Tétel alapján az (a,m) kitüntetett közös osztó felírható az a és m egész számok lineáris kombinációjaként. Azaz léteznek olyan u és v egész számok, hogy teljesül az alábbi:

(a,m)=au+mv

Ezt összevetve az előző egyenlettel:

(\underbrace{au+mv}_{=(a,m)})\cdot \frac{b}{(a,m)} = a\cdot (\underbrace{u\cdot \frac{b}{(a,m)}}_{=x}) + m\cdot (\underbrace{v\cdot \frac{b}{(a,m)}}_{=y}) = b

Azaz lényegében megkaptuk az ax+my=b lineáris diofantoszi egyenlet egy megoldását:

\begin{aligned}x&=u\frac{b}{(a,m)} \\ y&=v\frac{b}{(a,m)}\end{aligned}

Az u és v együtthatók a 21.1. Tétel bizonyításában szereplő kibővített euklidészi algoritmussal hatékonyan kiszámíthatók.

A 2. állítás az m\gt 0 esetben: Tegyük fel, hogy az x=s, y=t számpár egy megoldása az ax+my=b egyenletnek, és helyettesítsük be ugyanebbe az egyenletbe az állításban szereplő számpárt:

a\cdot(\underbrace{s+k\cdot \frac{m}{(a,m)}}_{=x})+m\cdot (\underbrace{t-k\cdot \frac{a}{(a,m)}}_{=y})=b

A zárójeleket felbontva az alábbit kapjuk:

as+ka\cdot \frac{m}{(a,m)}+mt-km\cdot \frac{a}{(a,m)}=b

Szorozzuk meg mindkét oldalt az (a,m) kitüntetett közös osztóval:

as\cdot (a,m)+ka\cdot \frac{m}{(a,m)}\cdot (a,m)+mt\cdot (a,m)-km\cdot \frac{a}{(a,m)}\cdot (a,m)=b\cdot (a,m)

A tétel szövege alapján \frac{m}{(a,m)}\cdot (a,m)=m és \frac{a}{(a,m)}\cdot (a,m)=a, ezért az alábbit kapjuk:

as\cdot (a,m)+\cancel{kam}+mt\cdot (a,m)-\cancel{kma}=b\cdot (a,m)

Mivel m\neq 0, és teljesül az (a,m)|m oszthatóság – hiszen (a,m) közös osztó –, ezért az oszthatóság tulajdonságairól szóló 16.2. Tétel 4. pontja miatt (a,m)\neq 0, és így a 15.4. Tétel alapján az egyenlet mindkét oldalát lehet egyszerűsíteni vele:

as+mt=b

Ez viszont teljesül, mivel az x=s, y=t számpárról tudjuk, hogy megoldása az ax+my=b egyenletnek.

A 3. állítás az m\gt 0 esetben: Tegyük fel, hogy az x=s_1, y=t_1 számpár, valamint az x=s_2, y=t_2 számpár is megoldása az ax+my=b egyenletnek.

Ez a 20.13. Tétel alapján azt jelenti, hogy az [s_1]_m és az [s_2]_m maradékosztályok egyaránt megoldásai az ax\equiv b\pmod m lineáris kongruenciának, azaz tejesülnek az alábbiak:

\begin{aligned}as_1&\equiv b\pmod m \\ as_2&\equiv b\pmod m\end{aligned}

A 20.2. Tétel 4. pontja miatt ez a két kongruencia kivonható egymásból. A másodikat az elsőből kivonva ezt kapjuk:

a\cdot (s_2-s_1)\equiv 0\pmod m

A kongruenciák egyszerűsítéséről szóló 20.3. Tétel alapján mindkét oldalt egyszerűsíthetjük a-val, amennyiben az m modulust is egyszerűsítjük az (a,m) kitüntetett közös osztóval. Ezt végrehajtva a következőt kapjuk:

s_2-s_1\equiv 0\pmod{\frac{m}{(a,m)}}

Ez a kongruencia a 20.1. Tétel 3. pontja alapján épp azt jelenti, hogy teljesül az alábbi oszthatóság:

\frac{m}{(a,m)}|s_2-s_1

Az oszthatóság 16.1. Definíciója alapján ez azt jelenti, hogy létezik olyan k egész szám, amelyre teljesül az alábbi egyenlet:

k\cdot \frac{m}{(a,m)}=s_2-s_1

Mindkét oldalhoz s_1-et adva megkapjuk a tételben szereplő képletet s_2-re:

s_2=s_1+k\cdot \frac{m}{(a,m)}

Mostmár csak a t_2-t kellene valahogy kifejezni t_1-ből. Azt ugye tudjuk, hogy az x=s_1, y=t_1 számpár, valamint az x=s_2, y=t_2 számpár is megoldása az ax+my=b egyenletnek, azaz:

\begin{aligned}as_1+mt_1&=b \\ as_2+mt_2&=b\end{aligned}

A második egyenletből az elsőt kivonva az alábbit kapjuk:

a(s_2-s_1)+m(t_2-t_1)=0

Az s_2 helyére a fentebb megkapott képletet behelyettesíthetjük:

a(\underbrace{s_1+k\cdot \frac{m}{(a,m)}}_{=s_2}-s_1)+m(t_2-t_1)=0

Azaz:

\cancel{as_1}+ak\cdot \frac{m}{(a,m)}-\cancel{as_1}+m(t_2-t_1)=0

A tétel szövege alapján \frac{m}{(a,m)}\cdot (a,m)=m, ezért mindkét oldalt az (a,m) kitüntetett közös osztóval megszorozva ezt kapjuk:

akm+m\cdot (a,m)\cdot (t_2-t_1)=0

Mivel m\neq 0, ezért a 15.4. Tétel alapján az egyenlet mindkét oldalát lehet egyszerűsíteni vele:

ak+(a,m)\cdot (t_2-t_1)=0

Mindkét oldalból ak-t levonva ezt kapjuk:

(a,m)\cdot (t_2-t_1)=-ak

A tétel szövege alapján \frac{a}{(a,m)}\cdot (a,m)=a, így:

(a,m)\cdot (t_2-t_1)=-k\cdot \underbrace{\frac{a}{(a,m)}\cdot (a,m)}_{=a}

Mivel m\neq 0, és teljesül az (a,m)|m oszthatóság – hiszen (a,m) közös osztó –, ezért az oszthatóság tulajdonságairól szóló 16.2. Tétel 4. pontja miatt (a,m)\neq 0, és így a 15.4. Tétel alapján az egyenlet mindkét oldalát lehet egyszerűsíteni vele:

t_2-t_1=-k\cdot \frac{a}{(a,m)}

Mindkét oldalhoz t_1-et adva megkapjuk a tételben szereplő képletet t_2-re:

t_2=t_1-k\cdot \frac{a}{(a,m)}

Ezzel a tétel mindhárom állítását igazoltuk az m\gt 0 esetben. Erre viszonylag könnyen visszavezethetjük az m\lt 0 esetet, amennyiben kihasználjuk azt a tényt, hogy a 15.12. Definíció utáni megjegyzés alapján ekkor -m\gt 0. Ennek technikai részleteit az alábbiakban ismertetjük:

Az m\lt 0 eset

Az 1. állítás az m\lt 0 esetben: Mivel ekkor tehát -m\gt 0, ezért az ax+(-m)y=b egyenlet egy megoldását az 1. állítás eddigi bizonyítása alapján kiszámíthatjuk a kibővített euklidészi algoritmus segítségével. Tegyük fel, hogy eredményként az x=s, y=t számpárt kapjuk, azaz teljesül az alábbi:

as+(-m)t=b

A 15.1. Tétel 3. pontja alapján az egyenlet baloldala átírható a következőképpen:

as+m(-t)=b

Azaz lényegében megkaptuk az eredeti ax+my=b egyenlet egy megoldását:

\begin{aligned} x&=s \\ y&=-t \end{aligned}

A 2. állítás az m\lt 0 esetben: Tegyük fel, hogy az x=s, y=t számpár megoldása az ax+my=b egyenletnek. Ekkor az előbbivel megegyező gondolatmenet alapján az x=s, y=-t számpár viszont megoldása az ax+(-m)y=b egyenletnek.

Mivel -m\gt 0, ezért a 2. állítás eddigi bizonyítása alapján tetszőleges k egész szám esetén az alábbi számpár is megoldása az ax+(-m)y=b egyenletnek:

\begin{aligned} x&=s+k\cdot \frac{-m}{(a,-m)}=s-k\cdot \frac{m}{(a,-m)} \\ y&=-t-k\cdot \frac{a}{(a,-m)} \end{aligned}

A 16.8. Tétel 1. pontja alapján m és az ellentettje egymás asszociáltjai – azaz pontosan ugyanazok az osztóik és a többszöröseik –, emiatt teljesül az (a,-m)=(a,m) egyenlőség, vagyis az ax+(-m)y=b egyenlet iménti megoldása átírható így:

\begin{aligned}x&=s-k\cdot \frac{m}{(a,m)} \\ y&=-t-k\cdot \frac{a}{(a,m)}\end{aligned}

Ekkor azonban az 1. állítás m\lt 0 esetre adott bizonyítása alapján az alábbi számpár megoldása az eredeti ax+my=b egyenletnek:

\begin{aligned} x&=s-k\cdot \frac{m}{(a,m)} \\ y&=-(-t-k\cdot \frac{a}{(a,m)})=t+k\cdot \frac{a}{(a,m)} \end{aligned}

Ha tehát kiválasztunk egy tetszőleges l egész számot, akkor az iménti gondolatmenetet a k=-l helyettesítéssel végigjátszva az eredeti ax+my=b egyenlet egy x=s, y=t megoldásából valóban egy újabb megoldást kapunk a tételben szereplő képlettel:

\begin{aligned} x&=s+l\cdot \frac{m}{(a,m)} \\ y&=t-l\cdot \frac{a}{(a,m)} \end{aligned}

Végül a 3. állítás az m\lt 0 esetben: Tegyük fel, hogy az x=s_1, y=t_1 számpár és az x=s_2, y=t_2 számpár két tetszőleges megoldása az ax+my=b egyenletnek. Ekkor az 1. állítás m\lt 0 esetre adott bizonyítása alapján az x=s_1, y=-t_1 és az x=s_2, y=-t_2 számpárok megoldásai az ax+(-m)y=b egyenletnek.

Mivel -m\gt 0, ezért a 3. állítás eddigi bizonyítása alapján létezik olyan k egész szám, amelyre teljesülnek az alábbiak:

\begin{aligned}s_2&=s_1+k\cdot \frac{-m}{(a,-m)}=s_1-k\cdot \frac{m}{(a,-m)} \\ -t_2&=-t_1-k\cdot \frac{a}{(a,-m)}\end{aligned}

A második egyenlet mindkét oldalának ellentettjét véve, továbbá ismét alkalmazva a 16.8. Tétel 1. pontja alapján fennálló (a,-m)=(a,m) egyenlőséget ezt kapjuk:

\begin{aligned} s_2&=s_1-k\cdot \frac{m}{(a,m)} \\ t_2&=t_1+k\cdot \frac{a}{(a,m)} \end{aligned}

Az l=-k választással élve tehát valóban találtunk olyan egész számot, amely esetén az eredeti ax+my=b egyenlet bármely két x=s_1, y=t_1 és x=s_2, y=t_2 megoldásai között fennáll a tételben szereplő alábbi összefüggés:

\begin{aligned} s_2&=s_1+l\cdot \frac{m}{(a,m)} \\ t_2&=t_1-l\cdot \frac{a}{(a,m)} \end{aligned}

Most térjünk vissza a fejezet elején felvetett kompániai példánkhoz, és az iménti tétel alapján határozzuk meg, hogy hányféleképpen tudja Alice kifizetni a Bob-nak szánt 10000 aranytalléros ajándékot, amennyiben csak 79 és 47 aranytallér névértékű bankjegyek állnak rendelkezésére. Keressük tehát a nemnegatív egész megoldásait az alábbi lineáris diofantoszi egyenletnek:

\underbrace{79}_{=a}\cdot x + \underbrace{47}_{=m}\cdot y=\underbrace{10000}_{=b}

Azt már az euklidészi algoritmus segítségével kiszámítottuk, hogy a (79,47) kitüntetett közös osztó 1, aminek nyilván többszöröse az egyenlet jobboldalán szereplő 10000. Így tehát ennek az egyenletnek létezik egész megoldása. Kérdés, hogy vajon nemnegatív egész megoldás is létezik-e, és ha igen, akkor mennyi? Ehhez először meg kell határoznunk az összes megoldást.

Az imént bizonyított a 21.2. Tétel 1. pontja alapján az egyik megoldást a kibővített euklidészi algoritmus segítségével határozhatjuk meg, amelyből aztán a 2. és 3. állítás értelmében könnyedén előállíthatjuk az összes megoldást. Ezekből már látni fogjuk, hogy van-e közöttük olyan, amely esetén x is és y is nemnegatív.

Futtassuk hát le a két együtthatón a kibővített euklidészi algoritmust, és állítsuk elő a kitüntetett közös osztójukat a lineáris kombinációjukként:

\begin{array}{c|c|c|c|c|c|c}i & r_{i-2} & r_{i-1} & r_i & k_i & u_i & v_i \\ \hline 1 & 79 & 47 & 32 & 1 & 1 & -1 \\ \hline 2 & 47 & 32 & 15 & 1 & -1 & 2 \\ \hline 3 & 32 & 15 & 2 & 2 & 3 & -5 \\ \hline 4 & 15 & 2 & 1 & 7 & -22 & 37 \\ \hline 5 & 2 & 1 & 0 & - & - & -\end{array}

A megkapott lineáris kombináció tehát az alábbi:

(79,47) = \underbrace{(-22)}_{=u}\cdot 79 + \underbrace{37}_{=v}\cdot 47=1

Minthogy fennáll az oszthatóság a (79,47) kitüntetett közös osztó és az egyenlet jobboldalán szereplő 10000 között, ezért létezik az ő hányadosuk, amelyet jelöljünk most \frac{10000}{(79,47)}-tel. Ez tehát egy egész szám, amelyre teljesül az alábbi:

(79,47)\cdot \frac{10000}{(79,47)}=10000

A hányadost egy egész osztással kiszámítva – ami jelen esetben nyilván 10000 lesz, mivel a "nevezőben" szereplő kitüntetett közös osztó 1 –, valamint felhasználva az imént előállított lineáris kombinációt az alábbit kapjuk:

(\underbrace{79\cdot (-22)+47\cdot 37}_{=(79,47)})\cdot \underbrace{10000}_{=\frac{10000}{(79,47)}}=10000

A baloldalon lévő zárójelet felbontva tulajdonképpen megkaptuk a 79x+47y=10000 egyenlet egyik megoldását:

\underbrace{79}_{=a}\cdot \underbrace{(-220000)}_{=x} + \underbrace{47}_{=m}\cdot \underbrace{370000}_{=y}=\underbrace{10000}_{=b}

Ebben a megoldásban az x sajnos negatív, így ez nem egy jó megoldás számunkra. A 21.2. Tétel 2. és 3. állításai alapján azonban az alábbi képlet segítségével megkapjuk az összes megoldást, amennyiben a k paraméterrel végigszaladunk az összes létező egész számon:

\begin{aligned}x&=-220000+47k \\ y&=370000-79k\end{aligned}

Mi alapvetően lusták vagyunk, így nem szeretnénk a k paraméter végtelen sok lehetséges értékét végigvizsgálni azért, hogy megtudjuk, mikor kapunk nemnegatív számot x-re és y-ra egyaránt.

Ehelyett az alábbi egyenlőtlenségeket írjuk fel:

\begin{aligned}0\leq \overbrace{-220000+47k}^{=x} \\ 0\leq \underbrace{370000-79k}_{=y}\end{aligned}

Mivel a 15.11. Definíció szerinti 1. rendezési axióma alapján az összeadás kompatibilis a rendezési relációval, ezért e két egyenlőtlenség átalakítható:

\begin{aligned} 220000\leq 47k \\ 79k\leq 370000 \end{aligned}

A \frac{220000}{47} és a \frac{370000}{79} egész osztásokat elvégezve azt kapjuk, hogy mindössze a k=4681, k=4682 és a k=4683 esetekben lesz a megoldás nemnegatív. Alice tehát háromféleképpen tudja kifizetni a 10000 aranytallért a Bobnak szánt ajándékra, amennyiben csak 79 és 47 aranytallér névértékű bankjegyek vannak nála:

\begin{aligned}10000&=7\cdot 79+201\cdot 47=\\&=54\cdot 79+122\cdot 47=\\&=101\cdot 79+43\cdot 47\end{aligned}

Félretéve a szöveges feladatot, most próbáljuk meg a 79x+47y=10000 lineáris diofantoszi egyenlet összes megoldását – amelyekbe tehát mostmár a negatívakat is beleértjük – egy kétdimenziós koordináta-rendszerben ábrázolni, ahol a két tengely a megoldásokhoz tartozó x és y értékeket jelenti.

A megoldásokat szolgáltató képletből látható, hogy ha egy adott megoldásból kiindulva a k értékét 1-gyel megnöveljük, akkor az így kapott új megoldáshoz tartozó x értéke 47-tel nő, míg az y értéke 79-cel csökken. Így tehát a megoldások mindannyian egy ferdén lefelé tartó egyenes mentén fognak elhelyezkedni – innen ered a "lineáris" elnevezés. A 21.1. ábrán a k paraméternek az adott megoldásokhoz tartozó értékeit is feltüntettük.

Lineáris diofantoszi egyenlet megoldásai
21.1. ábra: Lineáris diofantoszi egyenlet megoldásai

Ebből szépen látható, hogy valóban csak a k=4681, k=4682 és a k=4683 értékekhez tartozó megoldások esnek a jobb-felső síknegyedbe – amikoris mindkét koordináta pozitív.

Az ebben a szakaszban ismertetett módszerrel tehát bármilyen lineáris diofantoszi egyenletet, és így a 20.13. Tétel alapján bármilyen lineáris kongruenciát meg tudunk oldani. Ezzel az RSA rejtjelező eljárás egyik fontos összetevője már a kezünkben van. Most ismerkedjünk meg egy másik fontos összetevővel.

Az Euler-féle \varphi-függvény kiszámítása

Ebben a szakaszban megtanuljuk, hogy hogyan lehet kiszámítani a 20.7. Definícióban ismertetett Euler-féle \varphi-függvény értékét bármilyen tetszőleges pozitív egész számra. A definíció szerint egy m pozitív egész szám esetén ez a függvény a modulo m redukált maradékosztályok számát adja meg. A 20.6. Definíció alapján ezek épp a 20.5. Tételben definiált \Z/m\Z maradékosztálygyűrű azon elemei, amelyek invertálhatók a maradékosztályok közötti szorzásra nézve.

A 20.18. Következményben megmutattuk, hogy ez a szám éppenséggel megegyezik a 0 és m közötti, m-hez relatív prímek számával, amely tehát az Euler-féle \varphi-függvénynek egy alternatív definícióját adja. Például a 0 és 18 közötti, 18-hoz relatív prímek halmaza az alábbi számhalmaz:

\{1; 5; 7; 11; 13; 17\}

Ezek száma 6, így tehát \varphi(18)=6. Az alábbi tételben a \varphi-függvény egy fontos tulajdonságát igazoljuk.

21.3. Tétel:

Legyen a és b két tetszőleges, egymáshoz relatív prím pozitív egész szám. Ekkor teljesül az alábbi:

\varphi(ab)=\varphi(a) \cdot \varphi(b)

Bizonyítás:

A \varphi(ab) azon ab-nél nemnagyobb pozitív egészeknek a számával egyezik meg, amelyek ab-hez relatív prímek. A 20.12. Következmény alapján bármilyen tetszőleges egész szám akkor és csak akkor relatív prím ab-hez, ha relatív prím a-hoz is és b-hez is.

A \varphi(ab) érték kiszámításához tehát azokat az ab-nél nemnagyobb pozitív egészeket kell megszámlálnunk, amelyek relatív prímek a-hoz is és b-hez is. Ezt a következő lépésekben fogjuk megtenni:

  1. Összegyűjtjük az összes a-hoz relatív prím egész számot.
  2. Ezek közül kiválasztjuk azokat, amelyek 0 és ab közé esnek.
  3. Végül a maradékból kiválogatjuk azokat, amelyek b-hez is relatív prímek.
1. lépés

A 20.15. Tétel alapján az a-hoz relatív prímek pontosan a modulo a redukált maradékosztályok elemei lesznek. Ilyenből a 20.7. Definíció alapján épp \varphi(a) darab van. E \varphi(a) darab modulo a redukált maradékosztály mindegyikéből válasszuk ki a legkisebb pozitív elemet. Az így kapott r_1, r_2, ..., r_{\varphi(a)} számok tehát reprezentálják az összes modulo a redukált maradékosztályt.

A 20.4. Tétel alapján e maradékosztályok elemei – és csak azok – kifejezhetők az r_1, r_2, ..., r_{\varphi(a)} reprezentánselemek segítségével az alábbi táblázat szerint, ahol minden oszlop egy-egy redukált maradékosztálynak felel meg:

\begin{array}{c|c|c|c}[r_1]_a & [r_2]_a & \cdots & [r_{\varphi(a)}]_a \\ \hline \vdots & \vdots & & \vdots \\ r_1-2a & r_2-2a & \cdots & r_{\varphi(a)}-2a \\ r_1-1a & r_2-1a & \cdots & r_{\varphi(a)}-1a \\ r_1+0a & r_2+0a & \cdots & r_{\varphi(a)}+0a \\ r_1+1a & r_2+1a & \cdots & r_{\varphi(a)}+1a \\ r_1+2a & r_2+2a & \cdots & r_{\varphi(a)}+2a \\ r_1+3a & r_2+3a & \cdots & r_{\varphi(a)}+3a \\ \vdots & \vdots & & \vdots \end{array}
2. lépés

Most minden olyan számot kidobálunk ebből a táblázatból, amely nem 0 és ab közé esik. Mivel az r_1, r_2, ..., r_{\varphi(a)} reprezentánselemeket úgy választottuk ki, hogy minden oszlopban ők legyenek a legkisebb pozitív egészek, ezért a táblázat ezek fölötti sorait ki is hajíthatjuk, hiszen ott már csupa negatív szám szerepel. Kérdés, hogy a táblázatban lefelé meddig mehetünk el a k paraméterrel úgy, hogy bármely i-edik oszlopban az r_i+ka\lt ab egyenlőtlenség még éppen teljesüljön? A határvonal épp a k=b-1 érték lesz.

Ezt ugyanis behelyettesítve az egyenlőtlenségbe, valamint kihasználva a 15.11. Definíció szerinti 1. rendezési axiómát, az alábbi adódik:

\begin{aligned} r_i+\overbrace{(b-1)}^{=k}a&\lt ab \\ r_i+\cancel{ba}-a&\lt \cancel{ab} \\ r_i\lt a \end{aligned}

Ez viszont nyilvánvalóan teljesül, hiszen r_i-t úgy választottuk ki, hogy ő az egyik maradékosztály legkisebb pozitív eleme legyen. Minthogy a 0, 1, 2, ..., a-1 számok az összes létező modulo a maradékosztályt reprezentálják, ezért r_i is szükségképpen közöttük van.

Másrészt viszont a k=b érték már nem megfelelő, ha ugyanis ezt helyettesítjük be az egyenlőtlenségbe, akkor az alábbit kapjuk:

\begin{aligned}r_i+\overbrace{b}^{=k}\cdot a&\lt ab \\ r_i&\lt 0\end{aligned}

Ez az egyenlőtlenség már nem teljesül, hiszen az r_i-t pozitívnak választottuk. Az 1. lépésben keletkezett táblázatból tehát az alábbi rész maradt meg, a többit kidobáltuk:

\begin{array}{c|c|c|c}[r_1]_a & [r_2]_a & \cdots & [r_{\varphi(a)}]_a \\ \hline r_1+0a & r_2+0a & \cdots & r_{\varphi(a)}+0a \\ r_1+1a & r_2+1a & \cdots & r_{\varphi(a)}+1a \\ r_1+2a & r_2+2a & \cdots & r_{\varphi(a)}+2a \\ \vdots & \vdots & & \vdots \\ r_1+(b-1)a & r_2+(b-1)a & \cdots & r_{\varphi(a)}+(b-1)a \end{array}

Ez a táblázat tehát tartalmazza az összes olyan 0 és ab közé eső egész számot, amely relatív prím a-hoz.

3. lépés

Ez tehát egy \varphi(a) oszlopból álló táblázat, és minden oszlopban b darab szám van. Tekintsük például az i-edik oszlopot. Ennek elemei a következők:

\begin{aligned} r_i&+0a \\ r_i&+1a \\ r_i&+2a \\ &\vdots \\ r_i&+(b-1)a \end{aligned}

Vegyük észre, hogy ezt a számhalmazt úgy kaptuk, hogy a \{0;1;2;\ldots;b-1\} számhalmaz minden elemét megszoroztuk a-val – ami ugye a tétel szövege alapján relatív prím b-hez –, majd az így kapott számokhoz hozzáadtunk r_i-t. Mivel azonban a \{0;1;2;\ldots;b-1\} számhalmaz nem más, mint egy modulo b teljes maradékrendszer, ezért a 20.19. Tétel alapján az újonnan kapott számhalmaz is az.

Mivel a táblázat minden oszlopa ugyanígy képződött, ezért a táblázat minden oszlopában tulajdonképpen egy-egy modulo b teljes maradékrendszer áll. Minden oszlopban képviselve van tehát az összes modulo b maradékosztály. Mivel ezek közül a redukált maradékosztályok száma az Euler-féle \varphi-függvény a 20.7. Definíciója alapján \varphi(b), ezért ez egyben azt is jelenti a 20.18. Következmény alapján, hogy minden oszlopban \varphi(b) darab olyan elem van, amely relatív prím b-hez. Minthogy a táblázatban az oszlopok száma \varphi(a), így a táblázatnak összesen \varphi(a)\cdot \varphi(b) eleme relatív prím b-hez is.

Összefoglalva: Összesen tehát \varphi(a)\cdot \varphi(b) darab olyan 0 és ab közötti egész szám létezik, amely relatív prím a-hoz is és b-hez is. Ezek száma a bizonyítás elején közölt észrevétel alapján megegyezik azon 0 és ab közötti egészek számával, amelyek relatív prímek ab-hez. Ezek száma viszont a 20.18. Következmény alapján \varphi(ab), így tehát valóban teljesül a tétel állítása:

\varphi(ab)=\varphi(a)\cdot \varphi(b)

Például próbáljuk ez alapján meghatározni a \varphi(77) értékét. Ehhez a 77 prímtényezős felbontását, valamint az iménti tételt használva az alábbi adódik:

\varphi(77)=\varphi(7\cdot 11)=\varphi(7)\cdot \varphi(11)

Ha feltételezzük, hogy a \varphi(7)=6 és a \varphi(11)=10 értékeket valahogyan kiszámítottuk, akkor a \varphi(77)=60 végeredmény már könnyen adódik. Az alábbiakban ezt a "valahogyant" vizsgáljuk meg. Ehhez azonban szükségünk lesz az alábbi segédtételre.

21.4. Lemma:

Legyen a tetszőleges, k\gt 0 pedig valamilyen pozitív egész szám. Ekkor tetszőleges p prímszám esetén az a egész szám akkor és csak akkor relatív prím a p^k hatványhoz, ha nem osztható p-vel, azaz

p\nmid a

Bizonyítás:

Tegyük fel ugyanis, hogy teljesül a p|a oszthatóság. Ekkor – mivel a p|p^k oszthatóság nyilvánvalóan teljesül – p egy közös osztója lesz a-nak és p^k-nak. Mivel a tétel szövege szerint p prím – és így a 16.13. Definíció szerint nem egység –, ezért a és p^k valóban nem lehetnek relatív prímek egymáshoz. Másként fogalmazva ha a és p^k relatív prímek egymáshoz, akkor valóban nem teljesülhet a p|a oszthatóság.

Visszafelé: Tegyük most fel, hogy a nem osztható p-vel, azaz p\nmid a. Azt kell igazolnunk, hogy ekkor a és p^k bármely közös osztója egység, mivel ez a 17.10. Definíció alapján épp azt jelenti, hogy ők relatív prímek egymáshoz. Legyen tehát d egy tetszőleges közös osztó, azaz d|a és d|p^k.

Vegyük észre, hogy ha valahogy igazolni tudnánk, hogy d és p relatív prímek, akkor d|p^k-ból az Euklidészi lemma ismételt alkalmazásával következnének az alábbi oszthatóságok:

\begin{aligned} d|\overbrace{p\cdot p^{k-1}}^{=p^k} &\implies d|p^{k-1} \\ d|\overbrace{p\cdot p^{k-2}}^{=p^{k-1}} &\implies d|p^{k-2} \\ d|\overbrace{p\cdot p^{k-3}}^{=p^{k-2}} &\implies d|p^{k-3} \\ &\vdots \\ d|\overbrace{p\cdot p}^{=p^2} &\implies d|p \\ d|\overbrace{p\cdot 1}^{=p} &\implies d|1 \end{aligned}

Vagyis végsősoron d és p relatív prímségéből megkapnánk, hogy a tetszőlegesen választott d közös osztó valóban egység. A d és p relatív prímségének igazolását alább részletezzük.

Miért relatív prím d és p?

Mivel nyilván d|a – hiszen d az a és p^k közös osztója –, ezért p\nmid d, máskülönben p|d-ből d|a mellett a 16.2. Tétel 5. pontja miatt p|a következne, amiről feltettük, hogy nem igaz. Jegyezzük meg tehát, hogy p\nmid d, mert hamarosan szükségünk lesz erre.

Most vizsgáljuk meg d és p valamely tetszőleges c közös osztóját, amiről tehát meg kell mutatnunk, hogy szükségképpen egység. Mivel c közös osztó, ezért teljesülnek a c|d és a c|p oszthatóságok. A c|p oszthatóság a 16.1. Definíció alapján azt jelenti, hogy létezik olyan q egész szám, amelyre teljesül az alábbi egyenlet:

p=cq

Ám ekkor a 16.2. Tétel 1. pontja miatt nyilván teljesül a p|cq oszthatóság, és így p prímtulajdonsága miatt teljesül az alábbi oszthatóságok közül legalább az egyik:

\begin{aligned} p&|c \\ p&|q \end{aligned}

Igenám, de p|c nem teljesülhet, mivel ekkor c|d mellett a 16.2. Tétel 5. pontja miatt p|d következne, amiről már igazoltuk, hogy lehetetlen. Így tehát szükségképpen teljesül p|q, ami a 16.1. Definíció alapján azt jelenti, hogy létezik olyan r egész szám, amelyre teljesül az alábbi egyenlet:

q=pr

A q-ra kapott kifejezést behelyettesítve az első egyenletbe ezt kapjuk:

p=c\underbrace{pr}_{=q}

Minthogy p prím, ezért nem 0, és így a 15.4. Tétel alapján lehet egyszerűsíteni vele:

1=cr

Ez a 16.1. Definíció alapján azt jelenti, hogy c|1, tehát c a 16.5. Tétel szerint valóban egység.

Ennek segítségével mostmár tetszőleges prímszámra – vagy még általánosabban tetszőleges prímhatványra – könnyedén ki tudjuk számítani az Euler-féle \varphi-függvény értékét.

21.5. Tétel:

Legyen p\gt 0 valamilyen pozitív prímszám, k\gt 1 pedig tetszőleges, 1-nél nagyobb pozitív egész szám. Ekkor teljesül az alábbi:

\varphi(p^k)=p^k-p^{k-1}

Speciálisan prímszámok esetén:

\varphi(p)=p-1

Bizonyítás:

A \varphi(p^k) a 20.18. Következmény alapján a 0, 1, 2, ..., p^k-1 közül a p^k-hoz relatív prímek számát adja meg. Nincs más dolgunk tehát, mint ezeket megszámlálni. A 21.4. Lemma szerint egy tetszőleges a egész szám akkor és csak akkor relatív prím p^k-hoz, ha nem osztható p-vel.

Ahhoz tehát, hogy megkapjuk \varphi(p^k) értékét, meg kell számolnunk, hogy összesen hány p-vel osztható egész szám van az első p^k darab pozitív egész szám között. A 21.4. Lemma alapján ugyanis épp az ezeken kívüli számok lesznek relatív prímek p^k-hoz. A p-vel osztható számok ebben a tartományban az alábbiak lesznek:

\begin{aligned}1&\cdot p \\ 2&\cdot p \\ 3&\cdot p \\ &\vdots \\ p^{k-1}&\cdot p\end{aligned}

Ezek száma tehát összesen p^{k-1}. Ezt levonva p^k-ból valóban \varphi(p^k) értékét kapjuk, ahogyan a tétel állítja:

\varphi(p^k)=p^k-p^{k-1}

Végül a speciális eset: A \varphi(p) a 20.18. Következmény alapján a 0, 1, 2, ..., p-1 számok közül a p-hez relatív prímek számát adja meg. Ezt ugyanúgy a 21.4. Lemma alapján tudjuk megszámlálni: megszámláljuk, hogy hány p-vel osztható van ezek között, majd ezt levonjuk a darabszámukból, ami ugye p.

A 0 biztosan osztható p-vel a 16.2. Tétel 3. pontja miatt. A felsorolt további számok közül viszont egyik sem osztható p-vel. Tegyük fel ugyanis indirekt, hogy nem ez a helyzet, vagyis létezik olyan r közöttük, hogy p|r. Ebből a 17.2. Lemma alapján p\leq r következne, ami ellentmondás.

Mivel tehát a 0, 1, 2, ..., p-1 számok közül csak a 0 volt osztható p-vel, így a 21.4. Lemma alapján valóban a maradék p-1 darab szám lesz relatív prím p-hez, azaz:

\varphi(p)=p-1

Ennek és a 21.3. Tételnek a segítségével mostmár bármilyen m\gt 0 pozitív egész szám esetén könnyedén ki tudjuk számítani a \varphi(m) értéket. Ehhez "mindössze" az m egész szám prímtényezős felbontására van szükségünk.

Tegyük fel például, hogy szeretnénk kiszámítani a \varphi(93\ 372\ 871) értéket a 93\ 372\ 871 prímtényezős felbontásának ismeretében, amely a következő:

93\ 372\ 871=5387\cdot 17333

Ehhez alkalmazhatjuk a 21.3. és a 21.5. Tételt:

\begin{aligned}\varphi(93\ 372\ 871)&=\varphi(5387)\cdot \varphi(17333)=\\&=5386\cdot 17332=93\ 350\ 152\end{aligned}

Ha tehát ismerjük a bemeneti m egész szám prímtényezős felbontását, akkor könnyedén ki tudjuk számítani a \varphi(m) értéket. Ami viszont kriptográfiai szempontból hasonlóan fontos: Ha nem ismerjük m prímtényezős felbontását, akkor nem ismeretes hatékony algoritmus \varphi(m) kiszámításához. Ez lényeges szerepet játszik az RSA rejtjelező eljárás esetén. Mielőtt azonban ezt ismertetnénk, szükségünk van egy harmadik összetevőre is.

Az ismételt négyzetreemelések módszere

A 18. fejezetben többek között a Diffie-Hellman kulcscsere protokoll kapcsán merült fel – ebben a fejezetben pedig az RSA eljárás kapcsán fog felmerülni – az igény arra, hogy hatékonyan tudjunk hatványozni az úgynevezett "óraaritmetikában". Egy ott szereplő példában annak meghatározása volt a feladat, hogy a 2^{328} hatvány mennyi maradékot ad 11-gyel osztva. Megmutattuk, hogy ez tulajdonképpen a 18.3. Definíció szerinti Z_{11} gyűrűben elvégzett hatványozásnak felel meg, méghozzá a \bmod_{11} maradékképző függvény művelettartó tulajdonságai miatt.

Eszerint tehát ahelyett, hogy először a \Z gyűrűben számítanánk ki a 2^{328} hatványt, és vennénk ennek a bődületesen nagy számnak a 11-gyel való osztási maradékát, a Z_{11} gyűrűben végezzük el az alábbi 328 tényezős moduláris szorzást. Ezt képlettel kifejezve:

\bmod_{11}(\underbrace{2\cdot 2\cdot \ldots \cdot 2}_{\text{328 darab}})=\underbrace{\bmod_{11}(2)\odot \bmod_{11}(2)\odot \ldots \odot \bmod_{11}(2)}_{\text{328 darab}}

Ez azért szerencsés, mert így számolgatás közben nem fogunk olyan óriási részeredményeket kapni, amelyek túllépik a számítógép számábrázolási határait. A gyakorlatban azonban a kitevő nagyságrendje a többszázjegyű számok körében mozog, így ez a módszer beláthatatlanul sok moduláris szorzást igényel. Most egy olyan módszert fogunk mutatni, amelynek a segítségével még ezek az óriási kitevős moduláris hatványok is pillanatok alatt kiszámíthatók. Ez az ismételt négyzetre emelések módszere néven ismeretes, és a moduláris hatványozás 18.8. Tétel szerinti azonosságait használja ki igen trükkös módon.

Maradjunk továbbra is a \bmod_{11}(2^{328}) moduláris hatvány kiszámításának példájánál. Első lépésként a 328-as kitevőt felírjuk kettes számrendszerben:

328 \to 101001000‬

A különböző számrendszerekről részletesen a 3. fejezetben volt szó. Az ott leírtaknak megfelelően ez tulajdonképpen a 328 felírása a 2 bizonyos hatványainak összegeként. Ebben az összegben a 2-nek épp azok a hatványai szerepelnek, amelyeknek megfelelő helyiértéken 1-es áll a fenti bináris számábrázolásban. Azaz:

328=2^8+2^6+2^3‬

Ennek az összegnek a tagjaiból a 14.12. Definíció 5. pontja szerinti disztributivitási szabályt alkalmazva kiemelhetjük a 2^3 hatványt:

328=(2^5+2^3+1)‬\cdot 2^3

Ehhez hasonlóan a zárójelben maradt összeg első két tagjából ismételten kiemelhető a 2^3 hatvány:

328=((2^2+1)\cdot 2^3+1)‬\cdot 2^3

Így tehát az eredeti \bmod_{11}(2^{328}) moduláris hatvány felírható a következőképpen:

\bmod_{11}(2^{328})=\bmod_{11}(2^{((2\cdot 2+1)\cdot 2\cdot 2\cdot 2+1)‬\cdot 2\cdot 2\cdot 2})

A hatványozás azonosságairól szóló 18.8. Tétel 2. és 3. pontjai alapján ez így írható fel:

\bmod_{11}(2^{328})=\bmod_{11}((((((((2^2)^2\cdot 2)^2)^2)^2\cdot 2)^2)^2)^2)

Azaz egy olyan műveletsorozatot kell elvégeznünk, amelynek minden lépésében az előző lépésben kapott részeredményt vagy négyzetre emeljük, vagy pedig megszorozzuk a 2 alappal. Ebben a konkrét példában egy dupla négyzetreemelés után először szorozni kell, ezután következik egy tripla négyzetreemelés, aztán ismét egy szorzás, végül megint egy tripla négyzetreemelés.

Minthogy a \bmod_{11} maradékképző függvény a 18.7. Tétel alapján egy gyűrűhomomorfizmus az egész számok \Z gyűrűje és a Z_{11} gyűrű között, ezért ez a műveletsorozat a Z_{11} gyűrűben is elvégezhető. Ezt az alábbiakban el is végezzük lépésenként:

\begin{aligned}\bmod_{11}&(2^2)=4 \\ \bmod_{11}&(4^2)=5 \\ \bmod_{11}&(5\cdot 2)=10 \\ \bmod_{11}&(10^2)=1 \\ \bmod_{11}&(1^2)=1 \\ \bmod_{11}&(1^2)=1 \\ \bmod_{11}&(1\cdot 2)=2 \\ \bmod_{11}&(2^2)=4 \\ \bmod_{11}&(4^2)=5 \\ \bmod_{11}&(5^2)=3 \end{aligned}

Azaz a \bmod_{11}(2^{328})=3 végeredményt 327 helyett megkaptuk mindössze 10 darab moduláris szorzásból.

Most vizsgáljuk meg az imént leírt módszer lépésszámát általánosságban is. Tegyük fel, hogy a \bmod_{m}(a^x) moduláris hatványt szeretnénk meghatározni. Lépésszám alatt most értelemszerűen a szükséges moduláris szorzások számát értjük. Ezt az x kitevő nagysága határozza meg, amelyről most tegyük fel, hogy n darab számjeggyel írható le a kettes számrendszerben. A legrosszabb eset nyilván az, amikor minden bináris számjegy értéke 1, hiszen ekkor az összes neki megfelelő 2-hatvány szerepel az összegben:

x=2^{n-1}+2^{n-2}+2^{n-3}+\ldots +2^3+2^2+2^1+1

A sorozatos kiemelések hatására egy olyan kifejezést kapunk, amely n-2 darab egymásba ágyazott zárójelet tartalmaz:

\begin{aligned}x&=(2^{n-2}+2^{n-3}+\ldots +2^2+2^1+1)\cdot 2+1=\\&=((2^{n-3}+2^{n-4}+\ldots +2^1+1)\cdot 2+1)\cdot 2+1=\\&\vdots \\&=\underbrace{((\ldots (}_{n-2 \text{ darab}}2+1)\cdot 2 + 1)\cdot 2 +\ldots +1)\cdot 2 + 1\end{aligned}

Azaz mind az n-2 darab zárójel esetén az addigi részeredményhez hozzá kell adni 1-et, majd az egészet megszorozni 2-vel. Végül az utolsó lépésben mégegyszer hozzá kell adni az egészhez 1-et. Mivel ez a kifejezés a \bmod_m(a^x) moduláris hatvány kitevőjében szerepel, ezért a 18.8. Tétel 2. és 3. pontjai alapján ennek a hatványnak a kiszámítása összesen 2n-1 darab moduláris szorzásból megúszható. Ráadásul ez a lehető legrosszabb eset, amikor a kitevő bináris számábrázolásában minden bit értéke 1.

Ez tehát azt jelenti, hogy mind a Diffie-Hellman kulcscsere protokoll, mind pedig a fejezet hátralévő szakaszaiban bemutatott RSA eljárás során előforduló moduláris hatványokat rendkívül gyorsan ki tudjuk számítani még abban az esetben is, ha több ezer bites számokról van szó. Ugyanis legrosszabb esetben is a kitevő bináris számjegyei számának duplája lesz az elvégzendő moduláris szorzások száma.

Eddig tehát megismertük a továbbiakban fontos három fő összetevőt:

Ezek után minden készen áll arra, hogy megismerkedjünk az emberiség egyik legfontosabb találmányával.

A Rivest-Shamir-Adleman (RSA) aszimmetrikus kulcsú rejtjelező eljárás

A 9.8. szakaszban mutattuk be az aszimmetrikus kulcsú rejtjelezés forradalmian új gondolatát. Ezt most pár mondatban átismételjük, ám javasoljuk az Olvasónak a hivatkozott szakasz átolvasását. A nagy ötlet ugye az volt, hogy a fogadó oldalon az üzenet visszafejtéséhez más kulcsot kelljen használni, mint amivel a küldő oldal titkosította azt. Ekkor ugyanis nincs szükség arra, hogy a fogadó és a küldő oldal előzetesen megállapodjon egy közös kulcsban.

Ezt sok esetben egyébként nem is tudnák megtenni. Gondoljunk csak például arra, amikor valamilyen külföldi webáruházban vásárolunk. Ez a vásárlás végén átirányít minket egy olyan bank fizetőoldalára, amelynek nem is vagyunk az ügyfelei. Ilyenkor a böngészőnknek a begépelt bankkártyaadatokat titkosítva kell elküldenie a bank szerverére, hiszen rendkívül érzékeny adatokról van szó. Amennyiben nem létezne aszimmetrikus kulcsú titkosítás, akkor a folyamat itt meg is akadna. Szükség lenne ugyanis egy közös kulcsra a vásárló és a bank közötti kommunikáció titkosításához.

Az RSA eljárásnak köszönhetően azonban ilyenre nincs szükség, mivel a böngésző a bank publikus kulcsával – amely tehát bárki számára elérhető – titkosíthatja az elküldendő bankkártyaadatokat, amelyet azután csak a bank fog tudni visszafejteni a saját titkos kulcsával. Megjegyezzük, hogy valójában nem pontosan ez történik a háttérben, ám ez az alapelv megértése szempontjából lényegtelen.

Most térjünk vissza főszereplőinkhez, és tegyük fel, hogy Alice szeretne Bob-nak elküldeni egy x üzenetet. Ehhez előkeresi a nyilvános kulcstárból Bob K_b publikus kulcsát, és ezzel paraméterezi az E rejtjelező függvényt. Ily módon előáll az y kódszöveg, amelyet elküld Bob-nak. Ezt az üzenetet kizárólag Bob tudja visszafejteni, mivel a K_b publikus kulcshoz tartozó k_b titkos kulcsot csak ő ismeri. Bob tehát a k_b titkos kulccsal paraméterezve a D dekódoló függvényt könnyedén vissza tudja állítani az eredeti x üzenetet, míg a titkos kulcsot nem ismerő támadó számára ez gyakorlatilag lehetetlen. Ez a folyamat látható a 21.2. ábrán.

Aszimmetrikus kulcsú rejtjelező modell
21.2. ábra: Aszimmetrikus kulcsú rejtjelező modell

Az 1970-es évek nagy kérdése volt, hogy vajon mik lehetnek az ábrán szereplő E és D függvények – ha egyáltalán léteznek ilyenek. Az úttörő eredmény a 21.3. képen látható Ronald Linn Rivest, Adi Shamir és Leonard Max Adleman érdeme, akik 1977-ben publikálták az úgynevezett Rivest-Shamir-Adleman (RSA) algoritmust, amely talán az emberiség egyik legnagyobb horderejű felfedezése volt – legalábbis a társadalmunkra gyakorolt hatását tekintve mindenképpen.

Adi Shamir (balra), Ron Rivest (középen) és Len Adleman (jobbra)
21.3. ábra: Adi Shamir (balra), Ron Rivest (középen) és Len Adleman (jobbra)

Az alábbiakban – mostmár a szükséges számelméleti ismeretekkel felvértezve – ismertetjük ennek az eljárásnak a részleteit, majd az egészet egy egyszerű példán szemléltetjük.

RSA kulcspár generálása

Előszöris Bobnak szüksége lesz egy publikus és egy titkos részből álló kulcspárra. Ezek előállítását kulcsgenerálásnak nevezzük. Ehhez Bob keres magának két különböző, elegendően nagy prímszámot. Az "elegendően nagy" manapság tipikusan 2048 vagy 4096 bináris számjeggyel ábrázolható prímeket jelent. Ez tízes számrendszerben körülbelül a 600 vagy 1200 számjegyű számok nagyságrendje. Arról a 23. fejezetben lesz szó, hogy Bob hogyan képes ilyen nagyságrendű prímeket találni viszonylag hamar, ezért ezt a problémát egyelőre tegyük félre.

Jelöljük a Bob által talált, és persze a lehető legnagyobb titokban tartott két prímet p-vel és q-val. Bob ezután összeszorozza ezt a két prímszámot. Az így kapott m=p\cdot q egész számot modulusnak fogjuk nevezni a továbbiakban. Ezt az m számot nem szükséges titokban tartani, az ugyanis a publikus kulcs része lesz.

Második lépésként Bob kiszámítja az Euler-féle \varphi-függvény értékét m-re, azaz kiszámítja a \varphi(m) értéket, amelyet szintén a lehető legnagyobb titokban tart. A p és q prímszámok ismeretében ezt a 21.3., valamint a 21.5. Tétel alapján könnyen meg tudja tenni:

\varphi(m)=(p-1)\cdot (q-1)

Harmadik lépésként Bob választ egy tetszőleges 0 és \varphi(m) közötti e egész számot, amely relatív prím \varphi(m)-hez. A 20.15. Tétel alapján ezt úgy is megfogalmazhatjuk, hogy Bob választ egy modulo \varphi(m) redukált maradékosztályt, az e egész szám pedig ennek a legkisebb pozitív reprezentánseleme lesz. Megint más megfogalmazásban a gyűrűk homomorfizmustétele miatt e tulajdonképpen a 18.3. Definíció szerinti Z_{\varphi(m)} gyűrű valamelyik invertálható eleme lesz.

Ezt Bob szintén hatékonyan ki tudja választani, mivel szerencsére – itt nem részletezett analitikus számelméleti okok miatt – viszonylag gyakori, hogy két tetszőlegesen kiválasztott egész szám egymáshoz relatív prím. Így Bob megteheti, hogy véletlenszerűen választ a 0 és \varphi(m) közötti számok közül, majd a 17.4. szakaszban ismertetett euklidészi algoritmus segítségével kiszámítja a kiválasztott szám és \varphi(m) kitüntetett közös osztóját.

Ha ez egy egység, akkor a 17.10. Definíció utáni megjegyzés alapján a választott szám relatív prím \varphi(m)-hez, azaz megvan a keresett e. Ha pedig nem ez a helyzet, akkor Bob megismétli az eljárást egy másik véletlenszerűen választott számmal mindaddig, amíg nem talál egy \varphi(m)-hez relatív prím számot. Az említett analitikus számelméleti összefüggések miatt ez majdnem biztosan már az első próbálkozáskor megtörténik. Az így kapott e számot nem szükséges titokban tartani, az ugyanis a publikus kulcs része lesz.

Utolsó lépésként Bob kiszámítja az előző lépésben kiválasztott e szám multiplikatív inverzét a Z_{\varphi(m)} gyűrűben. Ehhez ugye meg kell oldania az alábbi lineáris kongruenciát:

e\cdot x\equiv 1\pmod{\varphi(m)}

A 20.8. Definíció alapján a megoldás a 20.14. Tétel 1. pontja miatt egyetlen darab modulo \varphi(m) maradékosztály lesz – mivel e relatív prím \varphi(m)-hez, és emiatt (e,\varphi(m))\sim 1. Az e szám Z_{\varphi(m)}-beli multiplikatív inverze ennek az eredményül kapott maradékosztálynak a legkisebb pozitív eleme lesz, amelyet a továbbiakban d-vel fogunk jelölni.

A d kiszámításához a 20.13. Tétel szerint Bobnak tulajdonképpen az alábbi lineáris diofantoszi egyenletet kell megoldania, amelyhez a 21.2. Tétel 1. pontja alapján a kibővített euklidészi algoritmust használhatja:

ex+\varphi(m)y=1

Bob a kapott d számot titokban tartja, az ugyanis a titkos kulcs része lesz.

A kulcsgenerálás ezzel befejeződött. Bob kulcspárja a következő lesz:

Bob ezek után akár meg is semmisítheti az eredetileg választott p és q prímszámokat, valamint a belőlük kiszámított \varphi(m) értéket, azokra ugyanis a továbbiakban nem feltétlenül van szüksége. A 22.7. szakaszban azonban látni fogjuk, hogy a p és q prímszámok segítségével Bob hogyan tudja jelentősen felgyorsítani a dekódolás folyamatát. Mindenesetre biztonságos helyen kell ezeket tárolnia, ugyanis a segítségükkel a publikus kulcsból a fentiek alapján hatékonyan kiszámítható a titkos kulcs, így nem lenne jó, ha illetéktelen kezekbe kerülnének. Nélkülük azonban jelenlegi számelméleti ismereteink alapján ez egy belátható időn belül nem kivitelezhető algoritmikus feladat még a világ összes számítási kapacitásával sem. Ehhez ugyanis prímtényezőire kéne bontani a publikus kulcsban szereplő m modulust, vagy valamilyen más – mindezidáig nem ismert – módon kiszámítani a \varphi(m) értéket, ami ugye a d dekódoló kulcs meghatározásához kell.

Bob a kulcspárjának publikus részét – azaz az (m;e) számpárt – nyilvánosságra hozhatja, ugyanis ennek segítségével lehet majd a neki szánt bizalmas üzeneteket titkosítani. Ezzel szemben a kulcspár titkos részét – azaz az (m;d) számpárt – a lehető legnagyobb titokban kell tartania, ugyanis a titkosított üzeneteket kizárólag ezzel lehet majd visszafejteni.

RSA kódolás és dekódolás

Az RSA esetén mind a rejtjelezés, mind pedig a dekódolás során tulajdonképpen egy-egy moduláris hatványozást kell elvégezni. Ennek módjáról az ismételt négyzetreemelések módszerének kapcsán a 21.4. szakaszban volt szó bővebben. Ha Alice valamilyen üzenetet vagy adathalmazt szeretne küldeni Bob-nak, akkor előszöris kikeresi a nyilvános kulcstárból Bob publikus kulcsát. Az ebben szereplő m modulus fogja kijelölni azt a 18.3. Definíció szerinti Z_m gyűrűt, amiben majd moduláris hatványozást el kell végezni, az e szám pedig a kódoláshoz használandó kitevő lesz.

A rejtjelezni kívánt üzenetet Alice valamilyen egyezményes vagy szabványos módon egy, a Z_m gyűrű elemeiből álló számsorozattá alakítja át, amelyet előkódolásnak nevezünk. Ez sokféleképpen történhet, erről egy kicsit bővebben a blokkrejtjelezőkről szóló 5.6. szakaszban volt szó. A technikai részletekre itt nem térünk ki, ám a következő szakaszban fogunk mutatni erre egy egyszerű példát.

A lényeg, hogy Bob ebből a számsorozatból egyértelműen tudja majd rekonstruálni az eredeti üzenetet. Az RSA szempontjából tehát a nyílt szöveg tulajdonképpen egy x_1, x_2, x_3, \ldots számsorozat, amelynek tagjai a Z_m gyűrű elemei, azaz m-nél kisebb nemnegatív egész számok.

Az Alice által használt E rejtjelező függvény az alábbi moduláris hatványozás lesz:

E(x)=\bmod_m(x^e)

Itt x jelöli a nyílt szöveget reprezentáló számsorozat soron következő tagját, az e kitevő és az m modulus pedig Bob publikus kulcsát alkotják.

Alice tehát a bemeneti x_1, x_2, x_3, \ldots nyílt számsorozatból a Bob (m;e) publikus kulcsával paraméterezett E rejtjelező függvény segítségével előállítja az y_1, y_2, y_3, \ldots rejtjelezett számsorozatot:

\begin{aligned} y_1&=\bmod_m({x_1}^e) \\ y_2&=\bmod_m({x_2}^e) \\ y_3&=\bmod_m({x_3}^e) \\ &\vdots \end{aligned}

Az így kapott y_1, y_2, y_3, \ldots számsorozatot Alice átküldi a nembiztonságos kommunikációs csatornán Bob-nak. A Bob által használt D dekódoló függvény nagyon hasonlít a rejtjelező függvényhez. Az egyetlen különbség, hogy ezúttal Bob (m;d) titkos kulcsával kell paraméterezni a moduláris hatványozást:

D(y)=\bmod_m(y^d)

Bob tehát a bemeneti y_1, y_2, y_3, \ldots rejtjelezett számsorozatból a saját (m;d) titkos kulcsával paraméterezett D dekódoló függvény segítségével "varázslatos módon" visszakapja az Alice által közölni kívánt x_1, x_2, x_3, \ldots nyílt számsorozatot:

\begin{aligned} x_1&=\bmod_m({y_1}^d) \\ x_2&=\bmod_m({y_2}^d) \\ x_3&=\bmod_m({y_3}^d) \\ &\vdots \end{aligned}

A visszakapott számsorozatból végül Bob az egyezmény vagy szabvány szerinti előkódolás megfordításával megkapja az eredeti üzenetet vagy adathalmazt. A 22. fejezetben fogjuk igazolni, hogy az imént említett "varázslat" valójában nem a véletlen műve, hanem az eddig megismert számelméleti összefüggések következménye. Most azonban nézzünk egy egyszerű példát az RSA rejtjelező használatára.

Példa RSA rejtjelezésre

Tegyük fel, hogy Alice egy bizalmas üzenetet szeretne elküldeni Bob-nak. Az egyszerűség kedvéért Alice és Bob megegyeznek, hogy a kommunikációhoz az angol ábécé betűit használják írásjelek és szóközök nélkül, az üzenet végét pedig a # karakter fogja jelezni. A bizalmas üzenet ezek alapján a következő:

sziabobmiahelyzet#

Ahhoz, hogy Alice ezt az üzenetet egy digitális kommunikációs csatornán átküldhesse, valamilyen módon egy bináris jelsorozattá kell alakítania azt. Ez történhet például az ASCII kódrendszer alapján, amelyről bővebben a 2.2. szakaszban volt szó. Mi most az egyszerűség kedvéért egy ennél egyszerűbb kódrendszert fogunk használni, amely csak az angol ábécé kisbetűit és az üzenet végét jelző # karaktert tartalmazza. Ez összesen 27 szimbólum, amely 5 bites kódszavakkal ábrázolható. Az alábbi táblázat első oszlopa a kódolandó szimbólumokat, a második és harmadik oszlop pedig a hozzájuk rendelt számokat tartalmazza tízes és kettes számrendszerben. A számrendszerekről bővebben a 3. fejezetben volt szó:

\begin{array}{c|c|c} \text{symbol} & \text{decimal} & \text{binary} \\ \hline a & 0 & 00000 \\ b & 1 & 00001 \\ c & 2 & 00010 \\ d & 3 & 00011 \\ e & 4 & 00100 \\ f & 5 & 00101 \\ g & 6 & 00110 \\ h & 7 & 00111 \\ i & 8 & 01000 \\ j & 9 & 01001 \\ k & 10 & 01010 \\ l & 11 & 01011 \\ m & 12 & 01100 \\ n & 13 & 01101 \\ o & 14 & 01110 \\ p & 15 & 01111 \\ q & 16 & 10000 \\ r & 17 & 10001 \\ s & 18 & 10010 \\ t & 19 & 10011 \\ u & 20 & 10100 \\ v & 21 & 10101 \\ w & 22 & 10110 \\ x & 23 & 10111 \\ y & 24 & 11000 \\ z & 25 & 11001 \\ \# & 26 & 11010 \end{array}

Ezek alapján a sziabobmiahelyzet# üzenetből az alábbi 90 bit hosszú bináris jelsorozat lesz:

\begin{aligned}&\underbrace{10010}_{\text{s}} \underbrace{11001}_{\text{z}} \underbrace{01000}_{\text{i}} \underbrace{00000}_{\text{a}} \underbrace{00001}_{\text{b}} \underbrace{01110}_{\text{o}} \underbrace{00001}_{\text{b}} \\ &\underbrace{01100}_{\text{m}} \underbrace{01000}_{\text{i}} \underbrace{00000}_{\text{a}} \underbrace{00111}_{\text{h}} \underbrace{00100}_{\text{e}} \underbrace{01011}_{\text{l}} \underbrace{11000}_{\text{y}} \\ &\underbrace{11001}_{\text{z}} \underbrace{00100}_{\text{e}} \underbrace{10011}_{\text{t}} \underbrace{11010}_{\#} \end{aligned}

Mivel a kommunikációs csatornát a szemtelen Eve lehallgatja, ezért Alice kénytelen titkosítani ezt a jelsorozatot. Sajnos azonban ezúttal Alice-nak és Bob-nak nincs módja személyes találkozót megbeszélni annak érdekében, hogy valamilyen közös szimmetrikus kulcsban meg tudjanak állapodni, ahogy tették azt például az 1. fejezetben. De ez nem is jelent problémát, hiszen ismerik az előző szakaszokban ismertetett aszimmetrikus kulcsú RSA rejtjelező eljárást. Alice ezért megkéri Bob-ot, hogy generáljon magának egy RSA kulcspárt, és annak publikus részét küldje el neki a kommunikációs csatornán keresztül, hogy azzal titkosítani tudja számára a fenti bizalmas üzenetet.

Bob ezért választ magának két különböző prímszámot. Tegyük fel, hogy Bob a p=211 és q=139 prímszámokat választotta. A gyakorlatban persze a választott prímszámoknak többszázjegyűeknek kell lenniük a megfelelő biztonság érdekében, azonban most a példa kedvéért maradjunk ezeknél. Bob e két prímszám összeszorzásával meghatározza az m modulust, majd kiszámítja a \varphi(m) értéket:

\begin{aligned}m&=p\cdot q=211\cdot 139=29329 \\ \varphi(m)&=(p-1)\cdot (q-1)=210\cdot 138=28980\end{aligned}

Bob választ továbbá egy \varphi(m)-hez relatív prím e számot. Ezt a leírtaknak megfelelően úgy tudja megtenni, hogy választ egy véletlen számot 0 és \varphi(m) között, majd az euklidészi algoritmus segítségével leellenőrzi, hogy a választott szám valóban relatív prím-e \varphi(m)-hez. Ez majdnem biztosan teljesülni fog már elsőre. Ha esetleg mégsem, akkor újabb véletlenszámokkal próbálkozik mindaddig, amíg nem talál egy megfelelőt. Tegyük fel, hogy Bob az e=187 számot választotta. Ha e valóban relatív prím \varphi(m)-hez, akkor az alábbi lineáris kongruenciának egyetlen megoldása lesz, méghozzá az a modulo \varphi(m) maradékosztály, amelyben ott csücsül az e számnak a 18.3. Definíció szerinti Z_{\varphi(m)} gyűrűben vett multiplikatív inverze:

\underbrace{187}_{=e} \cdot d\equiv 1\pmod {\underbrace{28980}_{=\varphi(m)}}

Ennek a lineáris kongruenciának a 20.13. Tétel alapján az alábbi lineáris diofantoszi egyenlet felel meg:

\underbrace{187}_{=e}\cdot d+\underbrace{28980}_{=\varphi(m)}\cdot y=1

Szerencsére a 21.1. Tétel bizonyításában ismertetett kibővített euklidészi algoritmus egyszerre számítja ki az (e,\varphi(m)) kitüntetett közös osztót, és állítja elő azt e és \varphi(m) lineáris kombinációjaként. Bob tehát lefuttatja a kibővitett euklidészi algoritmust:

\begin{array}{c|c|c|c|c|c|c}i & r_{i-2} & r_{i-1} & r_i & k_i & u_i & v_i \\ \hline 1 & 28980 & 187 & 182 & 154 & 1 & -154 \\ \hline 2 & 187 & 182 & 5 & 1 & -1 & 155 \\ \hline 3 & 182 & 5 & 2 & 36 & 37 & -5734 \\ \hline 4 & 5 & 2 & 1 & 2 & -75 & 11623 \\ \hline 5 & 2 & 1 & 0 & - & - & -\end{array}

Az utolsó nemnulla maradék 1, így e=187 valóban relatív prím \varphi(m)=28980-hoz, továbbá Bob megkapta a 21.1. Tétel szerinti lineáris kombinációs együtthatókat is, azaz lényegében a fenti lineáris diofantoszi egyenlet egy megoldását:

\underbrace{187}_{=e} \cdot \underbrace{11623}_{=d} + \underbrace{28980}_{=\varphi(m)} \cdot \underbrace{(-75)}_{=y}=1

Megvan a keresett d, ami tehát 11623. A kulcsgenerálás ezzel befejeződött, Bob RSA kulcspárja a következő:

Ezek után Bob elküldi Alice-nak a kulcspár publikus részét – vagy akár elérhetővé teszi azt bárki számára egy nyilvános kulcstárban –, a titkos részét azonban szigorúan titokban tartja.

Alice-nak tehát az elküldendő bináris jelsorozatot a Z_m=Z_{29329} gyűrű elemeinek sorozatává kell alakítania. Ez egy olyan számsorozatot jelent, amelynek minden tagja nemnegatív és kisebb az m=29329 modulusnál. Egy rövid számolgatás után azt kapja, hogy a 14 bites számok biztosan megfelelnek ennek a kritériumnak, hiszen 2^{14}=16384. Ezzel szemben a 15 bites számok között már előfordulhatnának a modulusnál esetleg nagyobb számok is, mivel 2^{15}=32768. Így tehát Alice az üzenetet 14 bit hosszú részekre darabolja.

Az elküldendő bitsorozat 90 bit hosszú, így az utolsó darab 6 bitből fog állni. A fennmaradó 8 bitet Alice nyugodtan kitöltheti véletlenszerűen választott bitekkel, mivel a vételi oldalon Bob az üzenet végét jelző # karakterből egyértelműen azonosítani tudja majd ezeket az eldobható biteket. Így tehát az Alice által titkosítandó számsorozat a következő:

\begin{aligned}10010110010100 &\to x_1=9620 \\ 00000000001011 &\to x_2=11 \\ 10000010110001 &\to x_3=8369 \\ 00000000001110 &\to x_4=14 \\ 01000101111000 &\to x_5=4472 \\ 11001001001001 &\to x_6=12873 \\ 111010\underbrace{01101001}_{\text{kitöltés}} &\to x_7=14953\end{aligned}

Alice ezután a Bob publikus kulcsát alkotó m=29329 modulus és e=187 kitevő segítségével kiszámítja a titkosított számsorozatot. Ezeket a moduláris hatványokat Alice a 21.4. szakaszban ismertetett ismételt négyzetreemelés módszerének segítségével hatékonyan tudja kiszámítani:

\begin{aligned}y_1&=\bmod_{29329}({9620}^{187})=7812 \\ y_2&=\bmod_{29329}({11}^{187})=869 \\ y_3&=\bmod_{29329}({8369}^{187})=445 \\ y_4&=\bmod_{29329}({14}^{187})=25123 \\ y_5&=\bmod_{29329}({4472}^{187})=2090 \\ y_6&=\bmod_{29329}({12873}^{187})=24726 \\ y_7&=\bmod_{29329}({14953}^{187})=9793 \\ \end{aligned}

Ezután Alice az így kapott y_1,y_2,\ldots,y_7 számokat kettes számrendszerben ábrázolja az eredeti számsorozathoz hasonlóan. Most azonban már előfordulhat bármilyen szám 0 és m=29329 között, így Alice kénytelen 15 bitet használni:

\begin{aligned}001111010000100‬ &\gets y_1=7812 \\ 000‭001101100101‬ &\gets y_2=869 \\ ‭000000110111101‬ &\gets y_3=445 \\ ‭‭110001000100011‬‬ &\gets y_4=25123 \\ ‭000100000101010‬ &\gets y_5=2090 \\ ‭110000010010110‬ &\gets y_6=24726 \\ ‭010011001000001‬ &\gets y_7=9793\end{aligned}

Ezeket a 15 bites darabokat Alice szépen egymás után fűzi, és az így kapott 105 bites titkosított bitsorozatot elküldi Bob-nak a kommunikációs csatornán keresztül. Ne feledjük, hogy az Alice által használt, Bob-hoz tartozó publikus kulcs csak a titkosításhoz elegendő. A kulcs Bob-nál lévő titkos része nélkül maga Alice sem tudja visszafejteni ezt az üzenetet, így az teljes biztonságban utazik a csatornán a pofátlan Eve orra előtt.

Példa RSA dekódolásra

Most nézzük meg, hogy mit tud kezdeni ezzel a titkosított bitsorozattal a vételi oldalon lévő Bob, illetve a kommunikációs csatornát lehallgató Eve. Bob publikus kulcsát mindketten ismerik. Bob nyilván, hiszen ő maga generálta azt az előző szakaszban. Eve pedig legkésőbb akkor értesül róla, amikor Bob közli azt Alice-szal a kommunikációs csatornán keresztül, de akár közvetlenül le is töltheti a nyilvános kulcstárból.

Így tehát mindketten ismerik az m=29329 modulust, azaz tudják, hogy az Alice által elküldött titkosított bitsorozatot 15 bites részekre kell darabolni ahhoz, hogy megkapják a 0 és 29329 közötti számokból álló y_1,y_2,\ldots,y_7 sorozatot, amely tehát a következő:

\begin{aligned}001111010000100‬ &\to y_1=7812 \\ 000‭001101100101‬ &\to y_2=869 \\ ‭000000110111101‬ &\to y_3=445 \\ ‭‭110001000100011‬‬ &\to y_4=25123 \\ ‭000100000101010‬ &\to y_5=2090 \\ ‭110000010010110‬ &\to y_6=24726 \\ ‭010011001000001‬ &\to y_7=9793\end{aligned}

Ebből a Bob titkos kulcsát alkotó m=29329 modulus és d=11623 kitevő segítségével lehet kiszámítani az eredeti számsorozatot. Ezeket a moduláris hatványokat Bob a 21.4. szakaszban ismertetett ismételt négyzetreemelés módszerének segítségével hatékonyan tudja kiszámítani:

\begin{aligned}x_1&=\bmod_{29329}({7812}^{11623})=9620 \\ x_2&=\bmod_{29329}({869}^{11623})=11 \\ x_3&=\bmod_{29329}({445}^{11623})=8369 \\ x_4&=\bmod_{29329}({25123}^{11623})=14 \\ x_5&=\bmod_{29329}({2090}^{11623})=4472 \\ x_6&=\bmod_{29329}({24726}^{11623})=12873 \\ x_7&=\bmod_{29329}({9793}^{11623})=14953 \\ \end{aligned}

Bob tehát valóban visszakapta az Alice által küldött eredeti számsorozatot. Eve azonban ezen a ponton bajba kerül, mivel nem ismeri a d=11623 dekódoló kulcsot, hiszen azt Bob mindvégig titokban tartotta. Sebaj, gondolja Eve, és megkísérli kiszámítani a publikus kulcsból a titkos kulcsot, pontosan úgy, ahogyan Bob tette a kulcsgenerálás során. Ehhez Eve-nek meg kéne tudnia határozni az e=187 egész szám multiplikatív inverzét a 18.3. Definíció szerinti Z_{\varphi(m)} gyűrűben, hiszen ez épp a keresett d dekódoló kulcs lesz.

Igenám, csakhogy Eve számára még \varphi(m) értéke sem ismert, és ennek kiszámításához a 21.3. és a 21.5. Tétel alapján szüksége volna az m=29329 modulus prímtényezős felbontására. Nem ismeretes ugyanis olyan algoritmikus módszer, amellyel a \varphi(m) értéke hatékonyan kiszámítható m prímtényezőinek ismerete nélkül. Ezért Eve sajnos – szerencsére – kénytelen megkeresni m prímtényezőit, amelyre szintén nem ismert hatékony algoritmus. Így ez a feladat az idők végezetéig is eltarthat neki a világ összes számítógépével, amennyiben a Bob által választott prímszámok megfelelően nagyok.

Ezzel szemben Bob azért volt képes olyan gyorsan meghatározni \varphi(m)-et, és így a d titkos dekódoló kulcsot, mivel ő ismerte a p=211 és q=139 prímtényezőket. Nyilván, hiszen azokat ő maga választotta, és a kulcsgenerálás során ezek szorzatából képezte az m=29329 modulust. Természetesen – mint már említettük – a gyakorlatban a választott prímszámoknak többszázjegyűeknek kell lenniük a megfelelő biztonsági szint eléréséhez.

Bob tehát minden gond nélkül ki tudta számítani az x_1, x_2, \ldots, x_7 számsorozatot. És ami még fontosabb: mivel kizárólag ő ismeri a d=11623 dekódoló kulcsot, ezért rajta kívül bárki más, aki az üzenet megfejtésével próbálkozik Eve-vel azonos helyzetben találja magát.

Az x_1, x_2, \ldots, x_7 számsorozatból már viszonylag egyszerűen megkapható az Alice által elküldött karaktersorozat. Ehhez csak az előző szakaszban alkalmazott előkódolás lépéseit kell megfordítani. Ez már nem része az RSA eljárásnak, de a teljesség igénye miatt röviden ismertetjük.

Az m=29329 modulusból ugye tudható, hogy Alice 14 bites számokat használt, amikor előállította ezt a sorozatot. A 15 bites számok között ugyanis már előfordulhatnának ennél nagyobb számok is, mivel a 15 biten kódolható számtartomány 0-tól 32767-ig terjed. Ezért Bob 14 biten ábrázolja a visszafejtett számokat:

\begin{aligned}10010110010100 &\gets x_1=9620 \\ 00000000001011 &\gets x_2=11 \\ 10000010110001 &\gets x_3=8369 \\ 00000000001110 &\gets x_4=14 \\ 01000101111000 &\gets x_5=4472 \\ 11001001001001 &\gets x_6=12873 \\ 11101001101001 &\gets x_7=14953\end{aligned}

Bob ezeket a biteket összefűzi, és az így kapott bitsorozatból a kódábécé alapján dekódolja az üzenetet. Amikor az üzenet végét jelző # karakterhez ér, a fennmaradó kitöltő biteket eldobja:

\begin{aligned}&\underbrace{10010}_{\text{s}} \underbrace{11001}_{\text{z}} \underbrace{01000}_{\text{i}} \underbrace{00000}_{\text{a}} \underbrace{00001}_{\text{b}} \underbrace{01110}_{\text{o}} \underbrace{00001}_{\text{b}} \\ &\underbrace{01100}_{\text{m}} \underbrace{01000}_{\text{i}} \underbrace{00000}_{\text{a}} \underbrace{00111}_{\text{h}} \underbrace{00100}_{\text{e}} \underbrace{01011}_{\text{l}} \underbrace{11000}_{\text{y}} \\ &\underbrace{11001}_{\text{z}} \underbrace{00100}_{\text{e}} \underbrace{10011}_{\text{t}} \underbrace{11010}_{\#} \underbrace{01101001}_{\text{eldobható}} \end{aligned}

Ezután pedig válaszolhat Alice-nak ugyanezen a módon. Ekkor azonban Alice publikus kulcsával kell rejtjeleznie a választ, amelyet viszont csak Alice fog tudni visszafejteni a saját titkos kulcsával. Alice-nak és Bob-nak tehát nincs szükségük biztonságos csatornára – például személyes találkozó – ahhoz, hogy egy közös kulcsban megegyezzenek, amelyet aztán egy valamilyen, az RSA-nál jóval hatékonyabb szimmetrikus kulcsú rejtjelező eljáráshoz használhatnak. Ezt egészen nyugodtan megtehetik Eve orra előtt a nembiztonságos csatornán keresztül az RSA eljárásnak köszönhetően.

Az 1. fejezetben ismertetett kulcsmegosztás problémája tehát megoldódni látszik. Van azonban még egy probléma, amelyet meg kell oldani.

RSA partnerhitelesítés és digitális aláírás

Vegyük észre, hogy egy aktív támadó – például Mallory – ezt a rendszert könnyedén kijátszhatja. Mallory ugyanis képes elérni, hogy Alice a Bob-nak szánt üzenetek kódolásához az ő publikus kulcsát használja, miközben abban a hitben van, hogy az valójában Bob publikus kulcsa. Alice-nak emiatt meg kell tudnia győződnie arról, hogy a kódoláshoz használt publikus kulcs valóban Bob publikus kulcsa, és nem pedig Mallory-é, aki csak azt hazudja magáról, hogy ő Bob. Ezt partnerhitelesítésnek neveztük, és a hozzá kapcsolódó problémakört részletesen kifejtettük a 10. fejezetben. A megoldást a digitális aláírások jelentették, amelynek lényegét most röviden átismételjük.

Egy aszimmetrikus kulcsú rejtjelezési eljárás esetén a kulcspár publikus részével kódolt üzeneteket kizárólag ugyanezen kulcspár titkos részével lehet dekódolni. Most igazolni fogjuk, hogy az RSA esetében a kulcsok szerepe felcserélhető. Nevezetesen: a kulcspár titkos részével kódolt üzeneteket kizárólag a kulcspár publikus részével lehet dekódolni.

Az alábbi egyenlet a publikus kulccsal való kódolás, majd a titkos kulccsal való dekódolás egymás utáni végrehajtását írja le. Ezt ugyan majd csak a következő fejezetben fogjuk igazolni, de most tegyük fel, hogy ennek eredményeként valóban az eredeti x üzenetet kapjuk vissza:

\bmod_m((\underbrace{\bmod_m(x^e)}_{=y})^d)=x

Minthogy a \bmod_m maradékképző függvény a 18.7. Tétel alapján egy gyűrűhomomorfizmus az egész számok \Z gyűrűje és a 18.3. Definícióban bevezetett Z_m gyűrű között, ezért a zárójelen belüli y=\bmod_m(x^e) hatványozás a Z_m gyűrűben is elvégezhető. Ugyanezen okok miatt a d kitevővel való külső x=\bmod_m(y^d) hatványozás szintén elvégezhető a Z_m gyűrűben. Ha tehát ezt a két egymás utáni hatványozást a Z_m gyűrűben értjük, akkor az alábbi egyenlet írható fel:

(x^e)^d=x

A hatványozás azonosságairól szóló 18.8. Tétel bármilyen kommutatív gyűrű esetén alkalmazható, így nyilván a Z_m gyűrű esetén is. Ennek 2. pontja alapján az alábbit kapjuk:

(x^e)^d=x^{e\cdot d}=x^{d\cdot e}=(x^d)^e = x

Vagyis valóban: ha először kódolunk egy üzenetet egy kulcspár titkos részével, majd ezt dekódoljuk ugyanazon kulcspár publikus részével, akkor szintén az eredeti üzenetet kapjuk vissza. Ez a tulajdonság alkalmassá teszi az RSA eljárást digitális aláírások képzéséhez is. Ha ugyanis egy bitsorozat dekódolható például Bob publikus kulcsával, akkor azt csak egy olyan résztvevő kódolhatta, aki Bob titkos kulcsának birtokában volt. Márpedig ha Bob nem teljesen bolond, és valóban sosem adja ki a kezéből a titkos kulcsát, akkor ez bizonyíték arra, hogy az adott üzenetet kizárólag ő küldhette. A digitális aláíráson alapuló partnerhitelesítésről a 10. fejezetben volt szó részletesen, így azt itt nem ismételjük meg.

Ebben a fejezetben tehát megtanultunk lineáris diofantoszi egyenleteket megoldani a kibővített euklidészi algoritmus segítségével. Ezután az Euler-féle \varphi-függvény kiszámításához szükséges összefüggéseket tisztáztuk. Majd a moduláris hatványozáshoz mutattunk egy igen hatékony módszert: az úgynevezett ismételt négyzetreemelések módszerét. Végül ismertettük az RSA algoritmus részleteit, amelyet egy konkrét példán ki is próbáltunk.

Ebből úgy tűnik, hogyha egy üzenetet egy RSA kulcspár valamelyik tagjával kódolunk – legyen az akár a publikus, akár a titkos kulcs –, majd az így kapott eredményt dekódoljuk a kulcspár másik tagjával, akkor varázslatos módon az eredeti üzenetet kapjuk vissza. A következő fejezetben matematikai bizonyítást adunk arra, hogy ez az összefüggés valóban bármilyen, az ismertetett kritériumoknak megfelelő kulcspár, továbbá bármilyen üzenet esetén fennáll. Ezután a 23. fejezetben megismerjük azokat a módszereket, amelyek segítségével viszonylag könnyedén találhatunk többszázjegyű prímszámokat az RSA kulcsgeneráláshoz.