RSA 算法

RSA 算法介绍
  • RSA 算法的安全性是建立在乘法不可逆或者大数因子很难分解的基础上。
  • RSA 的推导和实现涉及到了’欧拉函数’和’费马定理’及’模反元素’的概念,有兴趣可以自行百度。
  • RSA 算法是’统治世界’的最重要算法之一,而且从目前来看,RSA 也是 ‘HTTPS 体系中最重要的算法’,没有之一。
数学知识
  1. 互质关系
    • 如果两个正整数,除了1之外,没有其它公因子,我们就称这两个数是’互质关系’。
    • 比如: 11 和 30 没有除1之外的公因子,所以它们就是互质关系。这也说明,不是质数也可以构成互质关系。
    • 如果一个正整数,它的因子除了1就是它本身,这个正整数就是’质数’。
  2. 欧拉函数:
    • 任意给定一个正整数 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
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值