**Rabin kriptosistema** yra viešo rakto kriptosistema. Ji buvo sukurta Michael O. Rabin.

Tai labai greita kriptosistema, kadangi šifravimui reikalauja vienos operacijos – kėlimo kvadratu moduliu {\displaystyle n\,}. Saugumas remiasi skaičiaus {\displaystyle n\,} skaidymo į du pirminius {\displaystyle p,q\,}, kad {\displaystyle pq=n\,} problemos sudėtingumu.

Raktų parinkimo algoritmas
--------------------------

{\displaystyle A\,} pasirenka du didelius pirminius skaičius {\displaystyle p,q,\ p\neq q\,} ir
sudaugina juos {\displaystyle n=pq\,}. {\displaystyle A\,} viešas raktas

{\displaystyle K\_{v}=<n>\,},
o privatus:

{\displaystyle K\_{p}=<p,q>\,}

Šifravimas/dešifravimas
-----------------------

Tarkime, kad {\displaystyle B\,} nori perduoti {\displaystyle A\,} pranešimą {\displaystyle m\,}, {\displaystyle m\in \{0,1,\ldots ,n-1\}\,}. {\displaystyle B\,} turi {\displaystyle A\,} viešą raktą – {\displaystyle n\,}.

{\displaystyle B\,} užšifruoja {\displaystyle m\,}, tiesiog pakėlus jį kvadratu moduliu {\displaystyle n\,}:

{\displaystyle c\equiv m^{2}{\pmod {n}}\,}
{\displaystyle A\,} dešifruoja pranešimą, suradus {\displaystyle c\,} šaknys {\displaystyle m\_{1},m\_{2},m\_{3},m\_{4}\,} moduliu {\displaystyle n\,}. {\displaystyle A\,} nusprendžia, kuris iš {\displaystyle m\_{i},\ i=1,\ldots ,4\,} yra pranešimas.

### Kvadratinė šaknis moduliu

*Apibrėžimas*. Simboliu {\displaystyle Z\_{n}\,} žymėsime aibę skaičių {\displaystyle \{0,1,\ldots ,n-1\}}.

*Apibrėžimas*. Simboliu {\displaystyle Z\_{n}^{\*}\,} žymėsime aibę skaičių {\displaystyle \{a\in Z\_{n}|DBD(a,n)=1\}}. Jeigu {\displaystyle n\,} – pirminis, tai {\displaystyle Z\_{n}^{\*}=\{a\ |\ 1\leq n\leq n-1\}\,}

*Apibrėžimas*. Tegu {\displaystyle a\,} – skaičius, o {\displaystyle p\,} – pirminis skaičius. Legendre simbolis {\displaystyle \left({\frac {a}{p}}\right)\,} apibrėžiamas taip:

{\displaystyle \left({\frac {a}{p}}\right)=\left\{{\begin{matrix}0&:&p|a\\1&:&a\in Q\_{p}\\-1&:&a\in {\bar {Q\_{p}}}\end{matrix}}\right.}
Čia {\displaystyle Q\_{p}\,} ir {\displaystyle {\bar {Q\_{p}}}\,} apibrėžtos taip:

{\displaystyle Q\_{p}=\{a\ |\exists x\in Z\_{p}^{\*},\ kad\ x^{2}\equiv a{\pmod {p}},\ a\in Z\_{p}^{\*}\}\,}
{\displaystyle {\bar {Q\_{p}}}=\{a\ |neegzistuoja\ x\in Z\_{p}^{\*},\ kad\ x^{2}\equiv a{\pmod {p}},\ a\in Z\_{p}^{\*}\}\,}
Bendras algoritmas kvadratinėm šaknims surasti:

```
ALGORITMAS SQR1
ĮVESTIS: {\displaystyle a\,} - skaičius, {\displaystyle p\,} - pirminis skaičius, {\displaystyle 1\leq a\leq p-1\,}
IŠVESTIS: dvi šaknis skaičiaus {\displaystyle a\,} moduliu {\displaystyle p\,}, jeigu jos egzistuoja
 1. Jeigu {\displaystyle \left({\frac {a}{p}}\right)=-1\,} – šaknų nėra.
 2. Parinkti {\displaystyle b\,}, {\displaystyle 1\leq b\leq p-1\,}, kad {\displaystyle \left({\frac {b}{p}}\right)=-1\,}
 3. Užrašyti skaičių {\displaystyle p-1=2^{s}t\,}, {\displaystyle t\,} – nelyginis.
 4. Apskaičiuoti {\displaystyle a^{-1}{\pmod {p}}\,}
 5. {\displaystyle c\leftarrow b^{t}{\pmod {p}},\ r\leftarrow a^{(t+1)/2}{\pmod {p}}\,}
 6. Visiem {\displaystyle i\,} nuo {\displaystyle 1\,} iki {\displaystyle s-1\,}:
   6.1. {\displaystyle d=(r^{2}a^{-1})^{2^{s-i-1}}{\pmod {p}}\,}
   6.2. Jeigu, {\displaystyle d\equiv -1{\pmod {p}}}, tada {\displaystyle r\leftarrow rc{\pmod {p}}}
   6.3. {\displaystyle c\leftarrow c^{2}{\pmod {p}}\,}
 7. Sprendimas: {\displaystyle (r,-r)\,}
```

Jeigu {\displaystyle p\equiv 3{\pmod {4}}}, tai naudojamas sekantis algoritmas:

```
ALGORITMAS SQR2
ĮVESTIS: {\displaystyle a\,} - skaičius, {\displaystyle p\,} - pirminis skaičius, {\displaystyle 1\leq a\leq p-1\,}
IŠVESTIS: dvi šaknys skaičiaus {\displaystyle a\,} moduliu {\displaystyle p\,}, jeigu jos egzistuoja
 1. {\displaystyle r=a^{(p+1)/4}{\pmod {p}}\,}
 2. {\displaystyle (r,-r)\,}
```

Taikymas šio algoritmo (*SQR2*) Rabin kriptosistemos atveju atrodo taip:

```
Jeigu {\displaystyle p\equiv 3{\pmod {4}}\,} ir Jeigu {\displaystyle q\equiv 3{\pmod {4}}\,}, tada
 1. Surasti {\displaystyle a\,} ir {\displaystyle b\,}, kad {\displaystyle ap+bq=1\,}.
 2. {\displaystyle r=a^{(p+1)/4}{\pmod {p}}\,}
 3. {\displaystyle s=a^{(q+1)/4}{\pmod {q}}\,} 
 4. {\displaystyle x=(aps+bqr){\pmod {n}}\,}
 5. {\displaystyle y=(aps-bqr){\pmod {n}}\,}
 6. Rezultatas: {\displaystyle (x,-x,y,-y)\,}
```

Pastaba: {\displaystyle -x\,} ir {\displaystyle -y\,} moduliu n.

Jeigu {\displaystyle p\,} – pirminis, tai skaičiaus {\displaystyle a\,} moduliu {\displaystyle p\,} šaknys surasime algoritmo *SQR3* pagalba:

```
ALGORITMAS SQR3
ĮVESTIS: {\displaystyle a\,} - skaičius, {\displaystyle p\,} - pirminis skaičius, {\displaystyle 1\leq a\leq p-1\,}
IŠVESTIS: dvi šaknys skaičiaus {\displaystyle a\,} moduliu {\displaystyle p\,}, jeigu jos egzistuoja
 1. Pasirenkame {\displaystyle b\in Z\_{n}\,}, kad {\displaystyle \left({\frac {b^{2}-4a}{p}}\right)=-1\,}
 2. Tegu {\displaystyle f\,} yra polinomas {\displaystyle x^{2}-bx+a} iš {\displaystyle Z\_{p}[x]}
 3. {\displaystyle r=x^{(p+1)/2}\ mod\ f\,}
 4. Rezultatas: {\displaystyle (r,-r)\,}
```

{\displaystyle Z\_{p}[x]\,} – Polinomų žiedas

Rabin kriptosistemos atveju algoritmas *SQR3* panaudojamas taip:

```
ALGORITMAS SQR4
ĮVESTIS: {\displaystyle a\,} - skaičius, {\displaystyle n=pq\,}, {\displaystyle p} ir {\displaystyle q} pirminiai
IŠVESTIS: keturios šaknys skaičiaus {\displaystyle a\,} moduliu {\displaystyle n\,}, jeigu jos egzistuoja
 1. Naudojant SQR3, surandame skaičiaus {\displaystyle a\,} šaknys {\displaystyle (r,-r)\,} moduliu {\displaystyle p\,}
 2. Naudojant SQR3, surandame skaičiaus {\displaystyle a\,} šaknys {\displaystyle (s,-s)\,} moduliu {\displaystyle q\,}
 3. Surandame {\displaystyle c\,} ir {\displaystyle d\,}, kad {\displaystyle cp+dq=1\,}
 4. {\displaystyle x\leftarrow (rdq+scp)\ mod\ n\,}, {\displaystyle y\leftarrow (rdq-scp)\ mod\ n\,}
 5. Rezultatas: {\displaystyle (x,-x,y,-y)\,}, visi moduliu {\displaystyle n\,}
```

Literatūra
----------

* A. Menezes, P. van Oorschot, S. Vanstone, 1996, *Handbook of Applied Cryptography*

Kitos viešo rakto kriptosistemos
--------------------------------

* Rivest-Shamir-Adleman kriptosistema, RSA
* Merkle-Hellman kriptosistema