彩笔
2022-12-08

RSA基础公式&正确性证明

基本原理 

公钥与私钥的产生 

  1. 随机选择两个不同大质数 $p$ 和 $q$,计算  $N=p×q$
  2. 根据欧拉函数,求得 $φ(N)=φ(p)φ(q)=(p−1)(q−1)$
  3. 选择一个小于 $φ(N)$ 的整数 $e$,使 $e$ 和 $φ(N)$ 互质。并求得 $e$ 关于 $φ(N)$ 的模反元素,命名为 $d$,有 $ed≡1(modφ(N))$
  4. 将 $p$​ 和 $q$​ 的记录销毁

此时,$(N,e)$ 是公钥,$(N,d)$ 是私钥。

消息加密 

首先需要将消息 以一个双方约定好的格式转化为一个小于 $N$,且与 $N$ 互质的整数 $m$ 。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:

$$me≡c(modN)$$

消息解密 

利用密钥 $d$​ 进行解密。

$$cd≡m(modN)$$

共模攻击 

攻击条件 

当两个用户使用相同的模数 N、不同的私钥时,加密同一明文消息时即存在共模攻击。
#题目链接 BUU-SameMod

$$\left{\begin{matrix}
c1=m^{e1}modN\
c2=m^{e2}modN
\end{matrix}\right.$$
当攻击者截获 $c1$ 和 $c2$ 后,就可以恢复出明文。用扩展欧几里得算法求出 $re1+se2=1modn$ 的两个整数 $r$ 和 $s$,由此可得:
$$\begin{align}
c^r_1c^s_2≡&M^{re1}M^{se2}modN \
≡&M^{re1+se2}modN \
≡&MmodN
\end{align}$$
python技巧
[[RSA解密技巧]]
[[z3库解方程 & mpz()超高精度]]
CTFwiki_RSA