CTF RSA练习题(5)dp泄露

文章讲述了如何通过给定的加密参数e、dp和n,利用数学和编程方法解密RSA公钥密码系统中的dp值,进而推导出p、q和私钥d,以计算明文消息m。
摘要由CSDN通过智能技术生成

一、题目(来源BUUCTF)

题目信息:

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

其中dp=d mod (p-1)

二、分析和解答过程

方程式:        dp=d mod (p-1)                 (1)

                      ( d*e) mod (p-1)(q-1) =1    (2)

将方程式化简: d= dp + k1*(p-1)             (3)

                          d*e= 1 + k2*(p-1)(q-1)(4)

将(3)式两边都乘e,得:d*e = dp*e+k1*e*(p-1) ,

结合(4)则有1 + k2*(p-1)(q-1)=  dp*e+k1*e*(p-1)

化简得:dp*e=1+k*(p-1)     其中k= k2*(q-1)-k1*e

由于dp<(p-1),则有e>k,而k是肯定大于0的,不然dp*e=1+k*(p-1) 不成立

编程计算k,算出k就可以算出p,进而算出q,d,m:

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
for i in range(1,65537):
   if((dp*e-1)%i==0):
        p=(dp*e-1)//i+1
        if(n%p!=0):
            continue
        q=n//p
        d=inverse(e,(p-1)*(q-1))
        m=pow(c,d,n)
        flag = long_to_bytes(m)#
        print(flag)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值