— h takie, że g = hSp~l^q ^ 1 mod p oraz 0 < h < p — 1;
— x — liczba pseudolosowa; 1 < x < q; liczba ta wyznacza też y = gx mod p. Liczba x jest kluczem prywatnym do tworzenia podpisów. Liczba y jest kluczem publicznym i tak jak liczby p, q, g jest ogólnie znana.
Tworzenie podpisu: właściciel klucza x podpisuje swój dokument A. Polega to na
— wyborze liczby pseudolosowej k < q;
— wyliczeniu r = (gk mod p) mod q oraz s = mod q;
Podpis stanowi para (s,r).
Weryfikacja podpisu: w tym celu należy podjąć następujące obliczenia:
— w = s-1 mod q;
— u\ = SHA (A) • w mod q;
— U2 = r ■ w mod ę;
— v = ((gUl ■ yUl) mod p) mod q.
Jeśli v = r to podpis jest prawdziwy.
Jak widać wygenerowanie podpisu cyfrowego wymaga dwóch liczb losowych: do wygenerowania klucza oraz do utworzenia samego podpisu. Standard FIPS 186 definiuje postać służących do tego generatorów
Generator klucza prywatnego DSA Algorytm ten do działania wymaga 160-bitowej liczby pierwszej q oraz liczby m określającej ilość generowanych pseudolosowych kluczy z przedziału [0, q — 1].
— Jeśli używamy funkcji jednokierunkowej opartej o SHA1 wybieramy liczbę całkowitą 6, 160 < 6 < 512; jeśli używamy funkcji opartej o DES ustalamy 6 = 160.
— Generujemy losowy i tajny 6-bitowy zarodek 2.
— Definiujemy 160-bitowy ciąg t =67452301 ef cdab89 98bacdfe 10325476 c3d2elf0 (hex)
— Dla i od 1 do m wykonujemy co następuje:
• albo ustalamy yi — 0, albo wybieramy 6-bitowy ciąg yi (jest opcjonalna dana wejściowa użytkownika),
• obliczamy U = (z + yi) mod 2b,
• obliczamy Xi = G (t,li), G jest wybraną funkcją jednokierunkową,
• podstawiamy z = (1 + z + Xi) mod 2b.
— Zwracamy {a: i,X2,... ,xm}.
Generator sekretu dla wiadomości Algorytm ten do działania wymaga 160-bitowej liczby pierwszej q oraz liczby m określającej ilość generowanych pseudolosowych skrętów z przedziału [0,ą — 1].
— Jeśli używamy funkcji jednokierunkowej opartej o SHA1 wybieramy liczbę całkowitą 6, 160 ^ 6 512; jeśli używamy funkcji opartej o DES
ustalamy 6 = 160.
— Generujemy losowy i tajny 6-bitowy zarodek z.
— Definiujemy 160-bitowy ciąg t = ef cdab89 98badcfe 10325476 c3d2elf0 67452301 (hex)
— Dla i od 1 do m wykonujemy co następuje: