1.10 4. Kłuci* publiczne
podrozdział 4.1), otrzymując liczbę h z przedziału 0 < h < q. Następnie wybiera losową liczbę k z tego samego przedziału, oblicza gk modulo p i jako r bierze resztę z dzielenia wyniku przez q (a więc najpierw oblicza gk modulo />, a następnie wynik dzieli przez mniejszą liczbę pierwszą q i bierze resztę). Wreszcie Alicja znajduje liczbę całkowitą .v taką. że sk = h + xr (mod q). Jej podpisem jest wtedy para (r, s) liczb całkowitych wziętych modulo q.
Aby stwierdzić autentyczność podpisu, adresat (niech np. będzie nim Bolek) oblicza u{ =s~lh mod q i u2 = s~lr mod q. Następnie oblicza gUiyt* (mod p). Jeśli wynik przystaje do r modulo q, uznaje autentyczność podpisu. (Zauważmy, że g"1/"3 = = gk (mod p).)
Ten schemat podpisu ma tę zaletę, że podpisy są względnie krótkie, składają się z dwóch liczb 160-bitowych (mają taki rząd wielkości jak q). Jednakże bezpieczeństwo systemu wydaje się zależeć od trudności obliczeniowych związanych z problemem logarytmu dyskretnego w grupie multyplikatywnej dość dużego ciała Fp. Chociaż do złamania systemu wystarczyłoby znaleźć logarytmy dyskretne w mniejszej podgrupie generowanej przez g, jednak w praktyce nic wydaje się to być łatwiejsze niż znalezienie logarytmów dyskretnych w F*. Zatem wydaje się, że DSS osiągnął zupełnie wysoki poziom bezpieczeństwa, nie rezygnując z małej pamięci potrzebnej do przechowywania podpisu i szybkiego czasu działania.
Algorytmy znajdujące logarytm dyskretny w ciałach skończonych. Najpierw założymy, że wszystkie dzielniki pierwsze liczby ^ — 1 są małe. Przy tym założeniu istnieje szybki algorytm znajdujący logarytm dyskretny elementu yeFJ o podstawie b. Dla uproszczenia przyjmijmy, źe b jest generatorem grupy FJ. Teraz opiszemy ten algorytm, opracowany przez Silvera, Pohliga i Hcllmana.
Najpierw dla każdego dzielnika pierwszego p liczby q — 1 obliczamy pierwiastki stopnia p z jedności dane wzorem rp l — dla j = 0, 1, ...,
p — 1. (Jak zwykle korzystamy z algorytmu iterowanego podnoszenia do kwadratu, by podnieść b do dużej potęgi). Mając już tablicę {rp j}, możemy przystąpić do obliczania logarytmu dyskretnego dowolnego yeFJ. (Zauważmy, że jeśli podstawa b jest ustalona, to obliczenie wstępne musi być przeprowadzone tylko jeden raz, potem ta sama tablica będzie używana dla dowolnego y)
Naszym zadaniem jest znalezienie liczby *, 0 < * < q — 1, takiej, że b* — y. Jeśli q — 1 = f] pa jest rozkładem liczby q — 1 na czynniki pierwsze, to
p
wystarczy znaleźć x mod pa dla każdego dzielnika pierwszego p liczby q — 1; wtedy liczba x jest wyznaczona jednoznacznie przez algorytm z dowodu chińskiego twierdzenia o resztach (twierdzenie 1.3.3). Zatem ustalamy teraz dzielnik pierwszy p liczby q — 1 i pokażemy, jak obliczyć x mod pa.
Przypuśćmy, że x = x0 + xvp + ... + xa_ip*~i (mod p“), przy czym 0 < x{ < p. Aby znaleźć x0, obliczamy y(,_ 1)/p. Otrzymujemy pierwiastek stopnia p z jedności, gdyż y,_1 = 1. Ponieważ y ~ b*, więc — £*(«-i)/p —
5- ffM~l),p =* rPi Xfl. Zatem porównujemy /* z \rf j}<,<j<p i jako x0 bierzemy tę wartośćdla której ylą~l)lf = rpy
Następnie, aby znaleźć zastępujemy y przez y, = y/ó*\ Wtedy loga-rytin dyskretny y,, równy x - x0, przystaje do xtp + ... + xf_1p*~1 modulo «*. Ponieważ yi jest p-tą potęgą, więc = a zatem =
* = ffk- uiP * znów porównujemy
y«"1)/pl z {r^j} i jako x, bierzemy tę wartośćJ, dla której y^"1^ = rpj.
Teraz już powinno być jasne, w jaki sposób indukcyjnie znajdujemy wszystkie współczynniki x0, *„ xa_,. Mianowicie dla każdego i- 1,2,...,
a -1 bierzemy
y, = y/ó*®‘fx,,+ ”'+**',p,*,f
którego logarytm dyskretny przystaje do x,pł +... + xa_ł/'1 modulo />“. ponieważ y, jest p-tą potęgą, więc yj*_1,/p‘ = 1 i =
= ó(x,+*,+,p+'")(,“1)/p = bx,lq~i)lp = rpX|. Znów jako x, bierzemy tę wartośćy, dla której yj*-1^’ = rpj.
Po zakończeniu tego postępowania znamy x mod p* i po powtórzeniu tego dla wszystkich p\q - 1 korzystamy z chińskiego twierdzenia o resztach, by znaleźć x.
Ten algorytm działa dobrze, gdy wszystkie dzielniki pierwsze liczby q- 1 są małe. Ale jasne jest, że wyznaczenie tablicy {rp j} i porównywanie yjł'1)/p,+l z elementami tej tablicy zabierze bardzo dużo czasu, gdy ę -1 jest podzielna przez dużą liczbę pierwszą. (Przez „dużą” rozumiemy liczbę mającą co najmniej 20 cyfr dziesiętnych. Jeśli liczba p\q - 1 jest mniejsza niż lO20, to można połączyć algorytm Silvera-Pohliga-Hellmana z metodą wielkich i małych kroków (ang. giant step - baby step) Shanksa; por. strony 9, 575-576 drugiego tomu książki Knutha.)
Przykład 4. Znajdźmy logarytm dyskretny z 28 o podstawie 2 w F|7 za pomocą algorytmu Silvera-Pohliga-Hellmana. (2 jest generatorem grupy F*7.)
Rozwiązanie. Mamy rozkład 37 - 1 = 22 • 32. Obliczamy 219 = -1 (mod 37), skąd otrzymujemy r2 0 = 1, r2 t = -1. (Dla p = 2 zawsze (r2 /} = {±1}). Następnie 236/3 = 26, 22*36/3 = 10 (mod 37), skąd {r3J} = {1,26,10}. Teraz niech 28 = 2* (mod 37). Najpierw bierzemy p- 2 i znajdujemy x mod 4, które zapisujemy jako x0 + 2xv Obliczamy 2836/2 = 1 (mod 37) i stąd otrzymujemy x„ = 0. Następnie obliczamy 2836/4 s -1 (mod 37) i stąd xl = 1, czyli x = 2 (mod 4). Teraz bierzemy p = 3 i znajdujemy x mod 9, które zapisujemy jako x0 + 3xr (Oczywiście dla każdego p współczynniki x, są zdefiniowane inaczej). Aby znaleźć x0 obliczamy 2836/3 s 26 (mod 37), skąd otrzymujemy x0 = 1. Następnie obliczamy (28/2)36/9 = 144 s 10 (mod 37); zatem xt = 2, czyli x = 1 + 2 • 3 = 7 (mod 9). Pozostaje znaleźć jedyne x mod 36 takie, że x = 2 (mod 4) i x s 7 (mod 9). Jest nim x = 34. Zatem 28 = 234 w F}7.