题目:
e = 65537
n = 156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847
c = 108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869
dp = 734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825
首先,观察题目,一道典型的rsa——dp泄露问题,我们都知道dp=d mod p-1
=>dp*e=d*e mod p-1=>dp*e=(p-1)(k1(q-1)+k2)+1
=>由于我们可知dp<p-1,所以(k1(q-1)+k2)取值范围为(1.e),暴力求解即可
for i in range(1,e): if (dp*e-1)%i==0: if n%((dp*e-1)//i+1)==0: p=(dp*e-1)//i+1 q=n//p phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) print(libnum.n2s(int(gmpy2.powmod(c,d,n)))) break
写出dp泄露脚本
最终代入数据:
import gmpy2
import libnum
e = 65537
n = 156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847
c = 108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869
dp = 734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825
for i in range(1,e):
if (dp*e-1)%i==0:
if n%((dp*e-1)//i+1)==0:
p=(dp*e-1)//i+1
q=n//p
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
print(libnum.n2s(int(gmpy2.powmod(c,d,n))))
break
得到:
b'wctf2020{dp_leaking_1s_very_d@angerous}'
![]()