Pohlig-Hellman-algoritme

Uit testwiki
Naar navigatie springen Naar zoeken springen

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 𝔽q* van een eindig lichaam 𝔽q. Als q1 het product is van kleine priemfactoren, noemt men het getal q1 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=𝔽q* van het eindige lichaam 𝔽q met als orde q, een priemgetal. De orde van G is dan q1. Zij nu g een voortbrenger van G, dan wordt het positieve gehele getal n<q gezocht, zodanig dat gn=h(modq).

Het algoritme bepaalt voor elke priemfactor pj in de ontbinding:

q1=p1e1p2e2piei

voor n een congruentievergelijking modpjej. Omdat de pj onderling priem zijn, is er volgens de Chinese reststelling een gemeenschappelijke oplossing n voor deze vergelijkingen.

Deelalgoritme

Het algoritme kan gedeeltelijk gereduceerd worden tot een algoritme dat voor de priemfactor p=pj een congruentievergelijking voor n vindt. Daartoe schrijft men, met m=ej:

n=n0+pn1++pm1nm1(modpm)

en bepaalt in vergelijkbare stappen successievelijk de getallen nj .

Vooraf worden voor j=0,1,,p1 de p-de-machtswortels

rp,j=gj(q1)p

berekend, waaruit later teruggezocht kan worden welke j bij een bepaalde waarde van deze wortels hoort. Ook wordt om n0 te vinden hq1p berekend.

Volgens de kleine stelling van Fermat geldt aq1(modq)=1, dus, omdat gn=h(modq), volgt

hq1p=(gn)q1p=gn(q1)p=gn0(q1)pg(n1+n2p++nm1pm2)(q1)=gn0(q1)p=rp,n0(modq).

Vergelijk nu hq1p met de berekende wortels in de lijst {rp,j} en stel n0=j als hq1p=rp,j.

Na n0 moeten n1,n2, gevonden worden. Om n1 te vinden, wordt h1=hgn0 gesteld.

Voor de discrete logaritme n=logg(h) volgt dan

n=logg(h1gn0)=logg(h1)+logg(gn0)=logg(h1)+n0.

Dus er ontstaat een analoog probleem

h1=gnn0

en er moet gelden

h1q1p2=g(nn0)(q1)p2=g(pn1+p2n2++pm1nm1)(q1)p2=g(n1+pn2++pm2nm1)(q1)p=gn1(q1)p=rp,n1.

Vergelijk nu h1q1p2 met de lijst {rp,j} en stel n1=j als h1q1p2=rp,j.

Op deze manier worden alle nk gevonden voor k=1,2,,m1. Om nk te vinden, stelt men

hk=hgn0+pn1++pk1nk1.

De discrete logaritme n=logg(h) wordt dan

nn0+pn1++pk1nk1(modpi).

Hieruit volgt

hk=gnn0n1pk1nk1

en dus

hkq1pk=1

en hkq1pk+1=rp,nk.

Vergelijk vervolgens hkq1pk+1 met de lijst {rp,j} en stel nk=j als hkq1pk+1=rp,j.

Zo is voor elk van de p=pj een congruentievergelijking voor n gevonden:

nn0+pn1++pi1ni1(modpi).

Aangezien de pj 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 te berekenen waarvoor 2n28(mod37). Hier is q=37 en de ontbinding van q1 is q1=36=22×32, een ontbinding met kleine priemfactoren 2 en 3. Vanwege de exponenten die bij de priemfactoren staan (beide 2), worden voor zowel p=2 als p=3 naar congruenties n=n0+pn1 gezocht.

Voor de beide priemdelers zijn de lijsten {r2,j}={1,36} en {r3,j}={1,26,10}, want 20(mod37)=1,  218(mod37)=36, etc.

Stel h=2n=28(mod37) en bereken 2836/2=1(mod37)

Dan geldt 1=h18=2n36/2=218n=218n0=r2,n0. Hieruit volgt n0=0.

Bereken nu h1=28/20=28 en daarmee 2836/22=1(mod37)=r2,n1. Hieruit volgt n1=1. Voor p=2 wordt de congruentie dus n=0+2×1=2(mod4).

Voor p=3 berekent men 2836/3=26(mod37)=r3,n0. Hieruit volgt n0=1.

Bereken nu h1=28/21=14 en daarmee 1436/32=10(mod37)=r3,n1. Hieruit volgt n1=2. Voor p=3 wordt de congruentie dus n=1+3×2=7(mod9). Het stelsel congruentievergelijking dat opgelost kan worden met de Chinese reststelling, is dus

n2(mod4)
n7(mod9)

en heeft als unieke oplossing n=34.

Voorbeeld 2

Gevraagd n te berekenen waarvoor 6n=7531(mod8101). De ontbinding van q1 is 81011=8100=22×34×52 en er zijn weer alleen kleine priemfactoren.

{r2,j}={1,1};{r3,j}={1,5883,2217},{r5,j}={1,3547,356,7077,5221}.

Voor p=2:

75318100/2=1(mod8101)=r2,1 dus n0=1.
h1=7531/6=8006(mod8101)

en

80068100/22=1(mod8101)=r2,0 dus n1=0

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

n=n0+3n1+32n2+33n3(mod34)

is. Gezocht worden dus n0,n1,n2,n3. De lijst met vergelijkingswaarden is {r3,j}={1,5883,2217}.

75318100/3=2217(mod8101)=r3,2 dus n0=2.
h1=7531/62=6735(mod8101)

en vervolgens

67358100/32=1(mod8101)=r3,0 dus n1=0.
67358100/33=2217(mod8101)=r3,2 dus n2=2.
6735/618=6992(mod8101)

en

69928100/34=5883(mod8101)=r3,1 dus n3=1.

De congruentievergelijking is dan

n2+0×3+2×32+1×33=47(mod81).

Opgemerkt zij nog dat na de berekening van n2 we een aanpassing moeten maken. In de theorie staat dat hi gevonden kan worden door h te delen door gn0+pn1+p2n2+...+pi1ni1. We hadden dus om 6992 (mod 8101) te vinden ook de deling 7531620 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=5n0 en n1 berekend worden.

75318100/5=5221(mod8101)=r5,4, dus n0=4.
h1=7531/64=7613(mod8101), dus n1=2.

De derde congruentievergelijking is hiermee gevonden en het stelsel wordt dan

n1(mod4)
n47(mod81)
n14(mod25)

De unieke oplossing van dit stelsel is :n=6689.

Voorbeeld 3

Gevraagd n te berekenen waarvoor 71n=210(mod251). De ontbinding van q1 is 2511=250=2×53 en er zijn weer alleen kleine priemfactoren.

{r2,j}={1,1};{r5,j}={1,20,149,19,113}.

Voor p=2:

210250/22501(mod251)=r2,1 dus n0=1.

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

n=n0+5n1+25n2

is. Gezocht worden dus n0,n1,n2.

210250/5=149(mod251)=r5,2 dus n0=2.
h1=210/712=10(mod251)

en vervolgens

10250/52=113(mod251)=r5,4 dus n1=4.
h2=10/7120=231(mod251)

en

231250/125=149(mod251)=r5,2 dus n2=2.

De beide congruentievergelijkingen zijn

n1(mod2)
n72(mod125)

met de unieke oplossing n=197.

Zie ook

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