白话RSA公私钥加密算法

介绍

RSA加密算法是互联网时代加密通信的重要保障机制,可以说,如果没有RSA加密算法就没有现在互联网的繁荣。RSA的特别之处在于它是第一个大规模使用的非对称加密算法。

1976年以前,所有的加密方法都使用对称加密算法。对称加密算法的安全性依赖于加密方法和加密密钥。在影视剧里经常能够看到的加密电报啊,密码本啊,这些实质上都是采用对称加密的手段,也在一定程度上反应了对称加密的特点。对于对称加密来说,加密方法和加密密钥要通信双方均知晓,一旦密钥泄露,双方的通信将无秘密可言。

1976年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不传递密钥的情况下,完成解密。这被称为 Diffie-Hellman密钥交换算法。假如甲要和乙通讯,甲使用公钥加密,将密文传递给乙,乙使用私钥解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使窃听者知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,实现了非对称加密。算法用他们三个人的名字命名,就叫做 RSA 算法。

公私钥与数学难题

非对称加密算法的核心是公私钥,关键点有两个:

  1. 数学难题:通过私钥可以快速得到公钥,通过公钥很难得到私钥(注意是很难,而不是不可能);
  2. 加解密算法:公钥加密过的数据可以通过私钥快速解密。

数学难题

对于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 xy(modn)
这个的数学表达式的意思是整数 x x x和整数 y y y在被整数 n n n除的时候有相同的余数。例如17和32被5除的时候余数都是2:
17 ≡ 32 ( m o d 5 ) 17≡32 \pmod 5 1732(mod5)

为了能够实现加密解密功能,RSA算法结合了上文提到的数学难题设计了一套机制,下面将详细介绍这个机制:

公私钥生成步骤:
  1. 选择两个大质数 P P P Q Q Q。假设这里选择 P = 53 , Q = 61 P=53, Q=61 P=53,Q=61
  2. 计算 P P P Q Q Q的乘积 n n n: n = 53 ∗ 61 = 3233 n=53*61=3233 n=5361=3233
  3. 计算欧拉数 m m m: m = ( P − 1 ) ( Q − 1 ) = 3120 m=(P-1)(Q-1)=3120 m=(P1)(Q1)=3120
  4. 随机选一个整数与 m m m互质的整数 e e e,且满足 1 < e < φ ( n ) 1< e < φ(n) 1<e<φ(n),这里取 e = 17 e=17 e=17
  5. 找到另一个整数 d d d,使之满足 e ∗ d ≡ 1 ( m o d m ) e*d ≡1 \pmod m ed1(modm)代入 e e e m m m的值,将问题转换为求满足下面方程的 17 d − 3120 y = 1 17d-3120y=1 17d3120y=1一组整数解。找到这组解的方法很多,可以验证, d = 2753 , y = 15 d=2753,y=15 d=2753,y=15是方程的一组解。
  6. 至此,我们得到两个新的整数 e e e d d d。在RSA加密算法中,公钥由两个数字即 ( n , e ) (n,e) (n,e)组成,私钥由其他数字,即 ( P , Q , m , n , d ) (P,Q,m,n,d) (P,Q,m,n,d)组成,加密过程会用到 e e e,解密过程主要用到 d d d
加密方法:

得到公私钥之后,我们看一下是怎么样用公私钥实现公钥加密、私钥解密这个流程的。要对一段信息进行加密,第一步是要对信息进行编码,所谓编码方式有很多种,把字符串转成ASCII码就是其中一种方式。编码之后的信息变成了数字,RSA算法实际上是对数字进行加密和解密的。

  1. 原文编码:如果要发送字符a,a的ASCII码是97,可以视为要发送的原文为97;
  2. 公钥加密:用下面的式子计算出密文: a e ≡ c ( m o d n ) a^e≡c \pmod n aec(modn)其中 a a a是原文, c c c是密文, ( n , e ) (n,e) (n,e)是上文提到的公钥。具体的演算结果如下: 9 7 17 ≡ 1421 ( m o d 3233 ) 97 ^{17} ≡ {1421} \pmod {3233} 97171421(mod3233)于是得到了密文1421
解密方法:

解密时,只需要私钥 ( n , d ) (n,d) (n,d)就可以解密密文 c c c算出原文 a a a,计算方法如下: c d ≡ a ( m o d n ) c^d ≡ {a}\pmod n cda(modn)具体演算结果如下: 142 1 2753 ≡ 97 ( m o d n ) 1421^{2753} ≡97 \pmod n 1421275397(modn) 这个计算看起来很难算,实际上可以使用同余定理快速地计算出来。后面的证明过程也会用到同余定理。

证明

下面,我们来证明,为什么用私钥解密,一定可以正确地得到 a a a。也就是证明下面这个式子:
c d ≡ a ( m o d n ) c^d ≡ a \pmod n cda(modn)
根据加密规则:
a e ≡ c ( m o d n ) a^e ≡ c \pmod n aec(modn)
于是,存在整数 k k k,使得:
c = a e − k n c = a^e - kn c=aekn
将c代入要我们要证明的那个解密规则:
( a e − k n ) d ≡ a ( m o d n ) (a^e - kn)d ≡ a \pmod n (aekn)da(modn)
它等同于求证:
a e d ≡ a ( m o d n ) a^{ed} ≡ a \pmod n aeda(modn)
由于:
e ∗ d ≡ 1 ( m o d m ) e*d ≡ 1 \pmod m ed1(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+1a(modn)
问题变为求证上面这个式子。接下来,分成两种情况证明这个式子。

(1) a a a n n n互质。

根据欧拉数论定理2,此时:

a m ≡ 1 ( m o d n ) a^m ≡ 1 \pmod n am1(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)ha1aa(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)Q11(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)Q1]h(P1)×kPkP(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(Q1)(P1)+1(kP)hm+1(kP)edkP(modQ)
进而得到:
( k P ) e d ≡ k P ( m o d Q ) (kP)^{ed} ≡ kP \pmod Q (kP)edkP(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=tPQ+kP
代入 a = k P , n = P Q a=kP,n=PQ a=kPn=PQ,有:
a e d = t ′ n + a a^{ed} = t'n+a aed=tn+a
即:
a e d ≡ a ( m o d n ) a^{ed} ≡ a \pmod n aeda(modn)
证毕。

通过证明,我们确认了,RSA公钥加密私钥解密是可以得到正确的信息原文的。

小结

RSA加密算法是目前为止应用最为广泛的公私钥加密算法。RSA的核心是利用了大整数质因数分解这一数学难题,选取两个大质数,隐藏了两个大质数的同时,把两个大质数的乘积公开。由于公开乘积之后很难反推两个大质数,利用这一特点,构造了可公开的公钥和私密的私钥。本文进一步说明了RSA算法是如何利用公钥和私钥的数学性质,实现了一套加密和解密的方法,并利用数学知识,逐步证明了加解密算法的正确性。


  1. 同余定理 ↩︎

  2. 欧拉数论定理 ↩︎

  3. 费马小定理 ↩︎

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值