1. 程式人生 > >Discrete Log Algorithms :Baby-step giant-step

Discrete Log Algorithms :Baby-step giant-step

style play tel 拓展歐幾裏得 step ppt ddc http 對數

離散對數的求解

1.暴力

2.Baby-step giant-step

3.Pollard’s ρ algorithm

……

下面搬運一下Baby-step giant-step 的做法

技術分享圖片

技術分享圖片

這是在 https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/discrete-log/discrete-log/ 上看到的,比較容易理解。

而且,裏面的代碼寫得簡潔明了。

寫一下自己理解和自己照著寫了一遍

原文代碼:

技術分享圖片
def bsgs(g, y, p):
    m = int(ceil(sqrt(p - 1)))
    S = {pow(g, j, p): j for
j in range(m)} #在字典S中存放了g^j和對應的j gs = pow(g, p - 1 - m, p) #求解的是baby step中的值,也就是g^(-m),其實就是g^m mod p的逆元,也就可以使用egcd來求解 for i in range(m): if y in S: return i * m + S[y] #S[y]取出的是此時y對應的i y = y * gs % p #如果baby step的值和 giant step的值不相等,繼續執行baby step
return None
View Code

照著寫一遍的代碼

技術分享圖片
#求解離散對數問題

import math
def egcd(a,b):
    r0,r1,s0,s1=1,0,0,1
    n=b
    while(b):
        q,a,b=a//b,b,a%b
        r0,r1=r1,r0-q*r1
        s0,s1=s1,s0-q*s1
    return r0%n             #拓展歐幾裏得返回的三個值是,a是a和b的最大公因數,r0和s0分別是ax+by=c中的一組解x和y,【此時只是選擇返回一個r0,因為得到的是ax+by=gcd(a,b)中的x即可,有的時候x或者y可能為負數,在求解正數的逆元的時候負數要對n再次求模運算
#求解離散對數就是,X=G^a mod P,其中給出X,G,P的值,要求解的是 a的值,此處采用的是Baby step giant step的方法 def bsgs(x,g,p): #求解x=g^a mod p中的a,其中g是生成元 m=math.ceil(math.sqrt(p-1)) #m的值是 p-1開平方後向上取整 bstep={pow(g,j,p):j for j in range(m)} #每一次 j 的增加表示 “baby-step”,一次乘上g,字典S中存了所有的g^j(j<m)以及其對應的j gstep=egcd(pow(g,m),p) #算出了gstep的值,也就是g^-m的值 for i in range(m): if x in bstep: return i*m+bstep[x] x=x*gstep%p print(bsgs(37,3,101))
View Code

繼續學習其他的做法

參考資料:http://zoo.cs.yale.edu/classes/cs257/ppt/all/Mac/19_DiscreteLog.ppt

Discrete Log Algorithms :Baby-step giant-step