离散对数的求解
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