RSA(1-5)
1.基础模板(分解N)
攻击条件
\(N\) 可以通过常见手段直接分解出来.
攻击脚本
1 | import libnum |
2. \(N\) 共有因子攻击(共享素数)
攻击条件
有两个公钥 \(N1\) 和 \(N2\) ,它们有共同因子 \(p\),可以通过求解它们的最大公因数得到 \(p\).
特征
\(N\) 不相同,\(e\) 相同.
攻击脚本
1 | import libnum |
3.共模攻击
攻击条件
当两个用户使用相同的模数 \(N\),不同的私钥 \(d\) 时,加密同一明文消息时即存在共模攻击.
特征
\(N\) 相同,\(e\) 不相同.
攻击原理
\[
\begin{aligned}
c_1 \equiv m ^{e_1} \mod N \\
c_2 \equiv m ^{e_2} \mod N
\end{aligned}
\] 通过扩展欧几里得定理求得 \(r\) 和 \(s\),即 \[
\begin{split}
r \times e_1 + s \times e_2 = 1 = \gcd (e1,e2) \\
\end{split}
\] 然后,通过如下方法即可求得明文 \(m\). \[
\begin{split}
c_1^rc_2^s &\equiv m^{re_1}m^{se_2} \mod N \\
&\equiv m^{re_1+se_2} \mod N \\
&\equiv m \mod N
\end{split}
\] 如果 \(r\) 和 \(c\) 中有一个是负数,那么就先取反,再将
\(c1\) 或者 \(c2\) 换成对应的逆元即可. ##### 攻击脚本
1
2
3
4
5
6
7
8
9
10import libnum
r,s,temp = libnum.xgcd(e1,e2)
if r < 0:
r = -r
c1 = libnum.invmod(c1,n)
if s < 0:
s = -s
c2 = libnum.invmod(c2,n)
m = (pow(c1,r,n)*pow(c2,s,n))%n
print(libnum.n2s(m))
4.小公钥指数攻击
攻击条件
\(e\) 特别小.
攻击原理
根据加密原理 \[ \begin{split} c \equiv m^e \mod N \end{split} \] 可以得出 \[ \begin{split} m^e = k \times N + c \end{split} \] 此时,暴力枚举 \(k\) ,计算出 \(k \times N +c\),再开 \(e\) 次方即可.
攻击脚本
1 | import libnum |
5.维纳攻击
攻击条件
\(d < \frac{1}{3}N^\frac{1}{4}\)
特征
\(e\) 极大或极小.
攻击脚本
1 | import gmpy2 |