RSA公开密钥算法
RSA公开密钥算法
RSA算法是Merkle背包算法出现后的第一个较为完善的公开密钥算法。
包含公开密钥和私人密钥,如果Alice想发送消息给Bob,应该怎么做呢?
- Alice用公开密钥对消息加密
- Alice将加密后的密文发送给Bob
- Bob用私人密钥对密文进行解密
产生两个密钥的方法:
- 选取两个大素数
p
p
p和
q
q
q,为了安全,两数的长度一样长
- 计算乘积
n
=
p
q
n=pq
n=pq
- 然后随机选取加密密钥
e
e
e,并且
e
e
e和
(
p
−
1
)
(
q
−
1
)
(p-1)(q-1)
(p−1)(q−1)互素
- 最后使用扩展欧几里得算法,得到解密密钥
d
d
d
e
d
=
1
m
o
d
(
p
−
1
)
(
q
−
1
)
ed=1 \ \mathrm{mod}\ (p-1)(q-1)
ed=1 mod (p−1)(q−1)
d
d
d是
e
e
e模
(
p
−
1
)
(
q
−
1
)
(p-1)(q-1)
(p−1)(q−1)的逆
d
,
n
d,n
d,n也互素,
e
e
e和
n
n
n就是公开密钥,
d
d
d就是私人密钥
公开密钥
n
,
e
私人密钥
d
加密
C
=
P
e
(
m
o
d
n
)
解密
P
=
C
d
(
m
o
d
n
)
\begin{array}{|c|c|c|} \hline 公开密钥& n,e \\ \hline 私人密钥& d\\ \hline 加密&C=P^e \pmod{n} \\ \hline 解密&P=C^d \pmod{n} \\ \hline \end{array}
公开密钥私人密钥加密解密n,edC=Pe(modn)P=Cd(modn)
例如我们需要加密消息
P
=
857
P=857
P=857
- 取素数
p
=
37
,
q
=
91
p=37,q=91
p=37,q=91
- 计算乘积
n
=
p
q
=
3367
n=pq=3367
n=pq=3367
- 随机选取加密密钥
e
e
e,与
(
p
−
1
)
(
q
−
1
)
=
3240
(p-1)(q-1)=3240
(p−1)(q−1)=3240互素,
e
=
137
e=137
e=137
- 扩展欧几里得算法
e
x
t
e
n
d
extend
extend_
g
c
d
(
e
,
(
p
−
1
)
(
q
−
1
)
,
d
,
y
)
gcd(e,(p-1)(q-1),d,y)
gcd(e,(p−1)(q−1),d,y),求出
d
=
473
d=473
d=473
- 加密:密文
C
=
P
e
(
m
o
d
n
)
=
85
7
137
(
m
o
d
3367
)
=
376
C=P^e \pmod n=857^{137}\pmod {3367}=376
C=Pe(modn)=857137(mod3367)=376
- 解密:明文
P
=
C
d
(
m
o
d
n
)
=
37
6
473
(
m
o
d
3367
)
=
857
P=C^d\pmod{n}=376^{473}\pmod {3367}=857
P=Cd(modn)=376473(mod3367)=857
解密原理:
欧拉定理&费马小定理
定义:
a
,
m
∈
N
+
,
a,m\in N^+,
a,m∈N+,且
g
c
d
(
a
,
m
)
=
1
,
gcd(a,m)=1,
gcd(a,m)=1,则有
a
φ
(
m
)
≡
1
(
m
o
d
m
)
a^{\varphi(m)}\equiv 1\pmod{m}
aφ(m)≡1(modm)其中
φ
(
m
)
\varphi(m)
φ(m)是小于
m
m
m且与
m
m
m互质的自然数的个数当
m
m
m是素数
,
a
φ
(
m
)
=
m
−
1
,
a
m
−
1
≡
1
(
m
o
d
m
)
,a^{\varphi(m)}=m-1,a^{m-1}\equiv 1\pmod{m}
,aφ(m)=m−1,am−1≡1(modm)什么?这不是费马小定理吗?
所以费马小定理是欧拉定理的一个特殊情况
- 设
a
,
m
a,m
a,m是互素的正整数,那么
φ
(
a
m
)
=
φ
(
a
)
φ
(
m
)
,
\varphi(am)=\varphi(a)\varphi(m),
φ(am)=φ(a)φ(m),这说明欧拉函数是一个积性函数
那有
n
=
p
q
,
φ
(
n
)
=
φ
(
p
q
)
=
φ
(
p
)
φ
(
q
)
=
(
p
−
1
)
(
q
−
1
)
n=pq,\varphi(n)=\varphi(pq)=\varphi(p)\varphi(q)=(p-1)(q-1)
n=pq,φ(n)=φ(pq)=φ(p)φ(q)=(p−1)(q−1)
C
d
(
m
o
d
n
)
C^d\pmod{n}
Cd(modn)
=
P
e
d
(
m
o
d
n
)
=P^{ed}\pmod{n}
=Ped(modn)
=
P
k
(
p
−
1
)
(
q
−
1
)
+
1
(
m
o
d
n
)
=P^{k(p-1)(q-1)+1}\pmod{n}
=Pk(p−1)(q−1)+1(modn)
=
P
∗
P
k
(
p
−
1
)
(
q
−
1
)
(
m
o
d
n
)
=P*P^{k(p-1)(q-1)}\pmod{n}
=P∗Pk(p−1)(q−1)(modn)
=
P
∗
(
P
φ
(
n
)
(
m
o
d
n
)
)
k
(
m
o
d
n
)
=P*(P^{\varphi(n)}\pmod n)^k \pmod{n}
=P∗(Pφ(n)(modn))k(modn)
=
P
∗
1
k
(
m
o
d
n
)
=P*1^k \pmod{n}
=P∗1k(modn)
=
P
=P
=P
不过,既然我们知道公开密钥
e
e
e和
n
n
n,还知道
n
=
p
q
,
g
c
d
(
e
,
(
p
−
1
)
(
q
−
1
)
)
=
1
,
d
=
e
−
1
m
o
d
(
p
−
1
)
(
q
−
1
)
n=pq,gcd(e,(p-1)(q-1))=1,d=e^{-1} \mathrm{mod}\ (p-1)(q-1)
n=pq,gcd(e,(p−1)(q−1))=1,d=e−1mod (p−1)(q−1),那我们通过分解
n
n
n,得到正确的
p
p
p和
q
q
q,就可以得到私人密钥
d
d
d(其实还可以猜测
(
p
−
1
)
(
q
−
1
)
(p-1)(q-1)
(p−1)(q−1),这显然比分解
n
n
n还要难)
这个想法的确很美好,
B
u
t
But
But难度极其大
1976
1976
1976年,
R
i
c
h
a
r
d
G
u
y
Richard Guy
RichardGuy说道,“本世纪如果有人不采用特殊的方式成功地对
1
0
80
10^{80}
1080大小的数进行因子分解的话那我将非常惊讶”。
1977
1977
1977年,
R
o
n
R
i
v
e
s
t
Ron Rivest
RonRivest说,分解一个
125
125
125位的十进制数大约需要
40
∗
1
0
50
40*10^{50}
40∗1050年。
1994
1994
1994年,一个
129
129
129位的数据被成功分解。
两个大素数进行相乘是一个单向函数,得到乘积很容易,但是想分解却特别困难了,目前,
129
129
129位十进制数字的模数被认为是能分解的临界数,所以
n
n
n更应该大于这个数
随着密钥长度的增加,分解的难度更大,但是解密时间也会增加
现今,有很多针对RSA的攻击方法,例如选择密文攻击,公共模数攻击,低加密指数攻击,加密和签名攻击
谢谢🙏
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/3d7b5a7862.html
