[密码学]RSA中的dp和dq
0x01 原理分析
在RSA密钥对生成中,dp
和dq
是两个与私钥相关的参数。
dp是$d \bmod (p-1)$的值,dq是$d \bmod (q-1)$的值。这些值用于进行私钥操作,如解密和签名。
即:
$$
\begin{cases}
dp\equiv d \pmod {(p-1)}\\
dq\equiv d \pmod {(q-1)}
\end{cases}
$$
在网络安全的Crypto题目中,关于dp
和dq
一般有如下几种情况:
- 已知$n、e、dp、c$,求m;
- 1.1 已知 $p、e、dp、c、b$,其中$n=p^bq$,求m;
- 1.2 已知 $n、e、dp_0、c、k$,其中$dp_0$为$dp$的高$(n\text{bits}-k)$位,即$dp_0=dp>>k$,求m;
- 1.3 已知 $n、e、dp、c$,其中$dp$很小,e很大,求m;
- 1.4 已知 $n、e、c$,其中$dp$过小,求m;
- 已知$p、q、dp、dq、c$,求m。
0x0101 已知n、e、dp、c,求m
此类题目一般来说给的n比较大,需要通过dp来分解n。
显然我们有以下两个公式:
$$
\begin{align*}
dp &\equiv d \pmod {(p-1)}\\
d \times e &\equiv 1 \pmod {\phi(n)}
\end{align*}
$$
其中$\phi{(n)=(p-1)\times(q-1)}$,可以得:
$$
\begin{align*}
dp \times e & \equiv d\times e \pmod {(p-1)}\\
\Rightarrow d \times e & \equiv 1 \pmod {(p-1)}\\
\Rightarrow d \times e & =k \times (p-1)+1 \text{ \\注意这里是等号}\\
\Rightarrow d \times e & =k \times (p-1)+dp \times e \text{ \\注意这里是等号}
\end{align*}
$$
又由$d \times e \equiv 1 \pmod {\phi(n)}$和上面所得等式,可得:
$$
\begin{align*}
d \times e & =1 \pmod{(p-1)\times(q-1)}\\
k \times (p-1)+dp \times e & =k_1 \times (p-1)\times(q-1)+1\\
dp \times e & = k_1 \times (p-1)\times(q-1)+1-k \times (p-1) \\
dp \times e & = [k_1 \times (q-1)-k]\times (p-1)+1
\end{align*}
$$
设$x = k_1 \times (q-1)-k$,则有:
$$
dp \times e = x \times (p-1)+1
$$
又因为:
$$
dp < p - 1
$$
所以,可以得出要使$dp \times e = x \times (p-1)+1$等式成立,则有$x < e$,显然$x>0$,所以:
$$
x \in (0,e)
$$
即:
$$
[k_1 \times (q-1)-k ]\in(0,e)
$$
只需要遍历$(0,e)$中的整数,当以下两个等式成立时:
$$
\begin{align*}
(dp \times e-1) \bmod x &=0,\\
n \bmod{[(dp \times e -1 ) \div x +1]} & = 0
\end{align*}
$$
n就成功被分解出来了,然后就是常规rsa解法。
python3解密代码:
1 | def decrypt(e,n,c,dp): |
0x0102 已知 p、e、dp、c、b,其中$n=p^bq$,求m;
(推导略)
python3解密代码:
1 | def decrypt(e,c,b,p,dp): |
0x0103 已知 n、e、dp_0、c、k$,其中dp_0为dp的高$(n\text{bits}-k)位,即dp_0=dp>>k,求m;
sage解密代码:
1 | F.<x> = PolynomialRing(Zmod(n)) |
0x0104 已知 n、e、dp、c,其中dp很小,e很大,求m;
未完待续。。
0x0105 已知 n、e、c,其中dp过小,求m;
未完待续。。
0x0106 已知p、q、dp、dq、c,求m。
python3解题代码:
1 | def decrypt(p,q,dp,dq,c): |