RSA 一些进阶攻击方式及变体
RSA 进阶攻击:
1.Rabin:
一个密文可以解出四个明文(并非单射)
具体实现:
取两个大素数 (p,q)
满足:
加密:
解密,即求解:
因为 p,q | n ,相当于求
c 是模 p 的二次剩余
即:
代入原式得:
开方得:
同理,可求出 m3,m4 。
注:
若:
则称 a 为关于模 p 的二次剩余,p 为素数。
有
ex:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21from gmpy2 import *
from Crypto.Util.number import *
p= 13934102561950901579
q= 14450452739004884887
n = 201354090531918389422241515534761536573
c = 20442989381348880630046435751193745753
e=2
c1=pow(c,(p+1)//4,p)
c2=pow(c,(q+1)//4,q)
cp1=p-c1
cq1=q-c2
t1=invert(p,q)
t2=invert(q,p)
m1=(c1*q*t2+c2*p*t1)%n
m2=(c1*q*t2+cq1*p*t1)%n
m3=(cp1*q*t2+c2*p*t1)%n
m4=(cp1*q*t2+cq1*p*t1)%n
print(long_to_bytes(m1))
print(long_to_bytes(m2))
print(long_to_bytes(m3))
print(long_to_bytes(m4))
2.dp,dq 泄露
条件:
知道 $d_p$,$d_q$,p,q,c ,但不知道 e
$d_p$,$d_q$ 的含义:
记方程:
根据欧拉降幂,可知:
从而得到 $m_1$,$m_2$
将 $c^{d}=kp+m_1$ 代入 $m_2$ 得
同时减去 $m_1$ 得:
因为 m<n ,所以 k 一定小于 q ,所以 $k=(m_2-m_1)p^{-1} \pmod q$
从而得出:
3.dp 泄露:
条件:
知道 $d_p$,$d_q$ 之一,且知道公钥。
不妨设知道 $d_p$:
有:
已知 $d_p<p-1$,所以当 $[k_2(q-1)-k_1e]=e$ 时,左式一定小于右式。
设 $X=[k_2(q-1)-k_1e]$,当 $X$ 遍历 $[1,e]$ 时,一定会存在某个值使等式成立
从而分解 n 。
ex:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from gmpy2 import *
from Crypto.Util.number import *
import libnum
n= 93172788492926438327710592564562854206438712390394636149385608321800134934361353794206624031396988124455847768883785503795521389178814791213054124361007887496351504099772757164211666778414800698976335767027868761735533195880182982358937211282541379697714874313863354097646233575265223978310932841461535936931
dp=307467153394842898333761625034462907680907310539113349710634557900919735848784017007186630645110812431448648273172817619775466967145608769260573615221635
c=52777705692327501332528487168340175436832109866218597778822262268417075157567880409483079452903528883040715097136293765188858187142103081639134055997552543213589467751037524482578093572244313928030341356359989531451789166815462417484822009937089058352982739611755717666799278271494933382716633553199739292089
e=65537
for i in range(1,e):
if (e*dp-1)%i==0:
p=((e*dp-1)//i)+1
if isPrime(p) and isPrime(n//p):
break
q=n//p
d=invert(e,(p-1)*(q-1))
m=pow(c,d,n)
m=long_to_bytes(m)
print(m)
4.Schemidt Samoa 密码体系:
加密方式:
加密方式与 RSA 类似,计算:
解密:
计算:
证明:
根据欧拉函数性质:
则
因此:
因此:
即可得到 p,q 。
从而:
5.求二次剩余:
Tonelli-Shanks 算法:
算法过程:
求同余式: $x^{2}\equiv n \pmod p$
- 1.分解 p-1 , 使其满足 $p-1=q*2^{s}$
- 2.如果 p 满足 $p\equiv 3\pmod 4$, 则返回 $r=n^{\frac{p+1}{4}}$
上式的正确性证明:
- 因为 n 是 p 的二次剩余,所以 $n^{\frac{p-1}{2}}\equiv 1 \pmod p$
- 所以 $r^{2}=n^{\frac{p-1}{2}+1}\equiv n \pmod p$ ,则 $x=r$
- 3.若不满足上述条件,则找一个整数 z 使其是模 p 的二次非剩余(最好 z 是最小的)
- 计算: $c\equiv z^{q} \pmod p$ , $r=n^{\frac{q+1}{2}} \pmod p$ , $t=n^{q} \pmod p$ , m=s
- 4.进行外层循环:
- 若 t 满足 $t\equiv 1 \pmod p$ ,则返回结果 r ,否则进入内层循环
- 5.内层循环:
- 找一个最小的 i ,使得 $t^{2^{i}}\equiv 1 \pmod p$ 并进行以下计算:
- 不断进行内层循环,直至 $t\equiv 1 \pmod p$
正确(必要)性检验:
- 当满足循环退出的条件时
- 此时
- (充分性检验略去)
注:
勒让德符号:
p 是素数: