其他分享
首页 > 其他分享> > RSA

RSA

作者:互联网

RSA公钥密码体制全梳理

算法原理

\[\operatorname{gcd}(e,(p-1)(q-1))=1 \]

则 \(e\) 模 \((p-1)(q-1)\) 存在逆元, 即

\[d e \equiv 1(\bmod (p-1)(q-1)) \]

则同余方程

\[x^{e} \equiv c(\bmod p q) \]

有唯一解 \(x \equiv x^{ed} \equiv c^{d}(\bmod p q)\)

算法流程

  1. 密钥生成过程:
    选择两个大素数 \(p 、 q\), 计算公开模数:

\[N=q * p \]

选择公开加密指数 e,满足:

\[\operatorname{gcd}(e,(p-1)(q-1))=1 \]

  1. RSA 加密过程:
    将明文转化为整数 \(\mathrm{m}\),使用公钥N计算

\[C \equiv m^{e}(\bmod N) \]

得到密文\(C\)
3. RSA解密过程:
已知\(p,q\),计算\(d\):

\[d e \equiv 1(\bmod (p-1)(q-1)) \]

然后计算明文M:

\[M\equiv C^d(\bmod N) \]

在实际应用中,RSA加解密经过分组的数据段,这些数据段长度相等,固定长度时长度不足的数据段需要进行填充。

算法实现

  1. 使用快速模幂运算计算,python中使用pow函数可以达到同样的效果。

  2. 一般加密过程e比较小,可以快速实现,但解密时d比较大所以实际中利用中国剩余定理来加快计算:

\[\begin{gather*} &m\equiv c^d(\bmod N)\\ &\Rightarrow\left\{ \begin{array}{} m_1\equiv c^d (\bmod p) \\ m_1\equiv c^d (\bmod q)\\ \end{array}\right.\\ &\Rightarrow\left\{ \begin{array}{} m_1\equiv (c\bmod p)^{d\bmod (p-1)} (\bmod p) \\ m_1\equiv (c\bmod q)^{d\bmod (q-1)} (\bmod q)\\ \end{array}\right.\\ &\Rightarrow\left\{ \begin{array}{} m_1\equiv (c\bmod p)^{d\bmod (p-1)} (\bmod p) \\ m_1\equiv (c\bmod q)^{d\bmod (q-1)} (\bmod q)\\ \end{array}\right.\\ &\Rightarrow m\equiv m_1Aq+m_2Bp\ (\bmod N=pq)\\ &A=q^{-1}\ \bmod p\quad B=p^{-1}\ \bmod q \end{gather*} \]

  1. 密钥产生——伪随机数发生器、执行素数判定测试(Miller Rabin)

  2. 安全性优化——密钥生成阶段参数选择(否则会产生参数选取不当攻击)
    (1)使用大素数,同时要求p,q相差很大
    (2)尽量使用强素数p,q,强素数指p-1有很大的素因子。否则若p-1没有很大的质因数,而是由m个较小的质因数\(p_1p_2...p_m\)组成。则\(p-1=p_1^{a_1}p_2^{a_2}...p_m^{a_m}\),那么,要分解n则相对容易。(有相关论文可以找到详细分解方法)
    (3)\(d>N^\frac{1}{4}\),避免连分式理论

对RSA的攻击方式

因式分解攻击

分解成功后按照算法原理中的内容可以计算得到明文m

参数选取不当攻击

p,q相差要大(但不能过大)

d特别小,e很大(接近N)

\[x=a_{0}+\frac{1}{a_{1}+\frac{1}{a_{2}+\frac{1}{a_{3}+\frac{1}{\ddots, L}}}} \]

由于 \(e d \equiv 1(\bmod \varphi(N))\) ,所以存在整数 \(\mathrm{k}\) ,满足

\[e d-k \varphi(N)=1 \]

由于 \(N=p q>q^{2}\), 即 \(q<N\) ,所以

\[\begin{gathered} 0<N-\varphi(N)=p+q-1<2 q+q-1<3 q<3 \sqrt{N} \\ \Rightarrow\left|\frac{e}{N}-\frac{k}{d}\right|=\left|\frac{e d-k N}{d N}\right|=\left|\frac{1+k(\varphi(N)-N)}{d N}\right|<\frac{3 k \sqrt{N}}{d N}=\frac{3 k}{d \sqrt{N}} \end{gathered} \]

由于 \(k<d\), 所以 \(3k<3d<N^{\frac{1}{4}}\), 即

\[\left|\frac{e}{N}-\frac{k}{d}\right|<\frac{1}{d N^{\frac{1}{4}}} \quad \Rightarrow \quad \left|\frac{e}{N}-\frac{k}{d}\right|<\frac{1}{3 d^{2}} \]

由连分数理论,此时 \(\frac{k}{d}\) 是 \(\frac{e}{N}\) 的一个收敛子:
计算 \(\frac{e}{N}\) 的连分数展开, 依次算出每一个渐进分数。因为 \(\frac{e}{N}>\frac{k}{d}\),所以 \(\frac{e}{N}\) 的渐进分数覆盖了 \(\frac{k}{d^{\circ}}\) 。 就是说 \(\frac{e}{N}\) 的渐进分数里有等于 \(\frac{k}{d}\) 的分数。接着验证 \(k, d\) 是否满足条件就求得了 \(k, d\) 的值

选择密文攻击/中间人攻击

\[m=m^`r^{-1} \]

共模攻击

对于给定的模数N,最多应该只使用一个加密指数,不同用户间不要共享N

低指数广播攻击

同一份明文使用不同模数和相同指数多次加密,可以考虑用中国剩余定理破解,然后直接开e次

\[\begin{gather*} c_1=m^e (mod ~~n_1)\\ c_2=m^e (mod n_2)\\ \dots\\ c_n=m^e (mod n_n)\\ \Rightarrow m^e≡x(mod~~ n_1…n_n) \end{gather*} \]

e很小时可以直接爆破

循环攻击

在构造n时应选择

标签:right,frac,bmod,RSA,equiv,left
来源: https://www.cnblogs.com/skye-rs/p/16199085.html