离散对数的求解

1.暴力

2.Baby-step giant-step 

3.Pollard’s ρ algorithm

……

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

Discrete Log Algorithms :Baby-step giant-step

Discrete Log Algorithms :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

相关文章: