dla będących dzielnikamidla liczby pierwszej równa się oczywiście . Zatem użyto następującego algorytmu:
start: znajdź liczbę pierwszą B for i := 1 to 1000 do znajdź liczbę pierwszą A policz P := A * B * 2 + 1; jeżeli P jest liczba pierwszą, to return (A, B, P) end for; idź do "start"Ten algorytm daje nie tylko liczbę pierwszą , ale też rozkład . Warto zaznaczyć, że jest bezpieczną liczbą pierwszą, czyli taką, dla której ma duży dzielnik pierwszy. Dobierając odpowiednie parametry można spowodować, by było takiej długości, aby dało się go używać w protokole jako . Ważne jest, by jako pierwsze losować , którego długość powinna wynosić (w implementowanym protokole , a ). Wynika to z faktu, iż im dłuższa jest liczba pierwsza, tym dłużej trwa jej znalezienie. Ta część obliczeń jest bardzo czasochłonna, ale jest wykonywana tylko raz i to przez serwery instytucji certyfikującej, gdyż wszyscy uczestnicy protokołu będą posługiwali się tymi samymi parametrami.
By znaleźć generator grupy użyto następującej procedury (A, B, P to wartości policzone poprzednio):
start: znajdź liczbę pierwszą H mniejszą od P jezeli ( H^A modulo P == 1) idz do "start" jezeli ( H^B modulo P == 1) idz do "start" jezeli ( H^2 modulo P == 1) idz do "start" return HPozwala ona na obliczenie generatora grupy , jednak w protokole używane jest , które jest generatorem podgrupy rozmiaru . Poszukiwane oblicza się używając wzoru:
Kolejnym etapem jest utworzenie kluczy prywatnych i publicznych dla użytkowników systemu. Obliczenia te sprowadzają się tylko do wylosowania elementu , który będzie kluczem prywatnym i policzenia klucza publicznego jako .