RSA简介
已知大数n=pq。p和q为素数。
ϕ
\phi
ϕ(n) = (p-1)(q-1)。选择一个小于
ϕ
\phi
ϕ(n)并互素的数字e。公钥为{e,n}。ed
≡
\equiv
≡ 1 mod
ϕ
\phi
ϕ(n)。d是e关于
ϕ
\phi
ϕ(n)的逆元。得出私钥{d,n}。
设明文为M,密文为C。使用公钥加密,则有
C
≡
M
e
C \equiv M^e
C≡Me mod n。
传输到达接收方后,使用私钥解密,有
M
≡
C
d
M \equiv C^d
M≡Cd mod n。 即
M
≡
(
M
e
)
d
M \equiv (M^e)^d
M≡(Me)d mod n。
用公钥进行有效运算
公钥是公开的,因此可以选定特定的值来加快RSA在使用公钥时的速度。大多数选择e为65537=216 + 1。另外两个常用值为3和17。这些数字的二进制含1的位只有两位,方便计算。但如果指数太小了,如e=3,RSA会遭受到简单的攻击。
假设有三个用户都选择e=3,他们三个的公钥为{e=3,
n
1
n_1
n1},
{e=3,
n
2
n_2
n2},{e=3,
n
3
n_3
n3}。刚好凑巧,
n
1
,
n
2
,
n
3
n_1,n_2,n_3
n1,n2,n3两两互素,这是很有可能发生的。这时一个用户A,使用公钥加密的方式给他们三个人发送了相同的消息M。三个密文分别是
C
1
≡
M
3
C_1 \equiv M^3
C1≡M3 mod
n
1
n_1
n1,
C
2
≡
M
3
C_2 \equiv M^3
C2≡M3 mod
n
2
n_2
n2,
C
3
≡
M
3
C_3 \equiv M^3
C3≡M3 mod
n
3
n_3
n3。这时,我们使用中国剩余定理,就可以将
M
3
M^3
M3 mod (
n
1
n
2
n
3
n_1n_2n_3
n1n2n3)算出。由RSA可知,M比模数小,因此
M
3
<
n
1
n
2
n
3
M^3 < n_1n_2n_3
M3<n1n2n3,那么攻击者只需计算M的三次方根。
用私钥进行有效运算
私钥{d,n},选取数值较小的d,容易遭受穷举攻击;选取数值较大的d,会影响计算效率。那么如何改进计算过程,就成为了提高解密效率的关键。运用中国剩余定理是个不错的方法。
我们可以知道解密过程是
M
≡
C
d
M \equiv\ C^d
M≡ Cd mod n。我们先定义一些中间结果。
V
p
=
C
d
V_p = C^d
Vp=Cd mod p和
V
q
=
C
d
V_q = C^d
Vq=Cd mod p。
定义
X
p
=
X_p =
Xp=q
×
\times
×(q-1 mod p) 和
X
q
=
X_q=
Xq=p
×
\times
×(p-1 mod q)。由CRT得
M
=
(
V
p
X
p
+
V
q
X
q
)
M=(V_pX_p +V_qX_q)
M=(VpXp+VqXq) mod n。虽然加快了一些,但注意到
V
p
和
V
q
V_p和V_q
Vp和Vq,还是要计算Cd。
我们可以使用费马定理加快这一步。我们知道有式子
ap
≡
\equiv
≡ a mod p。
在式子
V
p
V_p
Vp中,我们知道有[Cd]p
≡
\equiv
≡ Cd mod p。有dp = d(p-1)+d,故dp
≡
\equiv
≡ d mod (p-1)。从而
V
p
V_p
Vp=Cdmod(p-1) mod p。同理
V
q
V_q
Vq=Cdmod(q-1) mod q。并且d mod (p-1)与d mod (q-1)可以预先计算出来。与直接计算
M
≡
C
d
M \equiv C^d
M≡Cd mod n相比,这个方法快得多。