RSA 算法介绍
- RSA 算法的安全性是建立在乘法不可逆或者大数因子很难分解的基础上。
- RSA 的推导和实现涉及到了’欧拉函数’和’费马定理’及’模反元素’的概念,有兴趣可以自行百度。
- RSA 算法是’统治世界’的最重要算法之一,而且从目前来看,RSA 也是 ‘HTTPS 体系中最重要的算法’,没有之一。
数学知识
- 互质关系
- 如果两个正整数,除了1之外,没有其它公因子,我们就称这两个数是’互质关系’。
- 比如: 11 和 30 没有除1之外的公因子,所以它们就是互质关系。这也说明,不是质数也可以构成互质关系。
- 如果一个正整数,它的因子除了1就是它本身,这个正整数就是’质数’。
- 欧拉函数:
- 任意给定一个正整数 n,请问在小于等于 n 的正整数之中,有多少个数与 n 构成’互质’关系?
- 计算这个值的方法就叫’欧拉函数’,以 φ(n) 表示。
- 例如: φ(8) ,在1到8之中,与8构成互质关系的是1、3、5、7,所以 φ(8) = 4.
RSA 的密钥生成步骤如下:
- 随机挑选两个不相等的质数 p 和 q,假设 p = 13, q = 19。
(实际应用中,这两个质数越大,就越难破解) - 计算 p 和 q 的乘积 n
- n = p * q = 13 * 19 = 247;
- n 的长度就是密钥长度。 247对应的二进制是 11110111,一共8位,所以这个密钥就是8位。
- 实际应用中,RSA密钥一般是1024位,重要场合则为2048位。
- 计算 n 的欧拉函数 φ(n)。
- φ(n) 表示与整数 n 互质数的个数。如果 n 等于两个质数的积,则φ(n) = (p-1)(q-1) 。
- φ(247) = (13-1)(19-1) = 216。
- 随机选择一个整数数 e,满足 1< e <φ(n) ,并且 e 与φ(n)互质,假设 e = 17。
(实际应用中,常常选择65537) - 计算 e 对于 φ(n) 的模反元素d
- 所谓『模反元素』就是指有一个整数d,可以使得 ed 被 φ(n)除的余数为1。
- ed = 1 (mod φ(n)) 等价于 ed - 1 = kφ(n)
- 于是,找到模反元素d,实质上就是对下面这个二元一次方程求解:
ex + φ(n)y = 1
已知 e = 17, φ(n) = 216,则 17x + 216y = 1
这个方程可以用『扩展欧几里得算法』求解,此处省略具体过程。总之,可以算出一组整数解为(x, y) = (89, -7),即 d = 89。
至此,所有计算完成。
- 将 n 和 e 封装成公钥,n 和 d 封装成私钥。
本例中: n = 247, e = 17, d = 89,所以公钥就是(247, 17), 私钥就是(247, 89)。
实际应用中,公钥和私钥数据都采用 ASN.1(Abstract Syntax Notation One 抽象语法标记) 格式表达。
RSA算法的可靠性
回顾上面的密钥生成步骤,一共出现了6个数字:
p、q、n、φ(n)、e、d
- 这6个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。
- 最关键的是d,因为 n 和 d 组成了私钥,一旦d泄露,就等于私钥泄露。
有无可能在已知 n 和 e 的情况下,推导出 d?
- ed ≡ 1 (mod φ(n))。只有知道e和φ(n),才能算出d。
- φ(n) = (p-1)(q-1)。只有知道p和q,才能算出φ(n)。
- n = pq。只有将n因数分解,才能算出p和q。
结论: 如果 n 可以被因数分解,d就是算出,也就意味着私钥被破解。 - 但是当 n 大到一定程度时(比如接近 2^2048),即使现在最快的 CPU 也无法进行这个因式分解,即无法知道 n 是由哪个数 p 和 q 乘出来的。
大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。 - 所以就算知道了公钥,整个加解密过程还是非常安全的。
维基百科这样写:
“对极大整数做因数分解的难度决定了RSA算法的可靠性。
换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。
今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。
只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。”
举例: 你没法对下面这个整数进行因数分解
12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413
等于
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
事实上,这大概是人类已经分解的最大整数(232个十进制位,768个二进制位)。
比它更大的因数分解,还没有被报道过,因此目前被破解的最长RSA密钥就是768位。
原文鏈接:http://www.jianshu.com/p/67bcb140d804
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。