一、前言
RSA加密算法由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,算法名字取自三位的姓氏首字母;其安全性部分依赖于大整数分解的困难。之所以说“部分依赖于”,是因为至今还没证明RSA的安全性完全依赖于大整数分解。
何为大整数分解?公开两个大素数的乘积 n = p ∗ q n = p * q n=p∗q,分解其两个素因子 p p p、 q q q,即 n = p ∗ q n = p * q n=p∗q。
二、算法详解
公钥与私钥生成
公钥与私钥生成的流程如下:
- 随机选取两个大素数 p p p、 q q q,计算 n = p ∗ q n = p * q n=p∗q;
- 随机选取加密密钥 e e e,使得 e e e 与 ( p − 1 ) ∗ ( q − 1 ) (p-1) * (q-1) (p−1)∗(q−1)互素;
- 用扩展欧几里得扩展算法计算密钥 e e e模 ( p − 1 ) ∗ ( q − 1 ) (p-1) * (q-1) (p−1)∗(q−1)的逆元 d d d,亦即 d = e − 1 m o d ( ( p − 1 ) ∗ ( q − 1 ) ) d = e^{-1} \bmod ((p-1) * (q-1)) d=e−1mod((p−1)∗(q−1))
注意: d d d与 n n n也是互素。 e e e和 n n n是公钥, d d d是私钥。
加密与解密
对消息 m m m加密,密文 c = m e m o d n c = m^e \bmod n c=memodn。用私钥解密密文,恢复明文 m = c d m o d n m = c^d \bmod n m=cdmodn。
解密公式证明需要用到欧拉定理。首先引入欧拉函数
ϕ
(
n
)
\phi(n)
ϕ(n),表示与
n
n
n互素的小于
n
n
n的正整数数目(
n
>
1
n > 1
n>1),也称之为模
n
n
n的余数化简集中元素的数目。如果
n
n
n是素数,那么
ϕ
(
n
)
=
n
−
1
\phi(n) = n-1
ϕ(n)=n−1;如果
n
=
p
∗
q
n=p*q
n=p∗q 且
p
p
p与
q
q
q互素,那么
ϕ
(
n
)
=
(
p
−
1
)
∗
(
q
−
1
)
\phi(n) = (p-1) * (q-1)
ϕ(n)=(p−1)∗(q−1)。
欧拉定理:如果
g
c
d
(
a
,
n
)
=
1
gcd(a,n) = 1
gcd(a,n)=1,那么
a
ϕ
(
n
)
m
o
d
n
=
1
a^{\phi(n)} \bmod n = 1
aϕ(n)modn=1。
解密公式的证明如下:
c d m o d n = ( m e ) d m o d n = m e ∗ d m o d n = m k ( p − 1 ) ( q − 1 ) + 1 m o d n = m ∗ m k ( p − 1 ) ( q − 1 ) m o d n = m ∗ m k ∗ ϕ ( n ) m o d n = m m o d n \begin{align} c^d \bmod n & = (m^e)^d \bmod n \\ & = m ^{e*d} \bmod n \\ & = m ^{k(p-1)(q-1)+1} \bmod n \\ & = m * m^{k(p-1)(q-1)} \bmod n \\ & = m * m^{k*\phi(n)} \bmod n \\ & = m \bmod n \\ \end{align} cdmodn=(me)dmodn=me∗dmodn=mk(p−1)(q−1)+1modn=m∗mk(p−1)(q−1)modn=m∗mk∗ϕ(n)modn=mmodn
三、参考资料
[1] R. Rivest, A . Shamir, and L. Adleman. “A method for obtaining digital signatures and public-key cryptosystems”. Communications of the ACM , vol. 21, no. 2, pp. 120–126, 1978.