def baby_steps_giant_steps(a,b,p,N = None):
if not N: N = 1 + int(math.sqrt(p))
#initialize baby_steps table
baby_steps = {}
baby_step = 1
for r in range(N+1):
baby_steps[baby_step] = r
baby_step = baby_step * a % p
#now take the giant steps
giant_stride = pow(a,(p-2)*N,p)
giant_step = b
for q in range(N+1):
if giant_step in baby_steps:
return q*N + baby_steps[giant_step]
else:
giant_step = giant_step * giant_stride % p
return "No Match"
由于这个问题的副本是在Python标签下提出的,这里有一个baby step,giant step的Python实现,正如@MarkBeyers指出的,这是一个合理的方法(只要模不太大):
在上面的实现中,即使
p
是密码学上大的,显式N
也可以传递给fish以获得小指数。只要指数小于N**2
,它就会找到指数。当省略N
时,将始终找到指数,但如果p
太大,则不一定在您的生命周期或计算机内存中找到指数。例如,如果
然后“pow(a,b,p)”计算为67385023448517
以及
这在我的机器上花了5秒钟。对于这些尺寸的指数和模数,我估计(基于计时实验)蛮力可能需要几个月的时间。
从%运算符中,我假设您使用的是整数。
你在试图解决the Discrete Logarithm问题。一个合理的算法是Baby step, giant step,尽管还有许多其他算法,但都不是特别快。
找到离散对数问题的快速解决方案的困难是一些流行的密码算法的一个基本部分,所以如果你找到比维基百科上的任何一个更好的解决方案,请让我知道!
这根本不是一个简单的问题。它被称为计算discrete logarithm,它是modular exponentation的逆运算。
目前还没有有效的算法。也就是说,如果N表示m中的位数,则所有已知算法都在O(2^(N^C))中运行,其中C>;0。
相关问题 更多 >
编程相关推荐