离散日志的婴儿步巨步法算法:不正确的巨步

时间:2016-04-27 14:52:29

标签: python algorithm cryptography

所以我试图实现Baby Step Giant Step算法来计算离散日志。以下是我的代码:

# trying to solve 8576 = 3^x (mod 53047)
p = 53047
a = 3
B = 8576

m = int(math.ceil(math.sqrt(p-1)))

baby = []
giant = []
for j in range(0,m-1):
    baby.append((a**j)%p)

for k in range(0,m-1):
    val = a**(-1)%p
    val2 = val**(k*m)%p
    giant.append((B*val2)%p)
    for i in xrange(len(baby)):
        if giant[k] == baby[k]:
            x = j + m*k

我认为我的巨大步骤有一些不正确的原因,因为我得到非常微小的值作为输出而没有匹配。正确答案是x = 1234.有人可以告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:4)

模数反转不是通过采用实数逆并计算结果的模数来计算的。要查找a mod p的乘法逆,您需要找到带有b整数 ab = 1 (mod p)。这可以通过使用扩展欧几里得算法或使用费马的小定理(作为捷径)来完成:

a**(p-1) = 1 (mod p)

这意味着a**(p-2) (mod p) a的倒数。

答案 1 :(得分:0)

# trying to solve 8576 = 3^x (mod 53047)
p = 53047
a = 3
B = 8576

P应该总是> B怎么可能(a ^ x mod P = B和B> P)再看一遍

祝你好运