一、题目(来源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)