对数学一直很感兴趣,而数论又被称为数学的皇冠,之前一直被冠以纯粹的无用的数学。结果计算机的发展,让数论大放异彩。这里记录一个现在通用的公钥秘钥协议,即RSA协议(由其发现者,三位密码学家Rivest、Shamir、Adleman的首字母缩写命名),祥记一下这个算法的具体内容,对于内容中的东西都证明一番。还是那句话 教会别人,才证明自己真正明白 。捎带感叹一下数学的伟大。
密码发展史
毕竟是个密码学方法,而且还是革命性的。想要详细介绍它以下,那么密码学的发展史就不得不提一下了。
据说人类使用密码的历史,跟人类使用文字的历史一样长。看来秘密确实是人类的刚需呀,为了保守秘密,在传播的过程中为了保住秘密,也是煞费苦心了。尤其是伴随着战争,政治阴谋等,有些事情就得防着敌人。
1976年算是古典密码学与现代密码学的分界线,这一年提出了公钥密码,从此密码学也进入了新时代。在这之前,密码学一直是单纯私钥性质的,即明文使用私钥编成密文,密文也通过私钥转为明文。这个时候私钥就很重要,通过私钥可以建立明文到密文的一一映射,私钥也是解密的关键,如果不小心被窃取,那么密文也就相当于明文一样展露在别人面前了。
公钥体系是什么呢?公钥体系说的是将明文通过公钥加密,这个公钥是可以公开的,敌人知道也无所谓。有公钥是没办法解密明文的,需要私钥才能真正明文。这样需要分享秘密的两个人,就不需要分享私钥,以致在分享的过程中被窃取私钥了。(一般来讲,通过这个体系编码的密码很难被破解,如果你跟你兄弟用这个体系编译密文,原则上讲,根本不会被你老婆发现,你跟你兄弟什么时候去网吧打游戏。)
接下来要说的一个算法,就是最开始的公钥秘钥方法。方法很简单,用的都是数论知识。但是原则上来讲,用经典计算机都不能破解。
符号语言
为了记录方便,先说明一下接下来要用到的符号语言。
- g c d ( a , b ) gcd(a, b) gcd(a,b),指a和b的最大公约数。
- a ≡ b ( m o d m ) a\equiv b (mod\ m) a≡b(mod m),指a除以m余b。
RSA 算法
费马小定理
数论相关的事儿,貌似都要从费马这位业余数学之王(他真的只是业余搞数学,人家主业是律师)开始说起。
费马小定理是关于素数的定义。定理内容如下
p p p是个素数, g c d ( a , p ) = 1 gcd(a, p)=1 gcd(a,p)=1,则 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1(mod\quad p) ap−1≡1(modp)。
嗯,数学定理就是这么言简意赅。这个定理很厉害呀,接下来要说的RSA基本就是基于这个定理的。这个定理证明也不复杂:
不是一般性,我们讨论
a
<
p
a<p
a<p(取模的情况下,所有大于的都会映射会小于的范围)。对于素数
p
p
p,他的余数为
{
1
,
2
,
.
.
.
,
p
−
1
}
\{1, 2, ..., p-1\}
{1,2,...,p−1}这个集合,而且这个集合有个特点,其中每个数都满足以下条件
g
c
d
(
a
,
p
)
=
1
,
∀
a
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
gcd(a, p)=1, \forall a\in \{1, 2, ..., p-1\}
gcd(a,p)=1,∀a∈{1,2,...,p−1}
即每个数都与p互质(素数的优良性质)。对于集合
{
1
,
2
,
.
.
.
,
p
−
1
}
\{1, 2, ..., p-1\}
{1,2,...,p−1}来说,也有一个特别好的性质,
a
∗
{
1
,
2
,
.
.
.
,
p
−
1
}
(
m
o
d
p
)
=
{
1
,
2
,
.
.
.
,
p
−
1
}
,
∀
a
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
a*\{1, 2, ..., p-1\} (mod\ p) = \{1, 2, ..., p-1\}, \forall a\in \{1, 2, ..., p-1\}
a∗{1,2,...,p−1}(mod p)={1,2,...,p−1},∀a∈{1,2,...,p−1}
即a乘以集合
{
1
,
2
,
.
.
.
,
p
−
1
}
\{1, 2, ..., p-1\}
{1,2,...,p−1}中的元素,对p取模构成的集合,等于原来的集合。这个性质很好证明,需要两步,一是证明
a
∗
α
(
m
o
d
p
)
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
,
∀
α
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
a*\alpha(mod\ p)\in\{1, 2, ..., p-1\}, \forall \alpha\in\{1, 2, ..., p-1\}
a∗α(mod p)∈{1,2,...,p−1},∀α∈{1,2,...,p−1},二是证明
a
∗
α
≠
a
∗
β
(
m
o
d
p
)
,
∀
α
!
=
β
,
α
,
β
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
a*\alpha \ne a*\beta(mod\ p), \forall \alpha !=\beta, \alpha,\beta\in\{1, 2, ..., p-1\}
a∗α=a∗β(mod p),∀α!=β,α,β∈{1,2,...,p−1}。这两条性质都很好证明,理解起来其实都不用公式。我们本着严谨的态度,用公式语言证明一下。首先证明一:
∵
g
c
d
(
a
,
p
)
=
1
,
g
c
d
(
α
,
p
)
=
1
d
e
f
i
n
e
θ
=
a
∗
α
(
m
o
d
p
)
∴
g
c
d
(
θ
,
p
)
=
1
,
θ
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
\begin{aligned} &\because gcd(a, p)=1, gcd(\alpha, p)=1\\ &define\ \ \theta=a*\alpha(mod\ p)\\ &\therefore gcd(\theta, p)=1, \theta\in\{1, 2, ..., p-1\} \end{aligned}
∵gcd(a,p)=1,gcd(α,p)=1define θ=a∗α(mod p)∴gcd(θ,p)=1,θ∈{1,2,...,p−1}
其次采用反证法证明二:
l
e
t
α
,
β
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
,
α
!
=
β
a
n
d
a
∗
α
=
a
∗
β
(
m
o
d
p
)
∴
a
∗
(
α
−
β
)
=
n
∗
p
,
n
∈
N
∵
g
c
d
(
a
,
p
)
=
1
∴
(
α
−
β
)
=
n
′
∗
p
,
n
′
∈
N
∵
α
,
β
∈
{
1
,
2
,
.
.
.
,
p
−
1
}
∴
(
α
−
β
)
∈
(
−
p
+
2
,
p
−
2
)
∴
(
α
−
β
)
=
0
c
o
n
f
l
i
c
t
!
s
o
t
h
e
r
e
s
u
l
t
s
h
o
u
l
d
b
e
a
∗
α
≠
a
∗
β
(
m
o
d
p
)
\begin{aligned} &let\ \alpha, \beta\in\{1, 2, ..., p-1\}, \alpha!=\beta\\ &and \ a*\alpha=a*\beta(mod\ p)\\ &\therefore a*(\alpha-\beta)=n*p, n\in N\\ &\because gcd(a, p)=1\\ &\therefore (\alpha-\beta)=n^\prime*p, n^\prime\in N\\ &\because \alpha, \beta\in\{1, 2, ..., p-1\}\\ &\therefore (\alpha-\beta)\in(-p+2, p-2)\\ &\therefore (\alpha-\beta)=0\\ &conflict!\ so\ the\ result\ should\ be\\ &a*\alpha\ne a*\beta(mod\ p) \end{aligned}
let α,β∈{1,2,...,p−1},α!=βand a∗α=a∗β(mod p)∴a∗(α−β)=n∗p,n∈N∵gcd(a,p)=1∴(α−β)=n′∗p,n′∈N∵α,β∈{1,2,...,p−1}∴(α−β)∈(−p+2,p−2)∴(α−β)=0conflict! so the result should bea∗α=a∗β(mod p)
由以上证明的两条,我们可以推算出,这两个集合数量相等,而且乘积集合
a
∗
{
1
,
2
,
.
.
.
,
p
−
1
}
a*\{1, 2, ..., p-1\}
a∗{1,2,...,p−1}中的元素都在余数集合中,那么这两个集合相等。如何,我们将两个集合中的元素都相乘,得到的乘积再取余的时候都是相等的,即
a
p
−
1
∗
(
p
−
1
)
!
=
(
p
−
1
)
!
(
m
o
d
p
)
⇒
a
p
−
1
=
1
(
m
o
d
p
)
\begin{aligned} &a^{p-1}*(p-1)!=(p-1)!(mod\ p)\\ &\Rightarrow\ \ a^{p-1}=1(mod\ p) \end{aligned}
ap−1∗(p−1)!=(p−1)!(mod p)⇒ ap−1=1(mod p)
如此,费马小定理证完。啊,为啥叫费马小定理,应该是为了区分大名鼎鼎的费马大定理!
欧拉定理
欧拉定理太多,这个是数论里面的欧拉定理。欧拉定理是费马小定理的推广,费马小定理是欧拉定理的特例。欧拉定理说的是
a
ϕ
(
n
)
=
1
(
m
o
d
n
)
,
∀
n
∈
N
,
g
c
d
(
a
,
n
)
=
1
a^{\phi(n)} = 1(mod\ n), \forall n\in \mathbb{N}, gcd(a, n)=1
aϕ(n)=1(mod n),∀n∈N,gcd(a,n)=1
式中
ϕ
(
n
)
\phi(n)
ϕ(n)是欧拉函数,在整数
n
n
n的余数集合中,与
n
n
n互质数字的个数。证明方法其实和上面费马小定理的证明过程一样,在整数
n
n
n的余数集合中,选取与其互质的数组成的集合,也会构成一个群,这个群也具有与上面将的哪个群共同的性质,因此也可以直接推导出这个欧拉公式。大概推导思路是这个样子的,本着严谨科学驱逐读者的态度(每增加一个公式要少一半读者),我们再来推导一下。
记正整数
n
n
n的余数集合
{
1
,
2
,
.
.
.
,
n
−
1
}
\{1, 2, ..., n-1\}
{1,2,...,n−1}中,与
n
n
n互质的数组成的集合为
G
G
G,同样的方式我们可以证明,对于集合
G
G
G,有
a
∗
G
=
G
,
∀
a
∈
G
a*G=G, \forall a\in G
a∗G=G,∀a∈G
有趣的是,只有在余数集合中的互质元素组成的集合才有这样的性质,如果不互质,就不具有了。例如对于6的余数集合
{
1
,
2
,
3
,
4
,
5
}
\{1, 2, 3, 4, 5\}
{1,2,3,4,5},对于元素2,有
2
∗
{
1
,
2
,
3
,
4
,
5
}
=
{
0
,
2
,
4
}
2*\{1, 2, 3, 4, 5\}=\{0, 2, 4\}
2∗{1,2,3,4,5}={0,2,4}。
由以上性质,可以继续推导,两个集合里面的数分别乘积,即可得到
a
ϕ
(
n
)
=
1
(
m
o
d
n
)
,
∀
n
∈
N
a^{\phi(n)}=1(mod\ n), \forall n\in \mathbb{N}
aϕ(n)=1(mod n),∀n∈N
欧拉公式
ϕ
(
n
)
\phi(n)
ϕ(n)是有计算公式的,我们知道一个任意整数可以分解成它的质因数的形式
n
=
∏
p
i
n
i
n = \prod p_i^{n_i}
n=∏pini
的形式,式中
p
i
p_i
pi是质数且
g
c
d
(
p
i
,
n
)
=
p
i
gcd(p_i, n)=p_i
gcd(pi,n)=pi。
中国同余定理与欧拉公式
我们知道质数 p p p的余数集合全部与 p p p互质,所以它的互质余数集合中有元素 p − 1 p-1 p−1个,即 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p−1,代入欧拉定理,即可得到费马小定理。
我们再将上面的例子推广考虑一个简单情况,
n
=
p
n
p
n=p^{n_p}
n=pnp,即正整数
n
n
n除却1和自身外,只有一个质数因子
p
p
p的情况。对于这种情况,我们可以人工数出来,在
n
n
n的余数集合中,有多少个是与它互质的。这个比较简单,因为
n
n
n就只含有一个素数因子,数一下
n
n
n的余数集合
{
1
,
2
,
3
,
.
.
.
,
n
−
1
}
\{1, 2, 3, ..., n-1\}
{1,2,3,...,n−1}中有几个包含
p
p
p这个素数因子即可。即看这些数中有
α
∗
p
\alpha*p
α∗p这样的结构。显然,这些数中有
{
1
∗
p
,
2
∗
p
,
3
∗
p
,
.
.
.
,
(
p
n
p
−
1
)
∗
p
}
\{1*p, 2*p, 3*p, ..., (p^{n_p}-1)*p\}
{1∗p,2∗p,3∗p,...,(pnp−1)∗p}。我们数一下,总共有
p
n
p
−
1
−
1
p^{n_p-1}-1
pnp−1−1个。这样,欧拉函数
ϕ
(
p
n
p
)
=
p
n
p
−
1
−
(
p
n
p
−
1
−
1
)
=
p
n
p
−
p
n
p
−
1
=
p
n
p
(
1
−
1
p
)
∀
p
,
w
h
e
r
e
p
i
s
a
p
r
i
m
e
.
\begin{aligned} \phi(p^{n_p}) &= p^{n_p}-1-(p^{n_p-1}-1)\\ &= p^{n_p}-p^{n_p-1}\\ &= p^{n_p}(1-\frac{1}{p})\\ \forall p, &\ where\ p\ is\ a\ prime. \end{aligned}
ϕ(pnp)∀p,=pnp−1−(pnp−1−1)=pnp−pnp−1=pnp(1−p1) where p is a prime.
既然这两种特殊情况下我们都可以求得欧拉函数,那么可不可以求得任意整数的欧拉函数呢?欧拉函数有一个很好的性质
ϕ
(
m
n
)
=
ϕ
(
m
)
ϕ
(
n
)
,
∀
m
,
n
,
w
h
e
r
e
g
c
d
(
m
,
n
)
=
1
\phi(mn) = \phi(m)\phi(n), \forall m, n,\ where\ gcd(m, n)=1
ϕ(mn)=ϕ(m)ϕ(n),∀m,n, where gcd(m,n)=1
证明我们需要借助中国同余定理,
c
o
n
d
i
t
i
o
n
a
≡
a
m
(
m
o
d
m
)
,
a
≡
a
n
(
m
o
d
n
)
l
e
t
m
−
1
m
≡
1
(
m
o
d
n
)
,
n
−
1
n
≡
1
(
m
o
d
m
)
,
w
h
e
r
e
m
−
1
,
n
−
1
∈
N
⇒
a
=
a
m
∗
n
n
−
1
+
a
n
∗
m
m
−
1
(
m
o
d
m
n
)
\begin{aligned} condition\ a\equiv a_m&(mod\ m), a\equiv a_n(mod\ n)\\ let\ m^{-1}m\equiv1(mod\ n),\ n^{-1}n&\equiv1(mod\ m), where\ m^{-1}, n^{-1}\in\mathbb{N}\\ \Rightarrow\ a=a_m*nn^{-1} &+a_n*mm^{-1}(mod\ mn) \end{aligned}
condition a≡amlet m−1m≡1(mod n), n−1n⇒ a=am∗nn−1(mod m),a≡an(mod n)≡1(mod m),where m−1,n−1∈N+an∗mm−1(mod mn)
这样,通过代入可以很容易的证明,a满足于两个条件。这个推导说明什么呢?说明对于对于两个互质的数,
m
,
n
m,n
m,n,对于他们的各自的余数
(
a
m
,
a
n
)
(a_m, a_n)
(am,an),可以构造唯一的数
a
a
a为
m
n
mn
mn这个乘积的余数。特别的,当
g
c
d
(
a
m
,
m
)
=
1
,
g
c
d
(
a
n
,
n
)
=
1
,
g
c
d
(
m
,
n
)
=
1
gcd(a_m, m)=1, gcd(a_n, n)=1, gcd(m,n)=1
gcd(am,m)=1,gcd(an,n)=1,gcd(m,n)=1,则可以推导出
g
c
d
(
a
n
,
m
)
=
1
,
g
c
d
(
a
m
,
n
)
=
1
,
g
c
d
(
a
,
m
n
)
=
1
gcd(a_n, m)=1, gcd(a_m, n)=1, gcd(a, mn)=1
gcd(an,m)=1,gcd(am,n)=1,gcd(a,mn)=1。由此也知,任意与
m
n
mn
mn互质的余数
a
a
a,肯定也与
m
,
n
m, n
m,n分别互质,可以求得它对应的
a
m
,
a
n
a_m, a_n
am,an,这也是一一对应的。所以可以得到一个重要结论,
m
n
mn
mn互质余数子集中元素,与
m
,
n
m, n
m,n分别的互质余数子集中的元素一一对应,即
m
n
mn
mn互质余数子集元素个数,等于
m
,
n
m, n
m,n分别的互质余数子集中的元素个数乘积相等,即
ϕ
(
m
n
)
=
ϕ
(
m
)
ϕ
(
n
)
,
∀
m
,
n
,
w
h
e
r
e
g
c
d
(
m
,
n
)
=
1
\phi(mn) = \phi(m)\phi(n), \forall m, n,\ where\ gcd(m, n)=1
ϕ(mn)=ϕ(m)ϕ(n),∀m,n, where gcd(m,n)=1
欧拉公式得证。如此,任意正整数
n
∈
N
n\in\mathbb{N}
n∈N都可以通过上面的两个式子得到其欧拉公式。具体表述如下:
N
=
∏
i
p
i
n
i
,
w
h
e
r
e
p
i
i
s
p
r
i
m
e
.
w
e
h
a
v
e
ϕ
(
N
)
=
∏
i
p
i
n
i
(
1
−
1
p
i
)
\begin{aligned} N = \prod_i p_i^{n_i}, where\ p_i\ is\ prime.\\ we\ have\ \phi(N) = \prod_ip^{n_i}_i(1-\frac{1}{p_i}) \end{aligned}
N=i∏pini,where pi is prime.we have ϕ(N)=i∏pini(1−pi1)
RSA算法
接下来要利用上面已经证明的几个公式,来做一个魔术,推导出这个目前原则上用经典计算机不能解开的密码协议算法。
回顾一下欧拉定理
a
ϕ
(
n
)
=
1
(
m
o
d
n
)
,
∀
n
∈
N
,
g
c
d
(
a
,
n
)
=
1
a^{\phi(n)} = 1(mod\ n), \forall n\in \mathbb{N}, gcd(a, n)=1
aϕ(n)=1(mod n),∀n∈N,gcd(a,n)=1
如果我们有两个大质数(一般是
2
500
2^{500}
2500左右)
p
,
q
,
g
c
d
(
p
,
q
)
=
1
p, q, gcd(p, q)=1
p,q,gcd(p,q)=1,我们计算
N
=
q
p
N=qp
N=qp,如此便得到另外一个大数
N
N
N,我们在计算下
M
=
(
p
−
1
)
(
a
−
1
)
M=(p-1)(a-1)
M=(p−1)(a−1),得到第四个大数
M
M
M,选取一个数
e
e
e,计算
e
d
≡
1
(
m
o
d
M
)
ed\equiv 1(mod\ M)
ed≡1(mod M),得到最后一个数
d
d
d。如此,准备完毕。我们把
(
e
,
N
)
(e, N)
(e,N),当做公钥,把
(
d
,
N
)
(d, N)
(d,N),当做私钥,其他都丢掉就可以了。下面说明一下公钥和私钥怎么使用。
经典的Bob, Alice通讯。如果Alice想给Bob发讯息,不想被Eve窃听到。那么Bob可以发布一个公钥
(
e
,
N
)
(e, N)
(e,N),私钥自己保留,谁也不告诉。Alice可以将自己要发给Bob的信息编码成二进制
M
M
M,然后通过运算得到密码
x
=
M
c
(
m
o
d
N
)
x=M^{c}(mod\ N)
x=Mc(mod N),再将
x
x
x发送给Bob。公钥是发布的,大家都知道,x也可以被Eve窃听,不过原则上Eve通过公钥不能解码x。而Bob收到讯息x后,可以通过只有自己知道的私钥很轻松的解出来
x
d
(
m
o
d
N
)
=
M
c
d
(
m
o
d
N
)
=
M
1
+
n
(
p
−
1
)
(
q
−
1
)
(
m
o
d
N
)
=
M
∗
M
(
p
−
1
)
(
q
−
1
)
(
m
o
d
N
)
=
M
∗
M
ϕ
(
N
)
(
m
o
d
N
)
=
M
\begin{aligned} x^{d}(mod\ N) &=M^{cd}(mod\ N)\\ &=M^{1+n(p-1)(q-1)}(mod\ N)\\ &=M*M^{(p-1)(q-1)}(mod\ N)\\ &=M*M^{\phi(N)}(mod\ N)\\ &=M \end{aligned}
xd(mod N)=Mcd(mod N)=M1+n(p−1)(q−1)(mod N)=M∗M(p−1)(q−1)(mod N)=M∗Mϕ(N)(mod N)=M
至于为啥原则上不能通过公钥解密x,这个就需要说明下质数的密度问题了,这个就太专业还没涉猎,以后弄懂可能回来写下吧。总之结论就是,以目前的经典算法,这个问题是个np的,不能通过经典计算机来破解这个密码。至于量子计算机里面的舒尔算法,有时间更新下,这个更加有意思了,可以进一步了解下量子计算相关的内容,惊叹一下量子世界与经典世界的差异。