给出了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)
好家伙,根据这个式子可以往下推导(纯纯的数学运算了):
变换一下得到
在rsa中定义
所以
变换得到
我们令X=[k2*(q-1)-k1]+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}