Pohlig-Hellman algoritme
Het Pohlig-Hellman algoritme is een algoritme om het Discrete Logaritme Probleem (DLP) zoals dat is gedefinieerd in een cyclische groep te berekenen.
Het algoritme is gebaseerd op het feit dat een geheel getal n geschreven kan worden als
) en dat de simultane congruenties
en
volgens de Chinese reststelling een unieke oplossing heeft. Deze oplossing is het gevraagde getal n als
.
Het algoritme werd ontdekt door Roland Silver, maar voor het eerst gepubliceerd door Stephen Pohlig en Martin Hellman (onafhankelijk van Silver).
Het algoritme is belangrijk op eindig lichaamen
. Elk getal is te schrijven als een product van priemfactoren. Stel q - 1 =
·
·...·
, waar q een priemgetal is. Als q - 1 een product is van kleine priemfactoren, dan is het Polig-Hellman algoritme een methode om deze discrete logaritme te berekenen. In dat geval zeggen we dat het getal q - 1 glad is. In het Duits gebruikt men het woord "glatt" en in het Engels "smooth".
Inhoud |
Theorie [bewerken]
Laat q een priemgetal zijn en laat
voortbrenger zijn van
. We zoeken het positief getal n kleiner dan q - 1, zo dat
=h(mod q). Als q - 1 =
·
·...·
, is het voldoende n(mod
) te vinden voor elke priemfactor
van q - 1. Vooraf berekenen we voor elke priemfactor afzonderlijk de p-de-machts wortelen
=
voor j = 1, 2, ..., p - 1. Om
te vinden, berekenen we
.
Volgens de kleine stelling van Fermat geldt
mod q = 1. Dus berekent
de p-de-machts wortel van 1.
Vanwege
=h krijgen we
=
=
=
. Dit laatste is gelijk aan
. Nu vergelijken we
met {
} en stellen
gelijk aan j als
=
.
Na
moeten we
,
, enz. vinden. Om
te vinden, maken we de aanpassing
=
.
De discrete logaritme van n =
wordt dan n =
(
·
) =
(
) +
(
) =
(
) +
. Dus
(
) = n -
=
+ 
+ ... +
(mod
). n Hieruit volgt
=
en dus
=
=
=
= 1. Tevens
=
=
=
=
=
.
Nu vergelijken we
met de lijst {
} en stellen
gelijk aan j als
=
.
Op deze manier kunnen we verder alle
vinden voor i = 1, 2, ..., m-1. Om
te vinden, maken we de aanpassing
. De discrete logaritme van n =
wordt dan
.
Hieruit volgt
en dus
en
.
Nu vergelijken we
met de lijst {
} en stellen n_i gelijk aan j als
=
.
Voorbeelden [bewerken]
Hier volgen enkele voorbeelden met kleine getallen om m.b.v. het algoritme een DLP op te lossen. In de praktijk rekent men uiteraard met veel grotere getallen om de aanvallen van krakers af te slaan.
Voorbeeld 1 [bewerken]
Gegeven is 2n = 28 (mod 37). Te berekenen is n. Aanpak: 37 - 1 = 36 = 22·32 en we zien dat dit inderdaad een ontbinding is met kleine priemfactoren 2 en 3. Vanwege de exponenten die bij de priemfactoren staan (beide 2) zoeken we voor zowel p = 2 als p = 3 naar congruenties n = n0 + pn1.
We berekenen voor de priemdelers de lijsten {
} = {1,-1} en {
} = {1,26,10}. Stel h = 2n = 28 (mod 37) en bereken 
Dan geldt
. Hieruit volgt n0 = 0
Bereken nu
en daarmee
. Hieruit volgt
. Voor p = 2 wordt de congruentie dus n = 0 + 2·1 (mod 4) = 2 (mod 4).
Voor p = 3 gaan we als volgt te werk: bereken
. Hieruit volgt n0 = 1.
Bereken nu
en daarmee
. Hieruit volgt
. Voor p = 3 wordt de congruentie dus n = 1 + 3·2 (mod 9) = 7 (mod 9). Het stelsel congruentievergelijking dat opgelost kan worden met de Chinese reststelling is dus
- n = 2 (mod 4)
- n = 7 (mod 9)
en heeft als unieke oplossing n = 34.
Voorbeeld 2 [bewerken]
Gegeven is 6n = 7531 (mod 8101). Aanpak: 8101 - 1 = 8100 = 22·
·
en we hebben weer kleine priemfactoren. {
} = {1,-1}; {
} = {1,5883,2217} en {
} = {1,3547,356,7077,5221}.
Voor p = 2:
dus n0 = 1.
en
dus n1 = 0.
Voor p = 3 geldt een exponent 4, wat betekent dat de congruentievergelijking die we zoeken van de vorm
is. We moeten dus
t/m
berekenen en vergelijken met de waarden uit de lijst {
} = {1,5883,2217}.
dus n0 = 2.
en vervolgens
dus n1 = 0.
dus ook
= 2.
en
dus n3 = 1.
De congruentievergelijking is dan n = 2+0·3+2·32+1·33=47 (mod 81). Opgemerkt zij nog dat na de berekening van
we een aanpassing moeten maken. In de theorie staat dat
gevonden kan worden door h te delen door
. We hadden dus om 6992 (mod 8101) te vinden ook de deling
kunnen doen. Hier hebben we dat niet gedaan, maar na elke stap het grondtal waarmee we rekenen omgebouwd, op het moment dat de gevonden ni een getal ongelijk 0 opleverde. Je moet dan wel rekening houden met welke i je bezig bent, om die goed te verrekenen in de exponent bij 6.
Tenslotte p = 5, waarbij we alleen n0 en n1 hoeven te weten.
dus n0 = 4.
en
dus n1 = 2. De derde congruentievergelijking is hiermee gevonden en het stelsel wordt dan
- n = 1 (mod 4)
- n = 47 (mod 81)
- n = 14 (mod 25)
De unieke oplossing van dit stelsel is n = 6689.
Voorbeeld 3 [bewerken]
Gegeven is 71n = 210 (mod 251). Aanpak: 251 - 1 = 250 = 2·
en we hebben weer kleine priemfactoren. {
} = {1,-1}; {
} = {1,20,149,219,113}. Voor p = 2:
dus n0 = 1
Voor p = 5 geldt een exponent 3, wat betekent dat de congruentievergelijking die we zoeken van de vorm
is.
dus n0 = 2. Dan
en
dus n1 = 4. Dan
en
dus ook
= 2.
De beide congruentievergelijkingen zijn dan n = 1 (mod 2) en n = 72 (mod 125) met unieke oplossing n = 197.
Zie ook [bewerken]
- Baby-steps giant-steps algoritme
- Index calculus algoritme
- Pollard's lambda algoritme
- Pollard's rho algoritme
Referenties [bewerken]
- S. Pohlig en M. Hellman "An Improved Algorithm for Computing Logarithms over GF(p) and its Cryptographic Significance", IEEE Transactions on Information Theory 24 (1978), pp. 106-110.
- N. Koblitz "A Course in Number Theory and Cryptography, Graduate Texts in Mathematics 114 (1994), pp. 102-103