前言
有了上面的数论基础之后,我们就可以来看 RSA 算法的神奇之处了。
算法描述
我们先把整个加解密过程简单流程描述一下。加解密过程如下:
加密:
C
=
M
e
m
o
d
n
C = M^e\,mod\,n
C=Memodn
解密:
M
=
C
d
m
o
d
n
=
(
M
e
)
d
m
o
d
n
=
M
e
d
m
o
d
n
M = C^d\,mod\,n = (M^e)^d\,mod\,n=M^{ed}\,mod\,n
M=Cdmodn=(Me)dmodn=Medmodn
其中,M 表示待加密的明文,C 表示加密后的密文,e,n,d 均为整数,如果能找到合适的这三个数能让上面的过程满足,就可以把PU = {e,n}当作公钥,PR = {d,n}当作私钥,进行公钥密码体制的加解密了。
计算方法
问题转化
问题:寻找 e,d,n 使所有
M
<
n
M < n
M<n, 能使
M
e
d
m
o
d
n
=
M
M^{ed}\,mod\,n=M
Medmodn=M, 成立。
解:
- 先选定两个素数, p , q p, q p,q。
- 计算 n = p q n = pq n=pq
- 选定 e,使 e , ϕ ( n ) e, \phi(n) e,ϕ(n) 互素,这个一般会选 3, 7, 65537 等素数,也可以随机选择
- 可以计算得到 d, 使 e d ≡ 1 m o d ϕ ( n ) ed\equiv\,1\,mod\,\phi(n) ed≡1modϕ(n), 这个可以通过扩展欧几里德算法得到
这样 就得到了 e , d e,d e,d,那么选择出来的 e , d , p , q , n e,d,p,q,n e,d,p,q,n 能使上式成立么?
证明
令
ϕ
(
n
)
=
k
\phi(n) = k
ϕ(n)=k,
因为
e
d
≡
1
m
o
d
ϕ
(
n
)
ed \equiv 1\,mod\,\phi(n)
ed≡1modϕ(n), 即
e
d
m
o
d
ϕ
(
n
)
=
1
ed\,mod\,\phi(n)=1
edmodϕ(n)=1
所以
e
d
=
t
k
+
1
ed = tk + 1
ed=tk+1。
则:
M
e
d
m
o
d
n
=
M
t
k
+
1
m
o
d
n
=
(
M
∗
M
t
k
)
m
o
d
n
M^{ed}\,mod\,n = M^{tk+1}\,mod\,n=(M*M^{tk})mod\,n
Medmodn=Mtk+1modn=(M∗Mtk)modn
M
e
d
m
o
d
n
=
[
(
M
m
o
d
n
)
∗
(
M
t
k
m
o
d
n
)
]
m
o
d
n
M^{ed}\,mod\,n = [(M\,mod\,n)*(M^{tk}\,mod\,n)]mod\,n
Medmodn=[(Mmodn)∗(Mtkmodn)]modn
M
e
d
m
o
d
n
=
[
(
M
m
o
d
n
)
∗
(
(
M
k
m
o
d
n
)
t
m
o
d
n
)
]
m
o
d
n
M^{ed}\,mod\,n = [(M\,mod\,n)*((M^kmod\,n)^tmod\,n)]mod\,n
Medmodn=[(Mmodn)∗((Mkmodn)tmodn)]modn
因为
M
k
m
o
d
n
=
M
ϕ
(
n
)
m
o
d
n
M^k\,mod\,n = M^{\phi(n)}mod\,n
Mkmodn=Mϕ(n)modn, 根据欧拉定理,当 M 和n 互素时,
M
ϕ
(
n
)
m
o
d
n
=
1
M^{\phi(n)}mod\,n=1
Mϕ(n)modn=1,
所以
M
k
m
o
d
n
=
1
M^kmod\,n=1
Mkmodn=1。
M
e
d
m
o
d
n
=
[
(
M
m
o
d
n
)
∗
(
1
t
m
o
d
n
)
]
m
o
d
n
M^{ed}\,mod\,n = [(M\,mod\,n)*(1^tmod\,n)]mod\,n
Medmodn=[(Mmodn)∗(1tmodn)]modn
M
e
d
m
o
d
n
=
M
m
o
d
n
M^{ed}\,mod\,n=M\,mod\,n
Medmodn=Mmodn
因为
M
<
n
M < n
M<n, 所以
M
m
o
d
n
=
M
M\,mod\,n = M
Mmodn=M
即
M
e
d
m
o
d
n
=
M
M^{ed}\,mod\,n=M
Medmodn=M。
证明完毕,说明此时 e,d,n 满足 RSA 算法要求,就可以使用公钥PU={e,n}和私钥PR={d,n}了。
场景描述
假设通信双方是 Alice 和 Bob, Bob 想给 Alice 发消息如 88,场景是怎样的呢。
- Alice 选取两个素数 p,q,比如 17,11
- Alice 计算 n = p q = 17 ∗ 11 = 187 n = pq = 17*11= 187 n=pq=17∗11=187
- Alice 计算 ϕ ( n ) = ( p − 1 ) ∗ ( q − 1 ) = 16 ∗ 10 = 160 \phi(n) = (p-1)*(q-1)=16*10=160 ϕ(n)=(p−1)∗(q−1)=16∗10=160
- Alice 选择一个小于 ϕ ( n ) \phi(n) ϕ(n)且与它互素的数,如 e = 7 e=7 e=7
- 通过计算得到 d, 使 d e ≡ 1 ( m o d 160 ) de\equiv\,1(mod\, 160) de≡1(mod160), 因为 23 ∗ 7 = 161 = 1 ∗ 160 + 1 23*7=161=1*160+1 23∗7=161=1∗160+1, 所以 d = 23 d=23 d=23
- Alice 把 {7,187} 发给 Bob, 自己保存 {23,187}
- Bob 计算 C = M e m o d n C = M^e\,mod\,n C=Memodn, 即 8 8 7 m o d 187 = 11 88^7\,mod\,187=11 887mod187=11, 把 11 发给 Alice
- Alice 计算 M = C d m o d n M = C^d\,mod\,n M=Cdmodn, 即 1 1 23 m o d 187 = 88 11^{23}\,mod\,187=88 1123mod187=88,得到原文。
安全性
攻击者拿到 e,n 要想算出 d, 即用公式 e d ≡ 1 m o d ϕ ( n ) ed\equiv\,1\,mod\,\phi(n) ed≡1modϕ(n), 此时如果知道 ϕ ( n ) \phi(n) ϕ(n)即能用扩展欧几里德算法得到 d,并且如果知道 p,q 那么是可以通过 ϕ ( n ) = ϕ ( p q ) = ϕ ( p ) ∗ ϕ ( q ) = ( p − 1 ) ∗ ( q − 1 ) \phi(n)=\phi(pq)=\phi(p)*\phi(q)=(p-1)*(q-1) ϕ(n)=ϕ(pq)=ϕ(p)∗ϕ(q)=(p−1)∗(q−1)计算得来的,但是从 n 分解出两个质因数除了暴力破解没有更加有效的算法,如果 n 选择较大的话,破解时间将以年计,所以我们认为该算法是安全的。目前要求较高的密钥选择在 1 0 75 10^{75} 1075以上,对应的密钥长度可以达到 1024 位。