实验二 编程实现离散对数求解 (Python实现)

本文介绍了使用Python编程解决模素数p的离散对数问题,采用中间相遇攻击策略,并对计算过程进行了优化。实验中,通过创建哈希表并检查(gB)x0是否存在来寻找解,同时讨论了如何通过变换公式减少计算时间,以提高效率。

一.实验内容

本周的任务是写一个程序来计算模素数p的离散对数。
在这里插入图片描述

二.解题思路

根据实验文档中提供的思路,令B=q=220B=\sqrt{q}=2^{20}B=q=220,x=x0B+x1x=x_0B+x_1x=x0B+x1,其中x0,x1∈[0,B)x_0,x_1\in[0,B)x0,x1[0,B)
经过变换有:
h=gx0B+x1=(gB)x0⋅gx1(modp) h=g^{x_0B+x_1}=(g^B)^{x_0}·g^{x_1}( mod p)h=gx0B+x1=(gB)x0gx1(modp)
两边同时除以gx1g^{x_1}gx1,有:
h/gx1=(gB)x0(modp)h/g^{x_1}=(g^B)^{x_0} (mod p)h/gx1=(gB)x0(modp)
所以,我们利用中间相遇攻击来找到一个解:
1.为等式左边hg−x1hg^{-x1}hgx1的所有可能创建一个哈希表,其中x1=0,1,2...220x_1=0,1,2...2^{20}x1=0,1,2...220
2.对于每个x0=0,1,2....220x_0=0,1,2....2^{20}x0=0,1,2....220,检查(gB)x0(g^B)^{x_0}(gB)x0是否在哈希表中,如果在,则找到解x0,x1,x=x0∗B+x1x_0,x_1,x=x_0*B+x_1x0,x1,x=x0B+x1
建立哈希表的时间复杂度为O(p)O(\sqrt{p})O(p),哈希表查找时间O(1)

优化

在这一步中,左边的计算除法时耗费了大量的时间
h/gx1=(gB)x0(modp)h/g^{x_1}=(g^B)^{x_0} (mod p)h/gx1=(gB)x0(modp)
如果代码直接写的话:
在这里插入图片描述
运行时间过长。
经过查看各位大佬的资料,公式可以进行进一步的变换。
将x的公式变换为:
x=x0B−x1x=x_0B-x_1x=x0Bx1
根据上面的推到过程,有:
hgx1=(gB)x0(modp)hg^{x1}=(g^B)^{x_0} (mod p)hgx1=(gB)x0(modp)
此时,0<x0<=B,0<=x1<B0<x_0<=B,0<=x_1<B0<x0<=B,0<=x1<B

三.实验代码

def meetMidle():
    #B=2^20
    B=pow(2,20)
    x0,x1=0,0
    x=-1
    #建立字典记录
    hashMap={}
    #等式关系:h*g^(x1)=(g^B)^x0
    #首先计算等式左边,将x1和对应求的值分别加入字典中
    left=h
    #g_pre=1
    for i in range(B):
        hashMap[left]=i
        #left=h/g_pre%p
        #g_pre=g_pre*g
        left=left*g%p
    print("build hashMap succeed")

#开始遍历等式右边的内容,如果相等,则找到对应的解
    #计算右边的底数baseRight=g^B
    baseRight=1
    for i in range(B):
        baseRight=baseRight*g%p
    #开始带入x0=0,1,2,3....判断(g^B)^x0是否在哈希表中
    right=1
    for i in range(1,B+1):
        right=right*baseRight%p
        if(right in hashMap):
            x0=i
            x1=hashMap[right]
            break
    x=B*x0-x1
    if (x==-1):
        print("There is no solution")
    else:

        print("x0的取值为:",x0)
        print("x1的取值为:",x1)
        print("x的取值为:",x)


if __name__ == '__main__':
    p=13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084171
    g=11717829880366207009516117596335367088558084999998952205599979459063929499736583746670572176471460312928594829675428279466566527115212748467589894601965568
    h=3239475104050450443565264378728065788649097520952449527834792452971981976143292558073856937958553180532878928001494706097394108577585732452307673444020333
    meetMidle()
    

四.实验结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值