解压
已知e,n,dp,c
列举出来将要用到的几个公式
c=m^e mod n
m=c^d mod n
ϕ(n)=(p−1)∗(q−1)
d∗e=1 mod ϕ(n)
dp=d mod (p−1)
求m,已知c,n,即求解d
d=gmpy2.invert(e,ϕ(n))
dp*e=e*d mod (p-1)
得1式:e*d=k(p-1)+dp*e
e*d=1 mod ϕ(n)
得2式:e*d=K(p-1)(q-1)+1
由两式,得:
k(p-1)+dp*e=K(p-1)(q-1)+1
(p-1)(K(q-1)-k)+1=dp*e
令K(q-1)-k=x,则:
(p-1)x+1=dp*e
因dp=d mod (p-1) 所以 dp<p-1
所以x<e,
根据x的范围,在(1,e)区间内,进行脚本遍历
import gmpy2
e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
for x in range(1, e):
if(e*dp%x==1):
p=(e*dp-1)//x+1
if(n%p!=0):
continue
print(p)
可得到p
根据n=p*q,求出q
ϕ(n)=(p−1)∗(q−1),求出ϕ(n)
d=gmpy2.invert(e,ϕ(n)),求出d
m=c^d mod n求出m
import gmpy2
e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
p = 13468634736343473907717969603434376212206335187555458742257940406618189481177835992217885676243155145465521141546915941147336786447889325606555333350540003
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
q = n//p
u =(p-1)*(q-1)
d = gmpy2.invert(e,u)
m = gmpy2.powmod(c,d,n)
print(m)
print(hex(m)[2:])
print(bytes.fromhex(hex(m)[2:]))
运行,得flag{wow_leaking_dp_breaks_rsa?_98924743502}