RSA算法

算法简介

1976年以前,所有的加密方法都是对称加密算法。这种算法加密和解密使用的是同一个密钥。这种模式密钥的传递很不安全。

1977年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种新的构思,可以在不传递密钥的情况下,完成解密。这被称为 Diffie-Hellman 密钥交换算法。这个构思引出了后来的非对称加密模式。

8e532e24d152a59efc7492e033e74c47.png

1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。算法用他们三个人名字命名,叫RSA算法。直到现在,依旧目前最广泛使用的非对称加密算法。
12e42a5376ea5c0af9ac6a8dc20a068d.png

算法所需知识

互质关系

如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系.

关于互质可以得到以下结论:

  • 任意两个制数构成互质关系,比如13和61.
  • 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,如3和10。
  • 如果两个数中,较大的那个数是质数,则两者构成互质关系,如97和57。
  • 1和任意一个自然数都是互质关系,如1和99。
  • p是大于1的整数,则p和p-1构成互质关系,如57和56。
  • p是大于1的奇数,则p和p-2构成互质关系,如17和15。

欧拉函数

请思考以下问题:

任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)

计算这个值的方法就是欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。

对于φ(n)的计算有如下方式:

  • 当n=1时,则φ(1) = 1.因为1与任何数(包括自身)都构成互质关系。
  • 当n是质数,则φ(n) = n-1。因为质数与小于它的每一个数,都构成互质关系。如5与1、2、3、4都构成互质关系。
  • 如果n是质数的某一次方,即n = p^k(p为质数,k为大于等于1的整数).则$\phi(p^k) = p^k-p^{k-1}$

比如φ(8) = φ(2^3) = 2^3 - 2^2 = 8-4 = 4.
这是因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共有p^(k-1)个,即1×p、2×p、3×p、…、p^(k-1)×p,把它们去除,剩下的就是与n互质的数。
上面的式子还可以写成下面的形式:

可以看出,上面第二条是k=1时的特例。

  • 如果n可以分解成两个互质的整数之积,n = p1 × p2,则φ(n) = φ(p1p2) = φ(p1)φ(p2) 即积的欧拉函数等于各个因子的欧拉函数之积。
  • 因为任意一共大于1的正整数,都可以写成一系列质数的积。`

根据第四点得到:

再根据第三点结论得到:

也就等于:

这就是欧拉函数的通用计算公式。

欧拉定理

欧拉函数的用处,在于欧拉定理)。欧拉定理指,

如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:

也就是说,a的φ(n)次方被n除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。比如,3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。

欧拉定理有一个特殊的情况。

假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成

这就是著名的费马小定理。它是欧拉定理的特例。

模反元素

如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。

欧拉定理可以用来证明模反元素必然存在。

可以看到,a的 φ(n)-1 次方,就是a的模反元素。

算法详解

假设爱丽丝和鲍勃进行加密通信,怎么生成公钥和私钥呢?
61a50ac1a0ee63f955b48ce00e97fa86.png

密钥生成

1.随机选择两个不想等的质数p和q

爱丽丝选择了61和53.(实际应用中,这两个质数越大,就越难破解)。

2.计算p和q的乘积n

爱丽丝把61和53相乘。
n = 61×53 = 3233

n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

3.计算n的欧拉函数φ(n)

根据公式:φ(n) = (p-1)(q-1)
算出 φ(3233) 为 3120.

4.随机选择一个整数e,条件是1<e<φ(n),且e与φ(n)互质

爱丽丝就在1到3120之间,随机选择了17。(实际应用中,常常选择65537。)

5.计算e对于φ(n)的模反元素d

所谓”模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。

ed ≡ 1 (mod φ(n)),

这个式子等价于

ed - 1 = kφ(n)

于是,找到模反元素d,实质上就是对下面这个二元一次方程求解

ex + φ(n)y = 1
爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。

至此所有计算完成。

讲n和e封装成公钥,n和d封装成私钥

在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。

实际应用中,公钥和私钥的数据都采用ASN.1格式表达(实例)。

加密和解密

用公钥加密

假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。

可以得到以下式子c:

用私钥解密

爱丽丝拿到鲍勃发来的密文以后,就用自己的私钥(n,d)进行解密。可以证明,下面的等式一定成立:

本文参考:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html