[ Pobierz całość w formacie PDF ]

której przekazywana jest tablica bajtów zawierająca sprawdzany podpis. Jeśli metoda verijy()
zwróci wartość true, to podpis jest w porządku; jeśli jalse, to dane nie pasują do podpisu.
Metody Signature.setParameter() i Signature.getParameters()
Podobnie jak obiekty Cipher czy KeyPairGenerater, obiekty klasy Signature mogą korzy-
stać z obiektów AlgerithcParaceterSpec w celu dostarczenia dodatkowych informacji lub
zwrócenia obiektu AlgerithcParaceters zawierającego ustawienia pozwalające w razie
potrzeby powtórzyć wykonywaną operację. Jak można się spodziewać, metoda Signature.
getParaceters() zwraca obiekt AlgerithcParaceterSpec zawierający parametry bieżącej
operacji. Nieco inaczej wygląda korzystanie z takiego obiektu z klasą Signature, gdyż nie
jest on przekazywany w ramach inicjalizacji obiektu, lecz za pomocą metody Signature.
setParaceter(). Jeśli przekazane metodzie parametry nie nadają się dla danej implementa-
cji algorytmu podpisu, metoda ta zgłosi wyjątek InvaliSAlgerithcParacetergeceptien.
Przykład użycia parametrów zobaczymy nieco pózniej, przy okazji omawiania podpisów
cyfrowych typu RSA PSS. Najpierw jednak zajmiemy się algorytmem specjalnie stworzo-
nym wyłącznie do tworzenia i sprawdzania podpisów cyfrowych.
Algorytm podpisu cyfrowego DSA
Pierwszą wersję algorytmu podpisu cyfrowego DSA (ang. Digital Signature Algorithm)
przedstawił w sierpniu 1991 roku NIST. DSA stał się następnie pierwszym na świecie al-
gorytmem podpisu cyfrowego oficjalnie zatwierdzonym przez rząd  został on opisany w do-
kumencie FIPS PUB 186 jako standard podpisu cyfrowego DSS (ang. Digital Signature
Standard). Nazwy DSA i DSS są niekiedy stosowane zamiennie, choć między algorytmami
jest pewna różnica: DSS wymaga korzystania konkretnie z SHA-1 jako funkcji skrótu.
Ciekawą cechą DSA jest to, że nie da się go użyć do szyfrowania. Na rysunku 4.4 widać, że
celem działania algorytmu jest wyłącznie weryfikacja podpisu za pomocą klucza publicz-
nego, czyli bez ujawniania danych użytych do utworzenia podpisu.

Rozdział 4. Kryptografia asymetryczna 151
Rysunek 4.4.
Zwykły DSA
Podobnie jak w przypadku algorytmu Diffiego-Hellmana, bezpieczeństwo tradycyjnego al-
gorytmu DSA opiera się na trudności obliczania logarytmów dyskretnych. Do skorzystania
z mechanizmu DSA potrzebne są następujące dane:
liczba pierwsza Q taka, że 2159
liczba pierwsza P taka, że Q jest dzielnikiem (P  1);
generator G dla niepowtarzalnej grupy cyklicznej rzędu Q w ciele P.
Nie będę się tu zagłębiać w operacje matematyczne związane z obliczaniem generatora.
Wystarczy wiedzieć, że znając P, Q i G, można utworzyć klucz publiczny, wybierając
wartość prywatną X taką, że 1 d" X d" Q, a następnie obliczając wartość publiczną Y = GX
mod P. Klucz publiczny stanowi zbiór wartości Y, P, Q i G, natomiast kluczem prywatnym
są X, P, Q i G.
Znając klucz publiczny i prywatny, można już tworzyć i sprawdzać podpisy cyfrowe.
W odróżnieniu od algorytmu RSA, gdzie operacje z kluczem publicznym i prywatnym są
wykonywane w ten sam sposób, algorytm DSA korzysta z różnych obliczeń do generowa-
nia klucza i sprawdzania go.
Dla danej funkcji skrótu H() (w przypadku DSS będzie to zawsze SHA-1) generowanie
podpisu DSA dla wiadomości M obejmuje następujące etapy:
1. Wybór tajnej, losowej liczby całkowitej K takiej, że 0
2. Obliczenie R = (GK mod P) mod Q.
3. Obliczenie S = ((K 1 mod Q)(H(M) + XR)) mod Q.
Podpis stanowią liczby R i S.
Sprawdzanie podpisu wymaga znajomości klucza publicznego strony podpisującej oraz
wartości R i S. Etapy weryfikacji podpisu to:
152 Kryptografia w Javie. Od podstaw
1. Sprawdzenie, czy 0
2. Obliczenie A = S 1 mod Q, B = (AH(M)) mod Q oraz C = (RA) mod Q.
3. Wyliczenie V = (GBYC mod P) mod Q.
Jeśli V jest równe R, to podpis jest akceptowany. W przeciwnym razie jest on odrzucany.
Nie będę specjalnie wnikać w matematyczną stronę całej procedury, gdyż szczegółowy jej
opis można znalezć w książkach przedstawionych w dodatku D, na przykład w Handbook
of Applied Cryptography Menezesa, van Oorschota i Vanstone a. W tym miejscu bardziej
interesuje nas związek między tymi obliczeniami a praktyczną stroną korzystania z klasy
Signature w Javie.
Spróbuj sam: DSA
Oto przykład zastosowania algorytmu DSA, a przy okazji pierwszy program korzystający
z klasy Signature. Jak widać, w zasadzie wystarczy znać nazwę algorytmu  klasa Signature
skutecznie ukrywa faktyczne obliczenia, dzięki czemu praca z DSA sprowadza się do ko-
rzystania z wyników procesu tworzenia i sprawdzania podpisu.
package rozdzial4;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Signature;
public class BasicDSAExample
{
public static void main(String[] args) throws Exception
{
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "Bi");
keyGen.initialize(512, new SecureRandom());
KeyPair keyPair = keyGen.generateKeyPair();
Signature signature = Signature.getInstance("DSA", "Bi");
// tworzenie podpisu
signature.initSign(keyPair.getPrivate(), ptils.createFixedRandom());
byte[] message = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
signature.update(message);
byte[] sigBytes = signature.sign();
// sprawdzanie podpisu
signature.initVerify(keyPair.getPublic());
signature.update(message);
if (signature.verify(sigBytes))
{

Rozdział 4. Kryptografia asymetryczna 153
System.out.println("ieryfikacja podpisu zako czona powodzeniem.");
}
else
{
System.out.println("Błąd weryfikacji podpisu.");
}
}
}
Uruchomienie programu powinno się zakończyć komunikatem:
ieryfikacja podpisu zako czona powodzeniem.
Jak to działa
Podobnie jak w każdym algorytmie asymetrycznym, pierwszym krokiem jest stworzenie
pary kluczy dla używanego algorytmu. Następnie trzeba inicjalizować obiekt signature
tak, by korzystał z klucza prywatnego:
signature.initSign(keyPair.getPrivate(), ptils.createFixedRandom());
Jak wspominałem w teoretycznym opisie algorytmu DSA, do wygenerowania podpisu po-
trzebna jest liczba losowa. W tym przykładzie wykorzystana została wersja metody initSign()
przyjmująca poza kluczem prywatnym również zródło danych losowych. Gdyby zródło to
nie zostało jawnie podane, dostawca utworzyłby zródło domyślne.
Kolejnym etapem jest wprowadzenie podpisywanych danych do obiektu signature poprzez
wywołanie metody upSate(). Wywołanie metody sign() powoduje obliczenie podpisu
i zwrócenie zawierającej go tablicy bajtów.
W drugiej części przykładu wykonywane jest sprawdzenie podpisu utworzonego w części
pierwszej. W tym celu dla obiektu podpisu wywoływana jest metoda initVerijy() z klu-
czem publicznym podpisującego, po czym treść podpisywanej wiadomości jest przekazy-
wana do obiektu jako argument metody upSate(). Samo sprawdzenie polega na wywołaniu [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • elpos.htw.pl