Modulaariaritmetiikan
peruskäsitteet ja merkinnät [-]
- Jaollisuus [-]
Luku $b$ on jaollinen luvulla $a$ eli $b$ on $a$:n
monikerta eli $a$ jakaa luvun $b$ jos on
olemassa kokonaisluku $k$ siten, että $b=a\cdot k$, eli $b\in
a\cdot \Z$. Tämä merkitään usein $a\,|\,b$.
- Modulofunktio $\Mod$ [-]
Jos $n>0$ niin $\Mod(m,n)=j$ jos $0\leq j < n$ ja
$m=j+kn$ missä $k\in \Z$.
Mutta $\Mod(m,0)=m$ ja $\Mod(m,n)=\Mod(m,-n)+n$ kun $n<0$.
Jos $m$ ja $n$ ovat positiivisia lukuja niin $\Mod(m,n)$ on
jakojäännös joka saadaan kun $m$ jaetaan $n$:llä mutta jos $m<0$
niin tämä jakojäännös ei ole positiivinen.
- Kongruenssi modulo [-]
Luku $a$ on kongruentti luvun $b$ kanssa modulo $n$ jos $a-b$ on
jaollinen $n$:llä ja tämä merkitään $a\equiv_n
b$ tai $a\equiv b \pmod
n$:
$\Z/n\Z$: kongruenssi- eli jäännösluokat [-]
Relaatio $\equiv_n $ on
ekvivalenssirelaatio
joukossa $\Z$
ja jakaa $\Z$:n ekvivalenssiluokkiin joita kutsutaan
kongruenssi- tai jäännösluokiksi, ja nämä ovat joukot
$\{\ldots,\;\phantom{-n+1,\;\;}\llap{-n,\;\;}
\phantom{n-1,\;\;}\llap{0,\;\;}
\phantom{2\cdot n-1,\;} \llap{n,\;}
\ldots\}$,
$\{\ldots,\;\phantom{-n+1,\;\;}\llap{-n+1,\;\;}
\phantom{n-1,\;\;}\llap{1,\;\;}
\phantom{2\cdot n-1,\;}\llap{n+1,\;}
\ldots\}$,
$\quad\vdots $
$\{\ldots,\;\phantom{-n+1,\;\;}\llap{-1,\;\;}
\phantom{n-1,\;\;}\llap{n-1,\;\;}
\phantom{2\cdot n-1,\;}\llap{2\cdot n-1,\;}
\ldots\}$,
joissa kaikki alkiot ovat
kongruentteja toistensa kanssa modulo $n$.
Seuraavia merkintöjä käytetään kun $n>0$:
Huom! [+]
Koska $\Mod(m_1,n)=\Mod(m_2,n)\leftrightarrow [m_1]_n=[m_2]_n$
niin usein valitaan alkio $\Mod(m,n)$ edustamaan jäännösluokkaa
$[m]_n$ niin että voidaan esim. puhua luvuista $0,1,2,\ldots,5$ joukon
$\Z/6\Z$ alkioina joukkojen $[0]_6, [1]_6,\ldots,[5]_6$ sijasta. Joskus
kirjoitetaan $[k]_n$:n sijasta $\overline k_n$
ja $\Z/n\Z$:n sijasta $\Z_n$.
Yhteen-, vähennys- ja kertolasku $\Z/n\Z$:ssa [-]
Voidaan osoittaa, että jos
\[
a_1\equiv_n a_2 \quad \text{ja}\quad b_1\equiv_n b_2
\]
niin
\begin{align*}
& (a_1+b_1)\equiv_n (a_2+b_2) \\
& (a_1-b_1)\equiv_n (a_2-b_2) \\
& (a_1\cdot b_1)\equiv_n (a_2\cdot b_2)
\end{align*}
Näin ollen voidaan määritellä laskuoperaatiota
joukossa $\Z/n\Z$ seuraavasti:
\begin{align*}
& [a]_n+[b]_n=[a+b]_n,\\
& [a]_n-[b]_n=[a-b]_n,\\
& [a]_n\cdot [b]_n= [a\cdot b]_n,\\
& [a]_n^j = [a^j]_n, \quad j\in \N_0,
\end{align*}
ja kaikki "normaalit" laskusäännöt (paitsi epäyhtälöihin
liittyvät) pätevät edelleen.
Esimerkki [+]
Päteekö $3\,|\, 5742385242417$ eli jakaako $3$ luvun
$5742385242417$?
Vastaus on kyllä koska luvun numeroiden summa
$5+7+4+2+3+8+5+2+4+2+4+1+7$ on kolmella jaollinen.
Mutta miksi tämä sääntö pätee? [+]
- Kymmenjärjestelmässä luvulla $x_nx_{n-1}\ldots x_1x_0$
tarkoitetaan lukua
- $[10^j]_3=[10]_3^j= [1]_3^j= [1^j]_3= [1]_3$.
- Tästä seuraa väite koska
Suurin yhteinen tekijä [-]
- Jos $m$ ja $n$ ovat kokonaislukuja jotka eivät
molemmat ole $0$ niin
niiden suurin yhteinen tekijä on
\begin{equation*}
\Gcd(m,n) = \max\set{d\in \Z: d|m \text{ ja } d|n}.
\end{equation*}
- syt=suurin yhteinen tekijä, gcd= greatest common
divisor, ja tavallisesti märitellään
$\Gcd(0,0)=0$.
- Jos $\Gcd(m,n)=1$ niin sanotaan, että luvut $m$ ja $n$ ovat
keskenään jaottomia.
- Huomaa, että määritelmästä seuraa, että
$\Gcd(m,n)=\Gcd(n,m)= \Gcd(\abs{m},\abs{n})$.
Käänteisalkiot $\Z/n\Z$:ssa [+]
- Jos $[m]_n\in \Z/n\Z$ ja on olemassa jäännösluokka $[j]_n\in
\Z/n\Z$ siten, että $[m]_n\cdot [j]_n=[1]_n$, eli $m\cdot j\equiv_n
1$ niin sanotaan, että
$[m]_n$:llä on käänteisalkio tai että $[m]_n$ on kääntyvä
$\Z/n\Z$:ssa ja käänteisalkio on $[j]_n=[m]_n^{-1}$.
- Jos $[m]_n$:llä on käänteisalkio niin voidaan
jakaa $[m]_n$:llä koska se on yhtäpitävää sen
kanssa, että kerrotaan $[j]_n$:llä.
- Jos $[j]_n=[m]_n^{-1}$ niin on olemassa kokonaisluku
$k$ siten, että
$m\cdot j=1+k\cdot n$. Jos nyt $d|m$ ja $d|n$ niin pätee
$d|(m\cdot j-k\cdot n)$ eli $d|1$ joten $d=1$.
Näin ollen $\Gcd(m,n)=1$. Voidaan
osoittaa, että myös käänteinen tulos pätee joten
Huom [+]
Jos $p$ on alkuluku niin kaikilla $\Z/p\Z$:n alkioilla paitsi
$[0]_p$:llä on käänteisalkio.
Esimerkki: Opiskelijanumero [+]
Eräässä yliopistossa opiskelijanumerot
sisältävät kuusi numeroa ja tarkistuskirjaimen. Opiskelija kirjoitti
numeronsa muodossa
$53x576J$ missä numero $x$ jäi niin suttuisaksi, ettei siitä saanut
selvää. Mikä $x$ on kun tarkistuskirjain $J$ tarkoittaa, että kun
$J$:tä edeltävien numeroiden
muodostama luku jaetaan $23$:lla niin jakojäännös on $9$.
Vastaus [+]
Voimme kirjoittaa luvun $53x576$
muodossa $530\,576+x\cdot
1\,000$ ja silloin saamme annettujen tietojen avulla
koska $\Mod(530\,576,23)=12$ ja $\Mod(1\,000,23)=11$.
Tästä seuraa, että $[x]_{23}\cdot [11]_{23}= [-3]_{23}$ ja
koska $[11]_{23}^{-1}=[21]_{23}$ koska $\Mod(21\cdot 11,23)=
\Mod(231,23)=1$ joten
ja voimme päätellä, että $x=6$ koska $0\leq x\leq 9$.
Eukleideen algoritmi ja $\Gcd(m,n)$ [-]
- Oleta, että $m\geq n>0$.
- Valitse $r_0=m$ ja $r_1=n$.
- Laske $q_j$ ja $r_j$ siten, että $0\leq r_j < r_{j-1}$ ja
\begin{equation*}
r_{j-2}=q_j\cdot r_{j-1}+ r_j
\end{equation*}
kun $j\geq 2$ ja $r_{j-1}> 0$.
- $\Gcd(m,n)= r_{k-1}$ jos $r_k=0$.
Esimerkki: [+]
Kun laskemme $\Gcd(291,108)$ Eukleideen algoritmin avulla
niin tulos on seuraava:
\begin{align*}
291 &= 2\cdot 108 + 75\\
108 &= 1\cdot 75 + 33\\
75 &= 2\cdot 33 + 9\\
33 &= 3\cdot 9 + 6\\
9 & = 1 \cdot 6 + 3\\
6& = 2\cdot 3 + 0
\end{align*}
joten $\Gcd(291,108)=3$.
Miksi Eukleideen algoritmi toimii? [+]
Jos $d\,|\, r_{j}$ ja $d\,|\, r_{j-1}$ niin $d\,|\, r_{j-2}$
koska $r_{j-2}=q_j\cdot r_{j-1}+ r_j$ joten
$\Gcd(r_{j-2},r_{j-1}) \geq \Gcd(r_{j-1},r_j)$. Vastaavasti, jos
$d\,|\, r_{j-2}$ ja $d\,|\, r_{j-1}$ niin $d\,|\, r_{j}$
koska $r_j=r_{j-2}-q_j \cdot r_{j-1}$ joten
$\Gcd(r_{j-1},r_j)\geq \Gcd(r_{j-2},r_{j-1})$ ja näin
ollen $\Gcd(r_{j-1},r_j)= \Gcd(r_{j-2},r_{j-1})$.
Jos $r_k=0$ niin
$\Gcd(r_{k-1},r_k) = \Gcd(r_{k-1},0) =r_{k-1}$ koska $d|0$ kaikilla
$d$ joten
Eukleideen algoritmi ja $\Z/n\Z$:n
käänteisalkiot [+]
Eukleideen algoritmissa valitaan $r_0=m$, $r_1=n$ ja sitten
lasketaan
$q_j$ ja $r_j$ kun $j=2,\ldots, k$ kaavalla
$r_{j-2}=q_j\cdot r_{j-1}+r_j$ kunnes $r_k=0$, jolloin
$r_{k-1}=\Gcd(m,n)$. Koska
$r_{k-3}=q_{k-1}\cdot r_{k-2}+r_{k-1}$ niin
missä siis $a_{k-3}=1$ ja $b_{k-3}=q_{k-1}$. Näin ollen
$\Gcd(m,n)= a_j\cdot r_j+b_j\cdot r_{j+1}$ ainakin kun $j=k-3$ ja
jos tämä tulos pätee myös jollakin $j$, $1\leq j\leq k-3$
niin tähän sijoitetaan $r_{j+1}= r_{j-1}-q_{j+1}\cdot r_j$
yhtälöstä $ r_{j-1}=q_{j+1}\cdot r_{j}+ r_{j+1}$ jolloin
missä $a_{j-1}=a_j+b_j$ ja $b_{j-1}=-b_j\cdot q_{j+1}$. Näin
ollen saadaan induktiolla
\[
\Gcd(m,n) = a_0\cdot m+ b_0\cdot n.
\]
Jos nyt $\Gcd(m,n)=1$ niin
\begin{align*}
[a_0]_n\cdot [m]_n&=[1]_n\quad \text{eli}\quad [a_0]_n= [m]_n^{-1}, \\
[b_0]_m\cdot [n]_m&=[1]_m\quad \text{eli}\quad [b_0]_m= [n]_m^{-1}.
\end{align*}
Esimerkki: Jäännösluokan käänteisalkio [+]
Jos haluamme laskea $[23]_{67}^{-1}$ niin ensin laskemme $\Gcd(67,23)$
eli
\begin{align*}
67 &= 2 \cdot 23 + 21\\
23 &= 1 \cdot 21 + 2\\
21 &= 10 \cdot 2 + 1\\
2 &= 2 \cdot 1 + 0
\end{align*}
Jotta voisimme esittää $\Gcd(67,23)$:n lukujen
$67$ ja $23$ avulla laskemme takaperin :
\[
\Gcd(67,23)=1 =21-10\cdot 2\\
= 1 \cdot 21 -10\cdot (23 - 1\cdot 21)\\
=-10\cdot 23+11\cdot 21 \\
= -10 \cdot 23 +11\cdot (67 - 2\cdot 23)\\
=11\cdot 67-32\cdot 23
\]
Tästä seuraa, että $(-32)\cdot 23= 1-11\cdot 67$ joten
$[(-32)\cdot 23]_{67}=[1]_{67}$ mikä on yhtäpitävää sen kanssa, että
$[23]_{67}^{-1} = [-32]_{67}=[-32+67]_{67}=[35]_{67}$.
Montako laskutoimitusta tarvitaan kun
$\Gcd(m,n)$ ja $[n]_{m}^{-1}$
lasketaan Eukleideen algoritmilla? [+]
Oletamme, että $m> n$. Eukleideen algoritmissa
valitsemme $r_0=m$,
$r_1=n$ ja sitten laskemme $r_i$ ja $q_i$ siten,
että $ r_{i-2}=q_ir_{i-1}+ r_i $
kun $i\geq 2$ kunnes $r_{K}=0$ ja silloin
$r_{K-1}=\Gcd(m,n)$. Tähän tarvitaan $K-1$ jakolaskua.
Meidän pitää siis arvioida miten iso $K$ voi olla ja tätä varten
valitsemme $x_1=1$, $x_2=2$ ja
\[
x_{j+2}=x_{j+1}+x_{j}, \quad j\geq 1.\tag{$\star$}
\]
Tiedämme, että $r_{K-1}\geq x_1$ ja $r_{K-2}\geq x_2$ koska
$r_{K-2}> r_{K-1}$. Jos nyt oletamme, että
$r_{K-i}\geq x_i$ kun $1\leq
i\leq j$ niin saamme, koska $q_{K-j+1}\geq 1$ että
Induktioperiaatteesta seuraa nyt, että $r_{K-j}\geq x_j$ kaikilla
$j=1,\ldots ,K$.
Voisimme ratkaista yhtälön ($\star$) (kyseessä hän on
Fibonaccin yhtälö tavallisesta hieman poikkeavalla indeksoinnilla)
mutta on ehkä yksinkertaisempaa
osoittaa, induktion avulla, että
$x_j\geq \left (\frac {1+\sqrt 5}2\right )^{j-1}$
kun $j\geq 1$
(Miten? [+])
Toteamalla,
että $x_1=1= \left (\frac {1+\sqrt 5}2\right )^{1-1}$,
$x_2=2\geq \left (\frac {1+\sqrt 5}2\right )^{2-1}$ ja
että $\left (\frac
{1+\sqrt 5}2\right )^{j+1-1} + \left (\frac
{1+\sqrt 5}2\right )^{j-1}= \left (\frac
{1+\sqrt 5}2\right )^{j+2-1}$.
Tästä seuraa, että
\[
m=r_0\geq x_{K}\geq \left (\frac {1+\sqrt 5}2\right )^{K-1},
\]
josta seuraa, että
\[
K-1 \leq \frac {\log(m)}{\log\left (\frac {1+\sqrt 5}2\right )},
\]
eli tarvitaan $O(\log(\max(m,n)))$ laskutoimitusta $\Gcd(m,n)$:n
laskemiseksi Eukleideen algoritmin avulla. Tästä seuraa myös, että
$[n]_{m}^{-1}$:n laskemiseksi tarvitaan $O(\log(m))$ laskutoimitusta.
Jaollisuustulos [+]
Jos $m$ ja $n$ ovat kokonaislukuja ja $p$ on alkuluku siten, että
$m\cdot n$ on $p$:llä jaollinen niin joko $m$ tai $n$ on $p$:llä
jaollinen ja tässä on kyse siitä miten tämä
väite todistetaan käyttämättä
tuloksia, jotka perustuvat tähän tulokseen.
Miksi ? [+]
Oletamme, että $m$ ei ole $p$:llä jaollinen. Silloin pätee
$\Gcd(p,m)=1$ koska $p$ on alkuluku. Eukleideen laajennetun algoritmin
nojalla on
olemassa kokonaislukuja $a$ ja $b$ siten, että
$a\cdot p + b\cdot m=1$. Kerromme tämän yhtälön molemmat puolet
$n$:llä ja saamme
\[
n = n\cdot 1 = n\cdot a\cdot p + b\cdot m\cdot n .
\]
Koska $m\cdot n$ on $p$:llä jaollinen niin on olemassa kokonaisluku
$k$ siten, että
$m\cdot n=k\cdot p$. Tästä seuraa, että
\[
n= n\cdot a\cdot p+ b\cdot k\cdot p = (n\cdot a+ b\cdot k)\cdot p,
\]
josta seuraa, että $n$ on $p$:llä jaollinen.
Eulerin $\varphi$-funktio [+]
\[
\varphi(n) =\card{ \set{m\in \Z: 0\leq
m\leq n-1, \Gcd(m,n)=1}},
\]
eli $\varphi(n)$ on niiden joukon $\Z/n\Z$ alkioiden lukumäärä,
joilla on käänteisalkio.
Huomaa, että $[0]_1$:llä on käänteisalkio joukossa $\Z/1\Z$
joten
$\varphi(1)=1$ mutta $[0]_n$:llä ei tietenkään (?) ole
käänteisalkiota joukossa
$\Z/n\Z$ kun $n>1$.
Matlab/octave:ssä tämän funktion laskemiseksi
voidaan käyttää funktiota
@(n)sum(gcd(0:n-1,n)==1).
Esimerkki: $\varphi(p\cdot
q)=(p-1)\cdot (q-1)$ kun $p$ ja $q$ ovat eri alkulukuja [+]
Koska $p$ ja $q$ ovat alkulukuja niin joukko $\set{k\in \Z\mid
0\leq k < p\cdot q,\, \Gcd(k,p\cdot q)\neq 1}$ on $\{0\} \cup
\{q,2\cdot q, \ldots (p-1)\cdot q\} \cup \{p, 2\cdot p,\ldots
(q-1)\cdot p\}$ ja tässä joukossa on $1+(p-1)+(q-1)$ alkiota. Koska
joukossa $\{0,1,2,\ldots,p\cdot q-1\}$ on $p\cdot q$ alkiota niin
Tämä tulos on erikoistapaus tuloksesta, joka sanoo että
$\varphi(a\cdot b)=\varphi(a)\cdot \varphi(b)$ kun $\Gcd(a,b)=1$.
Eulerin lause [+]
Jos $\Gcd(a,n)=1$ ja $n>1$ niin
Erityisesti, jos $p$ on alkuluku ja $\Gcd(a,p)=1$ niin
Todistus [+]
- Oletamme, että $[x_1]_n,\ldots ,[x_{\phi(n)}]$ ovat ne
$\Z/n\Z$:n alkiot joilla on käänteisalkio eli ovat kääntyviä.
- Koska $\Gcd(a,n)=1$ niin myös
$[a]_n$ on kääntyvä ja koska $[\alpha]_n\cdot [\beta]_n$ on
kääntyvä jos
$[\alpha]_n$ ja $[\beta]_n
$ ovat kääntyviä, niin $[a]_n\cdot [x_j]$ on kääntyvä kaikilla
$j$.
- Jos nyt $[a]_n\cdot [x_j]_n=[a]_n\cdot [x_k]_n$ niin
$[a]_n^{-1}\cdot [a]_n\cdot [x_j]_n= [a]_n^{-1}\cdot
[a]_n\cdot [x_k]_n$ eli $[x_j]_n=[x_k]_n$. Tästä
seuraa, että alkiot
$[a]_n\cdot [x_1]_n, \ldots [a]_n\cdot [x_{\varphi(n)}]_n$ ovat samat
kuin alkiot
$[x_1]_n,\ldots ,[x_{\varphi(n)}]$ mutta mahdollisesti eri
järjestyksessä.
- Mutta tulot ovat samat, eli
-
Koska kaikki alkiot $[x_i]_n$ ovat kääntyviä niin voimme supistaa
pois kaikki $[x_i]_n$:t ja lopputulos on,
että $[a]_n^{\varphi(n)}=[1]_n$
eli $\Mod(a^{\varphi(n)},n)=1$.
RSA-algoritmi [-]
RSA-algoritmissa käytetään julkista avainta $(n,k)$ viestin
kryptaamiseen eli salaamiseen ja
yksityistä avainta $(n,d)$ kryptatun viestin purkamiseen:
- Kryptaaminen: Viesti $a$, joka on luku $0$:n ja
$n-1$:n väliltä kryptataan eli salataan lähetettäväksi viestiksi
$b=\Mod(a^k,n)$.
- Vastaanotettu viesti $b$ puretaan alkuperäiseksi
viestiksi $a = \Mod(b^d,n)$.
Menetelmä perustuu siihen, että julkisen avaimen avulla on (pitää
olla) ylivoimaisen vaikeata määrittää yksityistä avainta
jolloin kuka tahansa voi lähettää viestin,
joka on salattu vastaanottajan julkisella avaimella
mutta ainoastaan vastaanottaja, joka tuntee oman
yksityisen avaimensa pystyy purkamaan salatun viestin.
Miten RSA-algoritmin avaimet on
valittava? [+]
- Valitaan $n=p\cdot q$ missä $p$ ja $q$ ovat kaksi
isoa alkulukua siten, että luvun $n$
jakaminen alkulukutekijöiksi on ylivoimaisen vaikeata
(jolloin myös esimerkiksi $\abs{p-q}$:n on oltava "iso").
- Valitaan $k$ olemaan iso
luku siten että $\Gcd(k,m)=1$ missä
$m=(p-1)\cdot (q-1)$.
- Eukleideen algoritmin avulla määritetään $d$ siten, että
$[d]_m= [k]_m^{-1}$.
Salaus siis perustuu siihen, että on vaikeata
määrittää lukua $d$ jos lukua $m$ ei tunneta ja
sen laskemiseksi tarvitaan luvut $p$ ja $q$.
Esimerkki [+]
Jos RSA-algoritmilla ja julkisella avaimella $(55,23)$ haluamme
salata viestin $9$ niin meidän pitää laskea
$\Mod(9^{23},55)$. Vaikka luvut $55$ ja $23$ ovat salauksen kannalta
aivan liian pieniä, ei ole järkevää laskea ensin $m=9^{23}$ ja sitten
$\Mod(m,55)$. Sen sijaan toteamme ensin, että
$23=16+4+2+1=2^4+2^2+2^1+2^0$ joten
$9^{23} = 9^{16}\cdot 9^{4}\cdot 9^2\cdot 9=(((9^2)^2)^2)^2\cdot
(9^2)^2\cdot 9^2\cdot 9$ ja joka vaiheessa voimme soveltaa
$\Mod$-funktiota eli laskemme ensin $\Mod(9^2,55)= 26$ sitten
$\Mod(9^4,55)=\Mod(26^2,55)=16$ jne. jolloin saamme $\Mod(9^j,55)$
kun $j=1,2,4,8,16$. Lopuksi laskemme $\Mod(9^3,55)= \Mod(9\cdot
9^2,55)=\Mod(9\cdot 26,55)$ ja sitten samalla tavalla
$\Mod(9^7,55)$ ja $\Mod(9^{23},55)$. Tehokkaimmen voimme tehdä tämän
seuraavan algoritmin avulla
joka laskee $\Mod(x^y,n)$:
function z=pmod(x,y,n)
z=1;
x=mod(x,n);
while y > 0
k=mod(y,2);
if k == 1, z=mod(z*x,n); end
y=(y-k)/2;
if y > 0, x=mod(x*x,n); end
end
return,endfunction
Tämän algoritmin avulla saamme seuraavat välitulokset kun laskemme
$\Mod(9^{23},55)$ eli
pmod(9,23,55):
$k$ | $z$ | $x$ | $y$ |
| $1$ | $9$ | $23$ |
1 | $\Mod(1\cdot 9,55)=9$ |
$\Mod(9\cdot 9,55)=26$ | $11$ |
1 | $\Mod(9\cdot 26,55)=14$ |
$\Mod(26\cdot 26,55)=16$ | $5$ |
1 | $\Mod(14\cdot 16,55)=4$ |
$\Mod(16\cdot 16,55)=36$ | $2$ |
0 | $4$ |
$\Mod(36\cdot 36,55)=31$ | $1$ |
$1$ | $\Mod(4\cdot 31,55)=14$ |
$31$ | $0$ |
ja viimeinen $z$-arvo $14$ on salattu viesti.
Huomaa, että $k$:n arvoista muodostettu jono $10111$ on luvun
$23$ binääriesitys.
Jotta voisimme purkaa lähetettyä viestiä $14$ meidän
täytyy tietää mikä
yksityinen avain on ja koska $55=5\cdot 11$
ja $(5-1)\cdot (11-1)=40$
niin meidän täytyy laskea $[23]_{40}^{-1}$ ja saamme vastaukseksi
$[7]_{40}$ koska $\Mod(23\cdot 7,40)= \Mod(161,40)=1$. Yksityinen
avain on siis $(55,7)$ ja meidän pitää laskea
$\Mod(14^7,55)$. Jos käytämme samaa algoritmia kuten edellä
lasku näyttää seuraavanlaiselta:
$k$ | $z$ | $x$ | $y$ |
| $1$ | $14$ | $7$ |
1 | $\Mod(1\cdot 14,55)=14$ |
$\Mod(14\cdot 14,55)=31$ | $3$ |
1 | $\Mod(14\cdot 31,55)=49$ |
$\Mod(31\cdot 31,55)=26$ | $1$ |
1 | $\Mod(49\cdot 26,55)=9$ |
| $0$ |
Miksi RSA-algoritmi toimii? [+]
- Oleta ensin yksinkertaisuuden vuoksi, että $\Gcd(a,n)=1$.
- $\varphi(n) =\varphi(p\cdot
q)=(p-1)\cdot(q-1) =m$.
- Eulerin lauseen mukaan $[a^m]_n=[1]_n$.
- Koska $[d]_m= [k]_m^{-1}$ niin $k\cdot d=1+ r\cdot m$ ja
josta seuraa, että $\Mod(b^d,n)=\Mod(a,n)=a$.
Miksi RSA-algortimi toimii jos
$\Gcd(a,n)\neq 1$? [+]
- Koska oletamme, että $0 < a< n$ niin
$\Gcd(a,n)\neq 1$ ainoastaan jos $p\,|\,a$ tai
$q\,|\,a$. Oletamme seuraavaksi, että $p\,|\,a$
joten $a=p^j\cdot c$ missä $\Gcd(c,n)=1$.
- Nyt $[b^d]_n=[((p^j\cdot c)^k)^d]_n=[(p^k)^d]_n^j\cdot
[(c^k)^d]_n$ ja koska $\Gcd(c,n)=1$ niin
$[(c^k)^d]_n=[c]_n$ ja meidän täytyy vielä osoittaa,
että $[(p^k)^d]_n=[p]_n$ koska silloin
$[b^d]_n= [p]_n^j\cdot [c]_n = [p^j\cdot c]_n= [a]_n$.
- Koska $q$ on alkuluku niin $\varphi(q)=q-1$ ja koska myös $p$
on alkuluku ja $p\neq q$ niin $\Gcd(p,q)=1$
joten Eulerin lauseesta seuraa, että
$[p^{q-1}]_q=[1]_q$.
- Silloin myös $[p^{(q-1)(p-1)r}]_q=[1]_q$ eli
$p^{(q-1)(p-1)r}= 1+ sq$ ja kun kerromme molemmat
puolet $p$:llä saamme $p^{1+(q-1)(p-1)r}= p + spq=p+sn$.
Koska $[d]_m=[k]_m^{-1}$ niin $k\cdot d=1+mr=1+(p-1)(q-1)r$
ja näin ollen $[(p^k)^d]_n=[p^{1+(q-1)(p-1)r}]_n = [p]_n$
ja algoritmi toimii siis myös tässä tapauksessa!
RSA-algoritmi ja allekirjoukset[+]
Jos A haluaa lähettää viestin $a$ B:lle ja B haluaa tulla
vakuuttuneeksi siitä, että viesti todella on peräisin A:lta niin he
voivat toimia seuraavalla tavalla:
- A laskee tiivisteen eli hajautusarvon $h(a)$
viestistä $a$.
- A salaa viestin $a$ B:n julkisella avaimella
$(n_B,k_B)$ salatuksi viestiksi $b=\Mod(a^{k_B},n_B)$.
- A salaa tiivisteen $h(a)$ omalla yksityisella avaimellaan
$(n_A,d_A)$ allekirjotukseksi $s=\Mod(h(a)^{d_A},n_A)$.
- A lähettää $b$:n ja $s$:n B:lle.
- B purkaa $b$:n yksityisellä avaimellaan $(n_B,d_B)$ ja
saa tulokseksi $a$:n.
- B laskee tiivisteen $h(a)$:n ja purkaa $s$:n A:n
julkisella avaimella
$(n_A,k_A)$ ja jos tulos on sama kuin $h(a)$ niin hän
tulee vakuuttuneeksi siitä,
että viesti $a$ todella on peräisin $A$:lta koska kukaan muu
ei pysty salaamaan
$h(a)$:ta $A$:n yksityisellä avaimella $(n_A,d_A)$.
Koska $[k]_{m}=[d]_{m}^{-1}$ niin viesti joka on salattu
yksityisellä avaimella voidaan purkaa julkisella avaimella.
Esimerkki [+]
A haluaa lähettää B:lle viestin $9$ ja lisätä siihen
allekirjoituksen, jotta B voi olla varma siitä, että A todella on
viestin lähettäjä.
Jos nyt A:n julkinen RSA-avain on $(n_A,k_A)=(91,11)$,
yksityinen avain
on $(n_A,d_A)=(91,59)$ ja vastaavasti B:n julkinen avain on
$(n_B,k_B)=(55,23)$ ja yksityinen avain $(n_B,d_B)=(55,7)$ ja
hajautusfunktiona käytetään $h(x)= \lfloor 2^{6}\cdot \Mod(x\cdot
(\sqrt{5}-1)/2,1)\rfloor$ niin A ja B suorittavat seuraavat
laskut:
- A salaa viestin $9$ B:n julkisella avaimella ja saa tulokseksi
$\Mod(9^{k_B},n_B)=\Mod(9^{23},55)=14$
- A laskee tiivisteen $h(9)=35$.
- A salaa allekirjoituksen
omalla yksityisellä avaimellaan ja saa tulokseksi
allekirjoituksen
$\Mod(35^{d_A},n_A)=\Mod(35^{11},91)=42$.
- A lähettää luvut $14$ ja $42$ B:lle.
- B purkaa viestin salauksen omalla yksityisellä avaimella ja
saa tulokseksi $\Mod(14^{d_B},n_B)=\Mod(14^7,55)= 9$.
- B laskee tiivisteen $h(9)=35$.
- B purkaa A:n lähettämän allekirjoituksen A:n
julkisella avaimella ja saa tulokseksi
$\Mod(42^{k_A},n_A)=\Mod(42^{59},91) =35$.
- Koska tulos on $h(9)$ niin B luottaa siihen, että A on
viestin lähettäjä.
Viimeksi muokattu: G. Gripenberg,