CTF中的RSA基本套路(1)
碰到东西老是忘老是忘,要用的时候总是得自己去搜索模板浪费时间,所以只能整理整理一下套路和解题模板才能活下去这样子
依赖库:
- gmpy2
- pycrypto
RSA原理#
私钥$n$,$d$,公钥$n$,$e$。其中n是两个素数$p$,$q$的乘积。$c$为密文,$m$为明文。$\varphi(n)$为欧拉函数。其中:$d$是$e$模$\varphi(n)$的逆元。我们有
$$ \varphi(n) = (p-1)(q-1) $$
$$ed \equiv 1 \mod \varphi(n)$$
$$ encrypt:c \equiv m^e \mod n $$
$$ decrypt:m \equiv c^d \mod n $$
openssl使用#
使用openssl
查看pem
文件:
1 | openssl rsa -pubin -text -modulus -in public.pem |
使用openssl
和私钥解密
1 | openssl rsautl -decrypt -in flag -inkey privatekey -out flag.txt |
常规#
场景#
已知$p$、$q$、$c$
解法#
求$\varphi(n)$,再求出$d$即可
1 | from Crypto.Util.number import inverse,long_to_bytes |
模不互素#
场景#
已知如下:
$$n_1 = p \times q_1 $$
$$ n_2=p \times q_2 $$
$$c_1= m^e \mod n_1 $$
$$c_2 = m^e \mod n_2$$
解法#
求出$n_1$和$n_2$的公因子,即可解得$p$和$q$
1 | from libnum import xgcd |
共模攻击#
场景#
模数$n$相同,指数$e_1、e_2$不同且互质
已知:
$$c_1=m^{e_1}\mod n$$
$$c_2 = m^{e_2}\mod n$$
解法#
根据扩展欧几里得算法求出$re_1+se_2=1 \mod n$的整数$r、s$
根据
$$\begin{equation}
c_{1}^{r} c_{2}^{s} \equiv m^{r e_{1}} m^{s e_{2}} \bmod n \equiv m \mod n
\end{equation}$$
得到明文
1 | from libnum import xgcd |
e小指数攻击#
场景#
当$e$很小的时候,例如2、3,此时可能可以通过直接暴力开根的方式进行攻击
解法#
以$e=3$为例,已知$c\equiv m^3 \mod n$,因此有:
$$m^3=c+kN$$
$$m=\sqrt[3]{c+kN}$$
1 | import gmpy2 |
Rabin攻击#
场景#
当指数$e=2$,且已知$p$和$q$
解法#
计算
$$m_p = \sqrt[2]{c} \mod p$$
$$m_q= \sqrt[2]{c} \mod q$$
扩展欧几里得求$y_p$和$y_q$
$$y_p p+y_q q=1$$
解得4个明文
$$a =\left(y_{p} \cdot p \cdot m_{q}+y_{q} \cdot q \cdot m_{p}\right) \bmod n $$
$$b =n-a $$
$$c =\left(y_{p} \cdot p \cdot m_{q}-y_{q} \cdot q \cdot m_{p}\right) \bmod n $$
$$d =n-c$$
条件:当$p\equiv q\equiv3 \mod 4$时,有
$$m_p=c^{(p+1)/4} \mod p$$
$$m_q=c^{(q+1)/4} \mod q$$
满足条件时#
1 | import gmpy2 |
不满足条件时#
转换为模平方根问题
- 用python(代码来自yuri)
1 | import gmpy2 |
- 用sage
使用一句话Mod(c_square, q).sqrt(all=True)
分别求出$m_p$和$m_q$,代回去解得可能的明文
n分解攻击#
当n很小或者满足一定条件时,可以进行暴力分解
yafu
factordb
当$d<1/3 N^{1/4}$时,通过Wiener’s attack能够攻击得到$d$
当$p、q$十分接近时,可以使用费马分解分解$n$
当$q$较小,即$|p-q|$较大时,可以爆破$q$
当$d<N^{0.292}$时,通过Boneh Durfee Method分解$n$
广播攻击#
场景#
给定了不同的模数$n_i$,但指数$e$相同
已知:
$$c_1=m^e\mod n_1$$
$$c_2=m^e\mod n_2$$
$$c_3=m^e\mod n_3$$
解法#
使用中国剩余定理进行广播攻击
1 | from gmpy2 import * |