[WUSTCTF2020]dp_leaking_1s_very_d@angerous
看了其他的wp,里面的代码甚至跑不了,我就随手写一篇吧哈哈
先了解一下dp是什么
d p = d % ( p − 1 ) dp=d\%(p-1) dp=d%(p−1)
这个题目中
已知 n,e,dp,可以求出q,p
下面简单推导一下是怎么求出来的
φ
(
N
)
=
(
p
−
1
)
∗
(
q
−
1
)
e
d
≡
1
(
m
o
d
φ
(
N
)
)
e
d
=
1
+
k
φ
(
N
)
e
d
=
1
+
k
∗
(
p
−
1
)
∗
(
q
−
1
)
e
d
≡
1
(
m
o
d
p
−
1
)
d
p
=
d
%
(
p
−
1
)
d
p
≡
d
(
m
o
d
p
−
1
)
d
p
∗
e
≡
e
d
≡
1
(
m
o
d
p
−
1
)
d
p
∗
e
=
k
(
p
−
1
)
+
1
d
p
∗
e
−
1
=
k
(
p
−
1
)
这
里
可
以
把
k
爆
破
出
来
\varphi (N) = (p-1)*(q-1)\\ ed \equiv 1 \pmod{\varphi (N)} \\ ed = 1+k\varphi (N)\\ ed = 1+k*(p-1)*(q-1)\\ ed \equiv 1 \pmod{p-1} \\ dp=d\%(p-1)\\ dp \equiv d \pmod{p-1} \\ dp*e \equiv ed \equiv 1 \pmod{p-1} \\ dp*e = k(p-1)+1\\ dp*e-1= k(p-1)\\ 这里可以把k爆破出来
φ(N)=(p−1)∗(q−1)ed≡1(modφ(N))ed=1+kφ(N)ed=1+k∗(p−1)∗(q−1)ed≡1(modp−1)dp=d%(p−1)dp≡d(modp−1)dp∗e≡ed≡1(modp−1)dp∗e=k(p−1)+1dp∗e−1=k(p−1)这里可以把k爆破出来
代码实现如下
def solve_dp(dp,e,n):
for i in range(1,dp*e):
if (dp*e-1)%i==0:
p=(dp*e-1)//i+1
if n%p==0:
print(p)
q=n//p
return p,q
这样把pq解出来,下面就很简单了