在网上看了一圈蒙哥马利模乘相关的博客,没有看到讲得比较清晰的,趁最近闲下来自己写一篇。
首选明确三个问题:
1、蒙哥马利模乘是什么?
蒙哥马利模乘是一种数学家蒙哥马利(Montgomery)提出的一种快速计算
A
∗
B
m
o
d
N
A*B \mod N
A∗BmodN的方法,其中
A
,
B
,
N
A,B,N
A,B,N均为几千位的大整数。
2、为什么要使用蒙哥马利模乘?
因为绝大多数编译器只能支持到64位的整数运算,而几千位的大整数运算如果用高精度算法编程计算,其速度非常慢,尤其是高精度除法和取模。因此需要借助蒙哥马利模乘才能更快地计算
A
∗
B
m
o
d
N
A*B \mod N
A∗BmodN。
3、蒙哥马利模乘实现的大概思路是什么?
将
A
∗
B
m
o
d
N
A*B \mod N
A∗BmodN转化为求解
A
′
∗
B
′
m
o
d
M
A'*B' \mod M
A′∗B′modM,其中一般取
M
=
r
n
M=r^n
M=rn,这样就将耗时的除法和取模操作转化为了简单的移位操作。为了在计算机或者电路中移位方便,我们一般取
r
=
2
r=2
r=2。当然,如果你想手算体验一下计算过程,也可以取
r
=
10
r=10
r=10,方便手算的移位操作。
那么有人可能会问,为什么要计算这么大数字的
A
∗
B
m
o
d
N
A*B \mod N
A∗BmodN?
这就要提到老生常谈的RSA加密算法了。
RSA加密算法简单来说,就是选取两个大质数 p p p和 q q q,相乘得到一个大整数 N = p q N=pq N=pq,把 N N N公开。然后有个同样公开的公钥 a a a,当甲要给乙发送明文 x x x的时候(每次发送的明文 x x x长度比 N N N小),就用公钥 a a a来对 x x x进行加密得到密文 y y y。乙手里有个保密不公开的私钥 b b b,对密文 y y y进行解密得到明文 x x x。
具体的加密解密过程是:
甲用公钥
a
a
a来对
x
x
x进行加密得到密文
y
y
y:
x
a
≡
y
(
m
o
d
N
)
{x^a} \equiv y{\text{ }}(\bmod N)
xa≡y (modN)
乙用私钥
b
b
b对密文
y
y
y进行解密得到明文
x
x
x:
y
b
≡
x
(
m
o
d
N
)
{y^b} \equiv x{\text{ }}(\bmod N)
yb≡x (modN)
显然,为了实现这一功能,
a
,
b
,
N
a,b,N
a,b,N之间必须要满足一定的条件。
前人给出的条件是:
a
∈
[
2
,
φ
(
N
)
−
1
]
a \in [2,\varphi (N) - 1]
a∈[2,φ(N)−1]且
(
a
,
φ
(
N
)
)
=
1
(a,\varphi (N)) = 1
(a,φ(N))=1,同时
a
b
≡
1
(
m
o
d
φ
(
N
)
)
ab \equiv 1{\text{ }}(\bmod \varphi (N))
ab≡1 (modφ(N))。
上式中
φ
(
N
)
\varphi (N)
φ(N)是欧拉函数,即
[
1
,
N
−
1
]
[1,N-1]
[1,N−1]中与N互质的数的个数。
因为
N
=
p
q
N=pq
N=pq且
p
,
q
p,q
p,q均为质数,所以
φ
(
N
)
=
φ
(
p
)
φ
(
q
)
=
(
p
−
1
)
(
q
−
1
)
\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)
φ(N)=φ(p)φ(q)=(p−1)(q−1)。
如何保证一定能找到 b b b使得 a b ≡ 1 ( m o d φ ( N ) ) ab \equiv 1{\text{ }}(\bmod \varphi (N)) ab≡1 (modφ(N))?
因为 ( a , φ ( N ) ) = 1 (a,\varphi (N)) = 1 (a,φ(N))=1,所以直接构造出 b b b证明存在性。
只要令 b = a φ ( φ ( N ) ) − 1 b = {a^{\varphi (\varphi (N)) - 1}} b=aφ(φ(N))−1,则由欧拉定理得 a b = a φ ( φ ( N ) ) ≡ 1 ( m o d φ ( N ) ) ab = {a^{\varphi (\varphi (N))}} \equiv 1{\text{ }}(\bmod \varphi (N)) ab=aφ(φ(N))≡1 (modφ(N))
注:但是实际操作的时候更多的是通过扩展欧几里得算法去求解 a b ≡ 1 ( m o d φ ( N ) ) ab \equiv 1{\text{ }}(\bmod \varphi (N)) ab≡1 (modφ(N)),而非直接计算 b = a φ ( φ ( N ) ) − 1 b = {a^{\varphi (\varphi (N)) - 1}} b=aφ(φ(N))−1
于是我们只需要证明
y
b
=
x
a
b
≡
x
(
m
o
d
N
)
{y^b} = {x^{ab}} \equiv x{\text{ }}(\bmod N)
yb=xab≡x (modN)
分两种情况进行证明
1、若
(
x
,
N
)
=
1
(x,N) = 1
(x,N)=1,
由于
a
b
≡
1
(
m
o
d
φ
(
N
)
)
ab \equiv 1{\text{ }}(\bmod \varphi (N))
ab≡1 (modφ(N))即
a
b
=
k
φ
(
N
)
+
1
ab = k\varphi (N) + 1
ab=kφ(N)+1,由欧拉定理得
x
φ
(
N
)
≡
1
(
m
o
d
N
)
{x^{\varphi (N)}} \equiv 1{\text{ }}(\bmod N)
xφ(N)≡1 (modN),则有
x
a
b
=
x
k
φ
(
N
)
+
1
≡
[
x
φ
(
N
)
]
k
⋅
x
≡
x
(
m
o
d
N
)
{x^{ab}} = {x^{k\varphi (N) + 1}} \equiv {[{x^{\varphi (N)}}]^k} \cdot x \equiv x{\text{ }}(\bmod N)
xab=xkφ(N)+1≡[xφ(N)]k⋅x≡x (modN)
2、若
(
x
,
N
)
≠
1
(x,N) \ne 1
(x,N)=1,
则必有
p
∣
x
p|x
p∣x或
q
∣
x
q|x
q∣x,不妨设
p
∣
x
p|x
p∣x,则
x
=
m
p
<
N
=
p
q
x = mp < N = pq
x=mp<N=pq,
m
<
q
m < q
m<q,又
q
q
q是质数,所以有
(
m
,
q
)
=
1
(m,q) = 1
(m,q)=1,
(
x
,
q
)
=
1
(x,q) = 1
(x,q)=1。由费马小定理,
x
q
−
1
≡
1
(
m
o
d
q
)
{x^{q - 1}} \equiv 1{\text{ }}(\bmod q)
xq−1≡1 (modq)。此时有
x
a
b
=
x
k
φ
(
N
)
+
1
=
[
x
q
−
1
]
k
(
p
−
1
)
⋅
x
≡
x
(
m
o
d
q
)
{x^{ab}} = {x^{k\varphi (N) + 1}} = {[{x^{q - 1}}]^{k(p - 1)}} \cdot x \equiv x{\text{ }}(\bmod q)
xab=xkφ(N)+1=[xq−1]k(p−1)⋅x≡x (modq)
那么可知
x
a
b
=
t
q
+
x
⇒
(
m
p
)
a
b
=
t
q
+
m
p
{x^{ab}} = tq + x \Rightarrow {(mp)^{ab}} = tq + mp
xab=tq+x⇒(mp)ab=tq+mp
p
∣
(
m
p
)
a
b
⇒
p
∣
(
t
q
+
m
p
)
⇒
p
∣
t
q
⇒
p
∣
t
p|{(mp)^{ab}} \Rightarrow p|(tq + mp) \Rightarrow p|tq \Rightarrow p|t
p∣(mp)ab⇒p∣(tq+mp)⇒p∣tq⇒p∣t
令
t
=
t
0
p
t = {t_0}p
t=t0p,则
x
a
b
=
(
m
p
)
a
b
=
t
0
p
q
+
m
p
=
t
0
p
q
+
x
=
t
0
N
+
x
{x^{ab}} = {(mp)^{ab}} = {t_0}pq + mp = {t_0}pq + x={t_0}N + x
xab=(mp)ab=t0pq+mp=t0pq+x=t0N+x
即
x
a
b
≡
x
(
m
o
d
N
)
{x^{ab}} \equiv x{\text{ }}(\bmod N)
xab≡x (modN)
从而得证。
RSA加密算法的安全性主要是依赖于大整数 N N N分解为大质数 p p p和 q q q的难度巨大,因为想从公开的 N N N和 a a a得到私钥 b b b,分解 N N N是唯一的办法,但是实际中 N N N通常是1024位或者2048位的大数,几乎是不可能分解的。
从对RSA加密算法的介绍中可以看出,在加密解密过程中主要涉及到了幂模运算 A B m o d N {A^B}\bmod N ABmodN,通过快速幂或者矩阵快速幂算法,我们可以将其转化为 ⌈ log 2 B ⌉ \left\lceil {{{\log }_2}B} \right\rceil ⌈log2B⌉次模乘运算 A ∗ C m o d N A*C \mod N A∗CmodN得到结果。
一般地,快速地求解模乘运算
A
∗
B
m
o
d
N
A*B \mod N
A∗BmodN便是蒙哥马利模乘要解决的问题。
(未完待续)