Pohlig-Hellman-algoritme

Het Pohlig-Hellman algoritme is een algoritme om de discrete logaritme zoals die is gedefinieerd in een cyclische groep, te berekenen. In het bijzonder vindt het algoritme toepassing op de multiplicatieve groep F q {\displaystyle \mathbb {F} _{q}^{*}} van een eindig lichaam F q {\displaystyle \mathbb {F} _{q}} . Als q 1 {\displaystyle q-1} het product is van kleine priemfactoren, noemt men het getal q 1 {\displaystyle q-1} glad en is het Polig-Hellman-algoritme een geschikte methode om deze discrete logaritme te berekenen.

Het algoritme werd ontwikkeld door Roland Silver, maar voor het eerst, onafhankelijk van Silver, gepubliceerd door Stephen Pohlig en Martin Hellman.

Het belang van deze methode is dat de hoeveelheid rekenwerk niet afhangt van de orde van de groep, maar van de grootste factor in de orde. Het nadeel is dat de orde gefactoriseerd moet worden in priemfactoren en een dergelijke factorisatie in het algemeen moeilijk vast te stellen is.

Algoritme

De werking van het algoritme wordt verklaard voor de multiplicatieve groep G = F q {\displaystyle G=\mathbb {F} _{q}^{*}} van het eindige lichaam F q {\displaystyle \mathbb {F} _{q}} met als orde q {\displaystyle q} , een priemgetal. De orde van G {\displaystyle G} is dan q 1 {\displaystyle q-1} . Zij nu g {\displaystyle g} een voortbrenger van G {\displaystyle G} , dan wordt het positieve gehele getal n < q {\displaystyle n<q} gezocht, zodanig dat g n = h ( mod q ) {\displaystyle g^{n}=h\!\!\!\!{\pmod {q}}} .

Het algoritme bepaalt voor elke priemfactor p j {\displaystyle p_{j}} in de ontbinding:

q 1 = p 1 e 1 p 2 e 2 p i e i {\displaystyle q-1={p_{1}}^{e_{1}}{p_{2}}^{e_{2}}\ldots {p_{i}}^{e_{i}}}

voor n {\displaystyle n} een congruentievergelijking mod p j e j {\displaystyle {\bmod {p}}_{j}^{e_{j}}} . Omdat de p j {\displaystyle p_{j}} onderling priem zijn, is er volgens de Chinese reststelling een gemeenschappelijke oplossing n {\displaystyle n} voor deze vergelijkingen.

Deelalgoritme

Het algoritme kan gedeeltelijk gereduceerd worden tot een algoritme dat voor de priemfactor p = p j {\displaystyle p=p_{j}} een congruentievergelijking voor n {\displaystyle n} vindt. Daartoe schrijft men, met m = e j {\displaystyle m=e_{j}} :

n = n 0 + p n 1 + + p m 1 n m 1 ( mod p m ) {\displaystyle n=n_{0}+pn_{1}+\ldots +p^{m-1}n_{m-1}\!\!\!\!{\pmod {p^{m}}}}

en bepaalt in vergelijkbare stappen successievelijk de getallen n j {\displaystyle n_{j}} .

Vooraf worden voor j = 0 , 1 , , p 1 {\displaystyle j=0,1,\ldots ,p-1} de p {\displaystyle p} -de-machtswortels

r p , j = g j ( q 1 ) p {\displaystyle r_{p,j}=g^{\frac {j(q-1)}{p}}}

berekend, waaruit later teruggezocht kan worden welke j {\displaystyle j} bij een bepaalde waarde van deze wortels hoort. Ook wordt om n 0 {\displaystyle n_{0}} te vinden h q 1 p {\displaystyle h^{\frac {q-1}{p}}} berekend.

Volgens de kleine stelling van Fermat geldt a q 1 ( mod q ) = 1 {\displaystyle a^{q-1}\!\!\!\!{\pmod {q}}=1} , dus, omdat g n = h ( mod q ) {\displaystyle g^{n}=h\!\!\!\!{\pmod {q}}} , volgt

h q 1 p = ( g n ) q 1 p = g n ( q 1 ) p = g n 0 ( q 1 ) p g ( n 1 + n 2 p + + n m 1 p m 2 ) ( q 1 ) = g n 0 ( q 1 ) p = r p , n 0 ( mod q ) {\displaystyle h^{\frac {q-1}{p}}=\left(g^{n}\right)^{\frac {q-1}{p}}=g^{\frac {n(q-1)}{p}}=g^{\frac {n_{0}(q-1)}{p}}g^{(n_{1}+n_{2}p+\ldots +n_{m-1}p^{m-2})(q-1)}=g^{\frac {n_{0}(q-1)}{p}}=r_{p,n_{0}}\!\!\!\!{\pmod {q}}} .

Vergelijk nu h q 1 p {\displaystyle h^{\frac {q-1}{p}}} met de berekende wortels in de lijst { r p , j } {\displaystyle \{r_{p,j}\}} en stel n 0 = j {\displaystyle n_{0}=j} als h q 1 p = r p , j {\displaystyle h^{\frac {q-1}{p}}=r_{p,j}} .

Na n 0 {\displaystyle n_{0}} moeten n 1 , n 2 , {\displaystyle n_{1},n_{2},\ldots } gevonden worden. Om n 1 {\displaystyle n_{1}} te vinden, wordt h 1 = h g n 0 {\displaystyle h_{1}={\frac {h}{g^{n_{0}}}}} gesteld.

Voor de discrete logaritme n = log g ( h ) {\displaystyle n=\log _{g}(h)} volgt dan

n = log g ( h 1 g n 0 ) = log g ( h 1 ) + log g ( g n 0 ) = log g ( h 1 ) + n 0 . {\displaystyle n=\log _{g}(h_{1}g^{n_{0}})=\log _{g}(h_{1})+\log _{g}(g^{n_{0}})=\log _{g}(h_{1})+n_{0}.}

Dus er ontstaat een analoog probleem

h 1 = g n n 0 {\displaystyle h_{1}=g^{n-n_{0}}}

en er moet gelden

h 1 q 1 p 2 = g ( n n 0 ) ( q 1 ) p 2 = g ( p n 1 + p 2 n 2 + + p m 1 n m 1 ) ( q 1 ) p 2 = g ( n 1 + p n 2 + + p m 2 n m 1 ) ( q 1 ) p = g n 1 ( q 1 ) p = r p , n 1 . {\displaystyle {h_{1}}^{\frac {q-1}{p^{2}}}=g^{\frac {(n-n_{0})(q-1)}{p^{2}}}=g^{\frac {(pn_{1}+p^{2}n_{2}+\ldots +p^{m-1}n_{m-1})(q-1)}{p^{2}}}=g^{\frac {(n_{1}+pn_{2}+\ldots +p^{m-2}n_{m-1})(q-1)}{p}}=g^{\frac {n_{1}(q-1)}{p}}=r_{p,n_{1}}.}

Vergelijk nu h 1 q 1 p 2 {\displaystyle {h_{1}}^{\frac {q-1}{p^{2}}}} met de lijst { r p , j } {\displaystyle \{r_{p,j}\}} en stel n 1 = j {\displaystyle n_{1}=j} als h 1 q 1 p 2 = r p , j . {\displaystyle {h_{1}}^{\frac {q-1}{p^{2}}}=r_{p,j}.}

Op deze manier worden alle n k {\displaystyle n_{k}} gevonden voor k = 1 , 2 , , m 1. {\displaystyle k=1,2,\ldots ,m-1.} Om n k {\displaystyle n_{k}} te vinden, stelt men

h k = h g n 0 + p n 1 + + p k 1 n k 1 {\displaystyle h_{k}={\frac {h}{g^{n_{0}+pn_{1}+\ldots +p^{k-1}n_{k-1}}}}} .

De discrete logaritme n = log g ( h ) {\displaystyle n=\log _{g}(h)} wordt dan

n n 0 + p n 1 + + p k 1 n k 1 ( mod p i ) {\displaystyle n\equiv n_{0}+pn_{1}+\ldots +p^{k-1}n_{k-1}\!\!\!\!{\pmod {p^{i}}}} .

Hieruit volgt

h k = g n n 0 n 1 p k 1 n k 1 {\displaystyle h_{k}=g^{n-n_{0}-n_{1}-\ldots -p^{k-1}n_{k-1}}}

en dus

h k q 1 p k = 1 {\displaystyle {h_{k}}^{\frac {q-1}{p^{k}}}=1}

en h k q 1 p k + 1 = r p , n k {\displaystyle {h_{k}}^{\frac {q-1}{p^{k+1}}}=r_{p,n_{k}}} .

Vergelijk vervolgens h k q 1 p k + 1 {\displaystyle {h_{k}}^{\frac {q-1}{p^{k+1}}}} met de lijst { r p , j } {\displaystyle \{r_{p,j}\}} en stel n k = j {\displaystyle n_{k}=j} als h k q 1 p k + 1 = r p , j {\displaystyle {h_{k}}^{\frac {q-1}{p^{k+1}}}=r_{p,j}} .

Zo is voor elk van de p = p j {\displaystyle p=p_{j}} een congruentievergelijking voor n {\displaystyle n} gevonden:

n n 0 + p n 1 + + p i 1 n i 1 ( mod p i ) {\displaystyle n\equiv n_{0}+pn_{1}+\ldots +p^{i-1}n_{i-1}\!\!\!\!{\pmod {p^{i}}}} .

Aangezien de p j {\displaystyle p_{j}} onderling priem zijn, hebben deze vergelijkingen volgens de Chinese reststelling een eenduidige oplossing.

Voorbeelden

Hier volgen enkele voorbeelden met kleine getallen om met het algoritme een discrete logaritme te bepalen. In de praktijk rekent men uiteraard met veel grotere getallen om de aanvallen van hackers af te slaan.

Voorbeeld 1

Gevraagd n {\displaystyle n} te berekenen waarvoor 2 n 28 ( mod 37 ) {\displaystyle 2^{n}\equiv 28{\pmod {37}}} . Hier is q = 37 {\displaystyle q=37} en de ontbinding van q 1 {\displaystyle q-1} is q 1 = 36 = 2 2 × 3 2 {\displaystyle q-1=36=2^{2}\times 3^{2}} , een ontbinding met kleine priemfactoren 2 en 3. Vanwege de exponenten die bij de priemfactoren staan (beide 2), worden voor zowel p = 2 {\displaystyle p=2} als p = 3 {\displaystyle p=3} naar congruenties n = n 0 + p n 1 {\displaystyle n=n_{0}+pn_{1}} gezocht.

Voor de beide priemdelers zijn de lijsten { r 2 , j } = { 1 , 36 } {\displaystyle \{r_{2,j}\}=\{1,36\}} en { r 3 , j } = { 1 , 26 , 10 } {\displaystyle \{r_{3,j}\}=\{1,26,10\}} , want 2 0 ( mod 37 ) = 1 ,     2 18 ( mod 37 ) = 36 {\displaystyle 2^{0}\!\!\!\!{\pmod {37}}=1,\ \ 2^{18}\!\!\!\!{\pmod {37}}=36} , etc.

Stel h = 2 n = 28 ( mod 37 ) {\displaystyle h=2^{n}=28\!\!\!\!{\pmod {37}}} en bereken 28 36 / 2 = 1 ( mod 37 ) {\displaystyle {28}^{36/2}=1\!\!\!\!{\pmod {37}}}

Dan geldt 1 = h 18 = 2 n 36 / 2 = 2 18 n = 2 18 n 0 = r 2 , n 0 {\displaystyle 1=h^{18}={2^{n}}^{36/2}=2^{18n}=2^{18n_{0}}=r_{2,n_{0}}} . Hieruit volgt n 0 = 0 {\displaystyle n_{0}=0} .

Bereken nu h 1 = 28 / 2 0 = 28 {\displaystyle h_{1}=28/2^{0}=28} en daarmee 28 36 / 2 2 = 1 ( mod 37 ) = r 2 , n 1 {\displaystyle {28}^{36/2^{2}}=-1\!\!\!\!{\pmod {37}}=r_{2,n_{1}}} . Hieruit volgt n 1 = 1 {\displaystyle n_{1}=1} . Voor p = 2 {\displaystyle p=2} wordt de congruentie dus n = 0 + 2 × 1 = 2 ( mod 4 ) {\displaystyle n=0+2\times 1=2\!\!\!\!{\pmod {4}}} .

Voor p = 3 {\displaystyle p=3} berekent men 28 36 / 3 = 26 ( mod 37 ) = r 3 , n 0 {\displaystyle {28}^{36/3}=26{\pmod {37}}=r_{3,n_{0}}} . Hieruit volgt n 0 = 1 {\displaystyle n_{0}=1} .

Bereken nu h 1 = 28 / 2 1 = 14 {\displaystyle h_{1}=28/2^{1}=14} en daarmee 14 36 / 3 2 = 10 ( mod 37 ) = r 3 , n 1 {\displaystyle {14}^{36/3^{2}}=10{\pmod {37}}=r_{3,n_{1}}} . Hieruit volgt n 1 = 2 {\displaystyle n_{1}=2} . Voor p = 3 {\displaystyle p=3} wordt de congruentie dus n = 1 + 3 × 2 = 7 ( mod 9 ) {\displaystyle n=1+3\times 2=7{\pmod {9}}} . Het stelsel congruentievergelijking dat opgelost kan worden met de Chinese reststelling, is dus

n 2 ( mod 4 ) {\displaystyle n\equiv 2{\pmod {4}}}
n 7 ( mod 9 ) {\displaystyle n\equiv 7{\pmod {9}}}

en heeft als unieke oplossing n = 34 {\displaystyle n=34} .

Voorbeeld 2

Gevraagd n {\displaystyle n} te berekenen waarvoor 6 n = 7531 ( mod 8101 ) {\displaystyle 6^{n}=7531\!\!\!\!{\pmod {8101}}} . De ontbinding van q 1 {\displaystyle q-1} is 8101 1 = 8100 = 2 2 × 3 4 × 5 2 {\displaystyle 8101-1=8100=2^{2}\times 3^{4}\times 5^{2}} en er zijn weer alleen kleine priemfactoren.

{ r 2 , j } = { 1 , 1 } ; { r 3 , j } = { 1 , 5883 , 2217 } , { r 5 , j } = { 1 , 3547 , 356 , 7077 , 5221 } {\displaystyle \{r_{2,j}\}=\{1,-1\};\{r_{3,j}\}=\{1,5883,2217\},\{r_{5,j}\}=\{1,3547,356,7077,5221\}} .

Voor p = 2 {\displaystyle p=2} :

7531 8100 / 2 = 1 ( mod 8101 ) = r 2 , 1 {\displaystyle 7531^{8100/2}=-1{\pmod {8101}}=r_{2,1}} dus n 0 = 1 {\displaystyle n_{0}=1} .
h 1 = 7531 / 6 = 8006 ( mod 8101 ) {\displaystyle h_{1}=7531/6=8006{\pmod {8101}}}

en

8006 8100 / 2 2 = 1 ( mod 8101 ) = r 2 , 0 {\displaystyle 8006^{8100/2^{2}}=1{\pmod {8101}}=r_{2,0}} dus n 1 = 0 {\displaystyle n_{1}=0}

Voor p = 3 {\displaystyle p=3} geldt een exponent 4, wat betekent dat de congruentievergelijking die we zoeken van de vorm

n = n 0 + 3 n 1 + 3 2 n 2 + 3 3 n 3 ( mod 3 4 ) {\displaystyle n=n_{0}+3n_{1}+3^{2}n_{2}+3^{3}n_{3}{\pmod {3^{4}}}}

is. Gezocht worden dus n 0 , n 1 , n 2 , n 3 {\displaystyle n_{0},n_{1},n_{2},n_{3}} . De lijst met vergelijkingswaarden is { r 3 , j } = { 1 , 5883 , 2217 } {\displaystyle \{r_{3,j}\}=\{1,5883,2217\}} .

7531 8100 / 3 = 2217 ( mod 8101 ) = r 3 , 2 {\displaystyle 7531^{8100/3}=2217{\pmod {8101}}=r_{3,2}} dus n 0 = 2 {\displaystyle n_{0}=2} .
h 1 = 7531 / 6 2 = 6735 ( mod 8101 ) {\displaystyle h_{1}=7531/6^{2}=6735{\pmod {8101}}}

en vervolgens

6735 8100 / 3 2 = 1 ( mod 8101 ) = r 3 , 0 {\displaystyle 6735^{8100/3^{2}}=1{\pmod {8101}}=r_{3,0}} dus n 1 = 0 {\displaystyle n_{1}=0} .
6735 8100 / 3 3 = 2217 ( mod 8101 ) = r 3 , 2 {\displaystyle 6735^{8100/3^{3}}=2217{\pmod {8101}}=r_{3,2}} dus n 2 = 2 {\displaystyle n_{2}=2} .
6735 / 6 18 = 6992 ( mod 8101 ) {\displaystyle 6735/6^{18}=6992{\pmod {8101}}}

en

6992 8100 / 3 4 = 5883 ( mod 8101 ) = r 3 , 1 {\displaystyle 6992^{8100/3^{4}}=5883{\pmod {8101}}=r_{3,1}} dus n 3 = 1 {\displaystyle n_{3}=1} .

De congruentievergelijking is dan

n 2 + 0 × 3 + 2 × 3 2 + 1 × 3 3 = 47 ( mod 81 ) {\displaystyle n\equiv 2+0\times 3+2\times 3^{2}+1\times 3^{3}=47{\pmod {81}}} .

Opgemerkt zij nog dat na de berekening van n 2 {\displaystyle n_{2}} we een aanpassing moeten maken. In de theorie staat dat h i {\displaystyle h_{i}} gevonden kan worden door h te delen door g n 0 + p n 1 + p 2 n 2 + . . . + p i 1 n i 1 {\displaystyle g^{n_{0}+pn_{1}+p^{2}n_{2}+...+p^{i-1}n_{i-1}}} . We hadden dus om 6992 (mod 8101) te vinden ook de deling 7531 6 20 {\displaystyle {\frac {7531}{6^{20}}}} 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.

Tot slot moeten voor p = 5 n 0 {\displaystyle p=5\quad n_{0}} en n 1 {\displaystyle n_{1}} berekend worden.

7531 8100 / 5 = 5221 ( mod 8101 ) = r 5 , 4 {\displaystyle {7531}^{8100/5}=5221{\pmod {8101}}=r_{5,4}} , dus n 0 = 4 {\displaystyle n_{0}=4} .
h 1 = 7531 / 6 4 = 7613 ( mod 8101 ) {\displaystyle h_{1}=7531/6^{4}=7613{\pmod {8101}}} , dus n 1 = 2 {\displaystyle n_{1}=2} .

De derde congruentievergelijking is hiermee gevonden en het stelsel wordt dan

n 1 ( mod 4 ) {\displaystyle n\equiv 1{\pmod {4}}}
n 47 ( mod 81 ) {\displaystyle n\equiv 47{\pmod {81}}}
n 14 ( mod 25 ) {\displaystyle n\equiv 14{\pmod {25}}}

De unieke oplossing van dit stelsel is : n = 6689 {\displaystyle n=6689} .

Voorbeeld 3

Gevraagd n {\displaystyle n} te berekenen waarvoor 71 n = 210 ( mod 251 ) {\displaystyle 71^{n}=210\!\!\!\!{\pmod {251}}} . De ontbinding van q 1 {\displaystyle q-1} is 251 1 = 250 = 2 × 5 3 {\displaystyle 251-1=250=2\times 5^{3}} en er zijn weer alleen kleine priemfactoren.

{ r 2 , j } = { 1 , 1 } ; { r 5 , j } = { 1 , 20 , 149 , 19 , 113 } {\displaystyle \{r_{2,j}\}=\{1,-1\};\{r_{5,j}\}=\{1,20,149,19,113\}} .

Voor p = 2 {\displaystyle p=2} :

210 250 / 2 250 1 ( mod 251 ) = r 2 , 1 {\displaystyle 210^{250/2}\equiv 250\equiv -1{\pmod {251}}=r_{2,1}} dus n 0 = 1 {\displaystyle n_{0}=1} .

Voor p = 5 {\displaystyle p=5} geldt een exponent 3, wat betekent dat de congruentievergelijking die we zoeken van de vorm

n = n 0 + 5 n 1 + 25 n 2 {\displaystyle n=n_{0}+5n_{1}+25n_{2}}

is. Gezocht worden dus n 0 , n 1 , n 2 {\displaystyle n_{0},n_{1},n_{2}} .

210 250 / 5 = 149 ( mod 251 ) = r 5 , 2 {\displaystyle 210^{250/5}=149{\pmod {251}}=r_{5,2}} dus n 0 = 2 {\displaystyle n_{0}=2} .
h 1 = 210 / 71 2 = 10 ( mod 251 ) {\displaystyle h_{1}=210/{{71}^{2}}=10{\pmod {251}}}

en vervolgens

10 250 / 5 2 = 113 ( mod 251 ) = r 5 , 4 {\displaystyle 10^{250/5^{2}}=113{\pmod {251}}=r_{5,4}} dus n 1 = 4 {\displaystyle n_{1}=4} .
h 2 = 10 / 71 20 = 231 ( mod 251 ) {\displaystyle h_{2}=10/{71}^{20}=231{\pmod {251}}}

en

231 250 / 125 = 149 ( mod 251 ) = r 5 , 2 {\displaystyle 231^{250/125}=149{\pmod {251}}=r_{5,2}} dus n 2 = 2 {\displaystyle n_{2}=2} .

De beide congruentievergelijkingen zijn

n 1 ( mod 2 ) {\displaystyle n\equiv 1{\pmod {2}}}
n 72 ( mod 125 ) {\displaystyle n\equiv 72{\pmod {125}}}

met de unieke oplossing n = 197 {\displaystyle n=197} .

Zie ook

  • Baby-steps giant-steps algoritme
  • Index calculus algoritme
  • Pollards lambda-algoritme
  • Pollards rho-algoritme

Referenties

  1. 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.
  2. N. Koblitz "A Course in Number Theory and Cryptography, Graduate Texts in Mathematics 114 (1994), pp. 102-103