ctfshow crypto funnyrsa3 RSA之dp泄露

给出了n,c,e,dp,我们可以借助这些来求解pq

网上看了不少wp,对于有关dp的推导总感觉写的不是非常透彻,自己动手写一下,有助于理解。

一开始我以为dp的意思是d*p,那样n=p*q,求n/d*p就等于p*q/d*p=q/d,用fractions函数里的Fraction理论上就能把q和d求出来,但是做不出来,网上查了wp发现原来dp的意思是

dp=d%(p-1)

好家伙,根据这个式子可以往下推导(纯纯的数学运算了):

dp=d%(p-1)\rightarrow dp*e=d*e%(p-1)\rightarrow dp*e=k*(p-1)+d*e

变换一下得到 d*e=dp*e+k*(p-1)

在rsa中定义 d*e\equiv 1%\varphi (n)\rightarrow d*e\equiv 1%(p-1)*(q-1)

所以 k*(p-1)+dp*e=1%(p-1)*(q-1)

变换得到

k1*(p-1)+dp*e=k2*(p-1)*(q-1)+1

\Rightarrow dp*e=(p-1)[k2*(q-1)-k1]+1

我们令X=[k2*(q-1)-k1]+1,所以该式即为    dp*e=X*(p-1)+1

根据 dp=d%(p-1)可知,dp是余数,所以dp<p-1,相应的e>X

所以我们爆破X在(1,e+1)之间,当X满足(dp*e-1)%X==0时,p=(dp*e-1)//X+1

因为符合条件的x有很多,求出来的p不一定符合条件,所以需要进一步验证n%p=0

上代码:

import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
n = 13851998696110232034312408768370264747862778787235362033287301947690834384177869107768578977872169953363148442670412868565346964490724532894099772144625540138618913694240688555684873934424471837897053658485573395777349902581306875149677867098014969597240339327588421766510008083189109825385296069501377605893298996953970043168244444585264894721914216744153344106498382558756181912535774309211692338879110643793628550244212618635476290699881188640645260075209594318725693972840846967120418641315829098807385382509029722923894508557890331485536938749583463709142484622852210528766911899504093351926912519458381934550361
dp = 100611735902103791101540576986246738909129436434351921338402204616138072968334504710528544150282236463859239501881283845616704984276951309172293190252510177093383836388627040387414351112878231476909883325883401542820439430154583554163420769232994455628864269732485342860663552714235811175102557578574454173473
c = 6181444980714386809771037400474840421684417066099228619603249443862056564342775884427843519992558503521271217237572084931179577274213056759651748072521423406391343404390036640425926587772914253834826777952428924120724879097154106281898045222573790203042535146780386650453819006195025203611969467741808115336980555931965932953399428393416196507391201647015490298928857521725626891994892890499900822051002774649242597456942480104711177604984775375394980504583557491508969320498603227402590571065045541654263605281038512927133012338467311855856106905424708532806690350246294477230699496179884682385040569548652234893413

for x in range(1,e+1):
    if (dp*e-1)%x==0:
        p=(dp*e-1)//x+1
        if n%p==0:
            q=n//p
            phi=(p-1)*(q-1)
            d=gmpy2.invert(e,phi)
            m=pow(c,d,n)
            print(long_to_bytes(m))

解的flag{dp_i5_1eak}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paintrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值