ElGamal

Wikipedia:Weryfikowalność
Ten artykuł od 2012-12 wymaga zweryfikowania podanych informacji.
Należy podać wiarygodne źródła w formie przypisów bibliograficznych.
Część lub nawet wszystkie informacje w artykule mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte.
Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • Federacja Bibliotek Cyfrowych • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary)
Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tego artykułu.
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.

ElGamal to jeden z dwóch najważniejszych algorytmów kryptografii asymetrycznej (obok RSA). System jest oparty na trudności problemu logarytmu dyskretnego w ciele liczb całkowitych modulo duża liczba pierwsza. Algorytm w połowie lat 80. XX wieku przedstawił Egipcjanin Taher Elgamal[1].

Algorytm ElGamala umożliwia szyfrowanie oraz obsługę podpisów cyfrowych. Setki modyfikacji algorytmu ElGamala (podobnie jak modyfikacje algorytmu RSA) mają różne inne zastosowania.

Na koncepcji algorytmu ElGamala jest też oparta kryptografia krzywych eliptycznych – w tym przypadku zamiast grupy multiplikatywnej ciała Z p {\displaystyle Z_{p}} używamy grupy punktów na krzywej eliptycznej.

Szyfrowanie

Generowanie klucza: wybieramy dowolną liczbę pierwszą p , {\displaystyle p,} dowolną liczbę α {\displaystyle \alpha } będącą pierwiastkiem pierwotnym modulo p {\displaystyle p} oraz dowolne całkowite k {\displaystyle k} takie, że: 1 < k < p . {\displaystyle 1<k<p.} [2]Liczymy β : {\displaystyle \beta {:}}

β = α k mod p , {\displaystyle \beta =\alpha ^{k}\mod p,}

co potrafimy zrobić szybko za pomocą potęgowania przez podnoszenie do kwadratu.

α {\displaystyle \alpha } jest wybierana w ten sposób, aby zapewnić równomierną dystrybucję α k {\displaystyle \alpha ^{k}} (podobnie jak w protokole Diffiego-Hellmana[3]).

Następnie publikujemy ( p , α , β ) {\displaystyle (p,\alpha ,\beta )} jako klucz publiczny i zachowujemy ( p , α , β , k ) {\displaystyle (p,\alpha ,\beta ,k)} jako klucz prywatny.

Szyfrowanie: mając do zaszyfrowania wiadomość m , {\displaystyle m,} przedstawiamy ją jako element grupy [ 1 < m < p 1 {\displaystyle 1<m<p-1} ] wybieramy losowo liczbę x {\displaystyle x} i liczymy (modulo p {\displaystyle p} )

( α x , m × β x ) . {\displaystyle (\alpha ^{x},m\times \beta ^{x}).}

Deszyfrowanie: podnosimy otrzymane α x {\displaystyle \alpha ^{x}} do potęgi k : {\displaystyle k{:}}

( α x ) k = α k x = ( α k ) x = β x . {\displaystyle \left(\alpha ^{x}\right)^{k}=\alpha ^{kx}=\left(\alpha ^{k}\right)^{x}=\beta ^{x}.}

Następnie znajdujemy odwrotność β x {\displaystyle \beta ^{x}} (nadal modulo p {\displaystyle p} ) rozszerzonym algorytmem Euklidesa:

γ β x + δ p = 1 , {\displaystyle \gamma \beta ^{x}+\delta p=1,}
γ β x 1 mod p , {\displaystyle \gamma \beta ^{x}\equiv 1\mod p,}
γ ( β x ) 1 mod p . {\displaystyle \gamma \equiv (\beta ^{x})^{-1}\mod p.}

W końcu dzielimy m × β x {\displaystyle m\times \beta ^{x}} przez β x , {\displaystyle \beta ^{x},} czyli mnożymy przez jej odwrotność – γ : {\displaystyle \gamma {:}}

( m × β x ) × γ m × ( β x × γ ) m × 1 m mod p . {\displaystyle (m\times \beta ^{x})\times \gamma \equiv m\times (\beta ^{x}\times \gamma )\equiv m\times 1\equiv m\mod p.}

Podpis cyfrowy

Klucz jest generowany w ten sam sposób.

Żeby wygenerować podpis wiadomości m , {\displaystyle m,} losujemy liczbę r {\displaystyle r} i liczymy:

y = α r {\displaystyle y=\alpha ^{r}} (mod p),
s = ( H ( m ) k y ) r 1 {\displaystyle s=(H(m)-ky)r^{-1}} (mod(p-1)), gdzie H {\displaystyle H} jest funkcją haszującą.

Podpisem jest para ( y , s ) {\displaystyle (y,s)}

Żeby zweryfikować podpis, sprawdzamy równanie:

β y y s = α H ( m ) . {\displaystyle \beta ^{y}y^{s}=\alpha ^{H(m)}.}

Dla prawidłowego podpisu będzie się zgadzać:

α k y α r s = α H ( m ) , {\displaystyle \alpha ^{ky}\alpha ^{rs}=\alpha ^{H(m)},}
α k y + r ( ( H ( m ) k y ) r 1 ) = α H ( m ) , {\displaystyle \alpha ^{ky+r\left((H(m)-ky)r^{-1}\right)}=\alpha ^{H(m)},}
α k y + H ( m ) k y = α H ( m ) , {\displaystyle \alpha ^{ky+H(m)-ky}=\alpha ^{H(m)},}
α H ( m ) = α H ( m ) . {\displaystyle \alpha ^{H(m)}=\alpha ^{H(m)}.}

Ważne jest zachowanie tajności wylosowanego r . {\displaystyle r.} Jeśli r {\displaystyle r} byłoby znane, to można by odzyskać klucz prywatny z podpisu:

y 1 ( H ( m ) s r ) = y 1 ( H ( m ) ( H ( m ) k y ) r 1 r ) = y 1 k y = k . {\displaystyle y^{-1}\left(H(m)-sr\right)=y^{-1}\left(H(m)-(H(m)-ky)r^{-1}r\right)=y^{-1}ky=k.}

Poziom bezpieczeństwa

Jeżeli rząd grupy multiplikatywnej jest iloczynem liczb pierwszych, spośród których nawet jedna nie jest odpowiednio duża, istnieje efektywna metoda obliczania wykładnika. Nie jest znana ogólna metoda szybkiego liczenia logarytmu dyskretnego, więc nie wiemy, jak za pomocą α x {\displaystyle \alpha ^{x}} i α {\displaystyle \alpha } uzyskać x , {\displaystyle x,} które w pełni wystarczyłoby do odszyfrowania wiadomości. Nie ma jednak dowodu, że taka nie istnieje. To ostatnie nie może raczej dziwić, gdyż takich dowodów nie ma dla żadnego znanego szyfru asymetrycznego.

Nie mamy jednak dowodu, że złamanie problemu logarytmu dyskretnego jest jedynym sposobem złamania tego szyfru. Być może istnieje szybki algorytm, który, znając α , {\displaystyle \alpha ,} β , {\displaystyle \beta ,} p {\displaystyle p} i α x , {\displaystyle \alpha ^{x},} m × β x {\displaystyle m\times \beta ^{x}} (czyli klucz publiczny i szyfrogram wiadomości), jest w stanie odzyskać m , {\displaystyle m,} obchodząc w jakiś sposób ten problem.

Przypisy

  1. Taher Elgamal w serwisie LinkedIn (ang.).
  2. ElGamal Część z serii dokumentów o algorytmach szyfrujących (ang.)
  3. [1] Wpis na what-why-how o protokole Diffiego-Hellmana (ang.)