**Merkle-Hellman kriptosistema** – viena pirmųjų viešo rakto kriptosistemų, sukurta 1978 metais Ralph Merkle ir Martin Hellman. Sistema paprastesnė už RSA, tačiau nepatikima – nepatikimumą įrodė Adi Shamir 9-o dešimtmečio pradžioje.

Aibės poaibio sumos problema
----------------------------

Ši kriptosistema remiasi taip vadinamos aibės poaibio sumos problemos sprendimo sudėtingumu. Šios problemos esmė yra tokia: turint aibę skaičių {\displaystyle A=\{a\_{1},a\_{2},...a\_{n}\},n\in N\,}ir kitą skaičių {\displaystyle x\,}, nustatyti, ar kurio nors poaibio elementų suma lygi duotajam skaičiui, t. y. ar

{\displaystyle \exists {\hat {A}}\subset A:\ \sum \_{i\in I}a\_{i}=x,\ a\_{i}\in {\hat {A}}\,}
čia {\displaystyle I\,} – indeksų aibė.
Bendru atveju problema priklauso NPC problemų klasei, tačiau tam tikri „paprasti" atvejai lengvai išsprendžiami.

Merkle-Hellman kriptosistema išnaudoja tą faktą, kad poaibio problemą galima iš išsprendžiamos per polinominį laiką, t. y. iš atskiro išsprendžiamo atvejo, paversti į problemą, kurią sunku išspręsti.

### Kuprinės problema

Kuprinės problema (ang. knapsack problem) yra aibės poaibio sumos problemos atskiras atvejis.

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

Skaičiai {\displaystyle w\_{i}\,} sudaro sparčiai didėjančią seką (SDS), jeigu visiem {\displaystyle i>1\,} tesinga nelygybė:

{\displaystyle w\_{1}+w\_{2}+\ldots +w\_{i-1}<w\_{i}\,}
Šiuo atveju kuprinės problema išsprendžiama per polinominį laiką sekančio algoritmo pagalba:

```
ĮVESTIS: {\displaystyle (w\_{1},w\_{2},\ldots ,w\_{n})\,} – SDS, {\displaystyle x\,} – skaičius
IŠVESTIS: {\displaystyle (x\_{1},x\_{2},\ldots ,x\_{n}),\ x\_{i}\in \{1,0\}\,}, ir {\displaystyle \sum \_{i=1}^{n}x\_{i}w\_{i}=x\,}
  1. {\displaystyle i\leftarrow n\,}
  2. Kai {\displaystyle i\geq 1\,}:
    2.1 Jei {\displaystyle s\geq b\_{i}\,}, tai {\displaystyle x\_{i}\leftarrow 1\,}, kitaip {\displaystyle x\_{i}\leftarrow 0\,}
    2.2 {\displaystyle i\leftarrow i-1\,}
  3. Rezultatas: {\displaystyle (x\_{1},x\_{2},\ldots ,x\_{n}),\ x\_{i}\in \{1,0\}\,}
```

  

Tarkime, kad {\displaystyle W={w\_{1},w\_{2},\ldots ,w\_{n}}\,} – yra sparčiai didėjanti seka. Pasirenkame skaičių {\displaystyle p\,} taip, kad būtų:

{\displaystyle p>\sum \_{i=1}^{n}w\_{i}\,}
Tagu skaičiai {\displaystyle s,\ t\,} yra tarpusavyje pirminiai su {\displaystyle p\,}, t. y. {\displaystyle st\equiv 1{\pmod {p}}\,}.

Sudarome raktus. Viešas raktas:

{\displaystyle K\_{v}=V=\{v\_{1},v\_{2},\ldots ,v\_{n}\},\ v\_{i}\equiv w\_{i}t{\pmod {p}}\,}
Pastebėsime, kad {\displaystyle V\,} nėra sparčiai didėjanti seka.

Privatus raktas:

{\displaystyle K\_{p}=<W,\ s>\,}

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

Tarkime, kad {\displaystyle M=m\_{1}m\_{2}\ldots m\_{n}\in \{0,1\}^{n}\,} – pranešimas.

Šifravimas:

{\displaystyle C=e(M,K\_{v})=m\_{1}v\_{1}+m\_{2}v\_{2}+\ldots +m\_{n}v\_{n}\,}
{\displaystyle C\,} – pranešimo {\displaystyle M\,} šifras.
Dešifravimas:

{\displaystyle C\_{1}=d(C,K\_{p})\equiv Cs{\pmod {p}}\,}
{\displaystyle C\_{1}=m\_{1}sv\_{1}+m\_{2}sv\_{2}+\ldots +m\_{n}sv\_{n}{\pmod {p}}\equiv \,}
{\displaystyle m\_{1}w\_{1}+m\_{2}w\_{2}+\ldots +m\_{n}w\_{n}{\pmod {p}}\,}
Dabar, naudojantis algoritmu spręsti poaibio sumos SDS atveju problemą, surandame {\displaystyle m\_{i},\ i=\{1,2,\ldots ,n\}\,} – o tai ir yra dešifruotas pranešimas.

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

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

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

* Rivest-Shamir-Adleman kriptosistema, RSA