赞
踩
RSA加密算法是互联网时代加密通信的重要保障机制,可以说,如果没有RSA加密算法就没有现在互联网的繁荣。RSA的特别之处在于它是第一个大规模使用的非对称加密算法。
1976年以前,所有的加密方法都使用对称加密算法。对称加密算法的安全性依赖于加密方法和加密密钥。在影视剧里经常能够看到的加密电报啊,密码本啊,这些实质上都是采用对称加密的手段,也在一定程度上反应了对称加密的特点。对于对称加密来说,加密方法和加密密钥要通信双方均知晓,一旦密钥泄露,双方的通信将无秘密可言。
1976年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不传递密钥的情况下,完成解密。这被称为 Diffie-Hellman密钥交换算法。假如甲要和乙通讯,甲使用公钥加密,将密文传递给乙,乙使用私钥解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使窃听者知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,实现了非对称加密。算法用他们三个人的名字命名,就叫做 RSA 算法。
非对称加密算法的核心是公私钥,关键点有两个:
对于RSA算法来说,这两个点是通过数学的手段解决的。由公钥得到私钥和由私钥得到公钥,本质上来说是一对可逆的数学运算过程,只不过由私钥到公钥速度特别快,由公钥到私钥的过程是一个数学难题,解起来速度特别慢。具体来说,这个数学难题就是大整数的因数分解。因数分解是小学课本上的内容,看起来并不难:
15
=
3
×
5
15 = 3 ×5
15=3×5
但RSA算法中的使用的是“大”因数分解。有多大呢:
155636650525476272250941107365543971170904375374199825050183061215085575698748177779829794849316278349669580362159425488788355290671291116946823104921932013896763421454854196218473729013170728591915926324599322112307117758336370235751933829985979125945769434182241117823508105680221418364473069765884012556827
155636650525476272250941107365543971170904375374199825050183061215085575698748177779829794849316278349669580362159425488788355290671291116946823104921932013896763421454854196218473729013170728591915926324599322112307117758336370235751933829985979125945769434182241117823508105680221418364473069765884012556827
155636650525476272250941107365543971170904375374199825050183061215085575698748177779829794849316278349669580362159425488788355290671291116946823104921932013896763421454854196218473729013170728591915926324599322112307117758336370235751933829985979125945769434182241117823508105680221418364473069765884012556827
这个数由309个十进制位,非常大,它可以分解为下面两个质数的乘积:
13223188034998814716196302313658299908358229697143665948221618271861899376663174211243354421841990950099170356969384006652532594194109709936855452796333339
13223188034998814716196302313658299908358229697143665948221618271861899376663174211243354421841990950099170356969384006652532594194109709936855452796333339
13223188034998814716196302313658299908358229697143665948221618271861899376663174211243354421841990950099170356969384006652532594194109709936855452796333339
11769979381185607031781990566116290591276458128854601747610834470534802268263724437752893308182297485915988968005876272702097766268819294157431422385921793
11769979381185607031781990566116290591276458128854601747610834470534802268263724437752893308182297485915988968005876272702097766268819294157431422385921793
11769979381185607031781990566116290591276458128854601747610834470534802268263724437752893308182297485915988968005876272702097766268819294157431422385921793
把第一个大整数分解为下面两个质数的乘积是很困难的,虽然不是不可能,但需要很长时间。但把下面两个质数做乘法,得到第一个大整数,是容易的,计算机可以很快算出来。从公私钥的概念上来说,第一个大整数就是公钥,可以对外公布,后两个质数就是私钥,只能保存在自己手里。(这里要说明一下,在RSA中,大整数只是公钥的一部分,为了实现加密功能,公钥还有其他的部分,后面讲详细说明。私钥同理。)
仅有这三个整数还不行,这三个整数仅仅解决了第一个问题,即构造了一个数学难题,还没有解决第二个问题,就是如何利用这个数学难题,来构造一个加密算法。目前为止,用到的数学知识都来自于小学课本,后面要介绍的加密算法,用到的知识虽然小学课本里没有,但一些这些知识也是局限于整数的加减乘除(数论的基本知识)。如果看过网上其他的文章,看完之后一头雾水看不懂数学符号的,建议先快速扫一遍同余定理1
。这里有一个符号很重要
x
≡
y
(
m
o
d
n
)
x≡y \pmod n
x≡y(modn)
这个的数学表达式的意思是整数
x
x
x和整数
y
y
y在被整数
n
n
n除的时候有相同的余数。例如17和32被5除的时候余数都是2:
17
≡
32
(
m
o
d
5
)
17≡32 \pmod 5
17≡32(mod5)
为了能够实现加密解密功能,RSA算法结合了上文提到的数学难题设计了一套机制,下面将详细介绍这个机制:
得到公私钥之后,我们看一下是怎么样用公私钥实现公钥加密、私钥解密这个流程的。要对一段信息进行加密,第一步是要对信息进行编码,所谓编码方式有很多种,把字符串转成ASCII码就是其中一种方式。编码之后的信息变成了数字,RSA算法实际上是对数字进行加密和解密的。
解密时,只需要私钥 ( n , d ) (n,d) (n,d)就可以解密密文 c c c算出原文 a a a,计算方法如下: c d ≡ a ( m o d n ) c^d ≡ {a}\pmod n cd≡a(modn)具体演算结果如下: 142 1 2753 ≡ 97 ( m o d n ) 1421^{2753} ≡97 \pmod n 14212753≡97(modn) 这个计算看起来很难算,实际上可以使用同余定理快速地计算出来。后面的证明过程也会用到同余定理。
下面,我们来证明,为什么用私钥解密,一定可以正确地得到
a
a
a。也就是证明下面这个式子:
c
d
≡
a
(
m
o
d
n
)
c^d ≡ a \pmod n
cd≡a(modn)
根据加密规则:
a
e
≡
c
(
m
o
d
n
)
a^e ≡ c \pmod n
ae≡c(modn)
于是,存在整数
k
k
k,使得:
c
=
a
e
−
k
n
c = a^e - kn
c=ae−kn
将c代入要我们要证明的那个解密规则:
(
a
e
−
k
n
)
d
≡
a
(
m
o
d
n
)
(a^e - kn)d ≡ a \pmod n
(ae−kn)d≡a(modn)
它等同于求证:
a
e
d
≡
a
(
m
o
d
n
)
a^{ed} ≡ a \pmod n
aed≡a(modn)
由于:
e
∗
d
≡
1
(
m
o
d
m
)
e*d ≡ 1 \pmod m
e∗d≡1(modm)
其中
m
m
m是欧拉数(这个式子是上文公私钥生成的条件),所以存在整数
h
h
h使:
e
d
=
h
m
+
1
ed = hm+1
ed=hm+1
将
e
d
ed
ed代入:
a
h
m
+
1
≡
a
(
m
o
d
n
)
a^{hm+1} ≡ a \pmod n
ahm+1≡a(modn)
问题变为求证上面这个式子。接下来,分成两种情况证明这个式子。
(1) a a a与 n n n互质。
根据欧拉数论定理2,此时:
a m ≡ 1 ( m o d n ) a^m ≡ 1 \pmod n am≡1(modn)
代入,得到:
a h m + 1 ≡ ( a m ) h ∗ a ≡ 1 ∗ a ≡ a ( m o d n ) a^{hm+1} ≡ (a^m)^h*a≡1*a ≡a \pmod n ahm+1≡(am)h∗a≡1∗a≡a(modn)
原式得到证明。
(2)
a
a
a与
n
n
n不互质。
此时,由于
n
n
n等于质数
P
P
P和
Q
Q
Q的乘积,
a
a
a与
n
n
n又不互质,所以
a
a
a必然等于
k
P
kP
kP或
k
Q
kQ
kQ。
令
a
=
k
P
a = kP
a=kP,考虑到这时
k
k
k与
Q
Q
Q必然互质,则根据费马小定理3,下面的式子成立:
(
k
P
)
Q
−
1
≡
1
(
m
o
d
Q
)
(kP)^{Q-1} ≡ 1 \pmod Q
(kP)Q−1≡1(modQ)
因为上式,可以构造下面的式子:
[
(
k
P
)
Q
−
1
]
h
(
P
−
1
)
×
k
P
≡
k
P
(
m
o
d
Q
)
[(kP)^{Q-1}]^{h(P-1)} × kP ≡ kP \pmod Q
[(kP)Q−1]h(P−1)×kP≡kP(modQ)
即:
(
k
P
)
h
(
Q
−
1
)
(
P
−
1
)
+
1
≡
(
k
P
)
h
m
+
1
≡
(
k
P
)
e
d
≡
k
P
(
m
o
d
Q
)
(kP)^{h(Q-1)(P-1)+1}≡(kP)^{hm+1}≡(kP)^{ed} ≡ kP \pmod Q
(kP)h(Q−1)(P−1)+1≡(kP)hm+1≡(kP)ed≡kP(modQ)
进而得到:
(
k
P
)
e
d
≡
k
P
(
m
o
d
Q
)
(kP)^{ed} ≡ kP \pmod Q
(kP)ed≡kP(modQ)
由于
k
P
kP
kP是余数,所以存在整数
t
t
t,使:
(
k
P
)
e
d
=
t
Q
+
k
P
(kP)^{ed} = tQ+kP
(kP)ed=tQ+kP
因为
k
,
P
,
Q
,
t
,
e
,
d
k,P,Q,t,e,d
k,P,Q,t,e,d均是整数,所以
t
t
t能被
P
P
P整除,所以存在整数
t
′
t'
t′使得:
(
k
P
)
e
d
=
t
′
P
Q
+
k
P
(kP)^{ed} = t'PQ+kP
(kP)ed=t′PQ+kP
代入
a
=
k
P
,
n
=
P
Q
a=kP,n=PQ
a=kP,n=PQ,有:
a
e
d
=
t
′
n
+
a
a^{ed} = t'n+a
aed=t′n+a
即:
a
e
d
≡
a
(
m
o
d
n
)
a^{ed} ≡ a \pmod n
aed≡a(modn)
证毕。
通过证明,我们确认了,RSA公钥加密私钥解密是可以得到正确的信息原文的。
RSA加密算法是目前为止应用最为广泛的公私钥加密算法。RSA的核心是利用了大整数质因数分解这一数学难题,选取两个大质数,隐藏了两个大质数的同时,把两个大质数的乘积公开。由于公开乘积之后很难反推两个大质数,利用这一特点,构造了可公开的公钥和私密的私钥。本文进一步说明了RSA算法是如何利用公钥和私钥的数学性质,实现了一套加密和解密的方法,并利用数学知识,逐步证明了加解密算法的正确性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。