总括: 本文详细讲述了RSA算法详解,包括内部使用数学原理以及产生的过程。php
相濡以沫。到底须要爱淡如水。前端
以前写过一篇文章SSL协议之数据加密过程,里面详细讲述了数据加密的过程以及须要的算法。SSL协议很巧妙的利用对称加密和非对称加密两种算法来对数据进行加密。这篇文章主要是针对一种最多见的非对称加密算法——RSA算法进行讲解。其实也就是对私钥和公钥产生的一种方式进行描述。首先先来了解下这个算法的历史:算法
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一块儿提出的。当时他们三人都在麻省理工学院工做。RSA就是他们三人姓氏开头字母拼在一块儿组成的。安全
但实际上,在1973年,在英国政府通信总部工做的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。函数
因此谁是RSA算法的发明人呢?很差说,就好像贝尔并非第一个发明电话的人但你们都记住的是贝尔同样,这个地方咱们做为旁观者倒不用较真,重要的是这个算法的内容:加密
RSA算法用到的数学知识特别多,因此在中间介绍这个算法生成私钥和公钥的过程当中会穿插一些数学知识。生成步骤以下:blog
随意选择两个大的质数p和q,p不等于q,计算N=p*q;ip
什么是质数?我想可能会有一部分人已经忘记了,定义以下:get
除了1和该数自身外,没法被其余天然数整除的数(也可定义为只有1该数自己两个正因数]的数)。
好比2,3,5,7这些都是质数,9就不是了,由于3*3=9了博客
r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。
这里的数学概念就是什么是欧拉函数了,什么是欧拉函数呢?
欧拉函数的定义:
欧拉函数 φ(n)是小于或等于 n的正整数中与 n互质的数的数目。
互质的定义:
若是两个或两个以上的整数的最大公约数是 1,则称它们为 互质
例如:φ(8) = 4,由于1,3,5,7均和8互质。
推导欧拉函数:
(1)若是n = 1, φ(1) = 1;(小于等于1的正整数中惟一和1互质的数就是1自己);
(2)若是n为质数,φ(n) = n - 1;由于质数和每个比它小的数字都互质。好比5,比它小的正整数1,2,3,4都和他互质;
(3) 若是n是a的k次幂,则 φ(n) = φ(a^k) = a^k - a^(k-1) = (a-1)a^(k-1);
(4) 若m,n互质,则φ(mn) = φ(m)φ(n)
证实:设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理(常常看数学典故的童鞋应该了解,剩余定理又叫韩信点兵,也叫孙子定理),A*B和C可创建双射一一对应)的关系。(或者也能够从初等代数角度给出欧拉函数积性的简单证实) 所以的φ(n)值使用算术基本定理便知。(来自维基百科)
选择一个小于r并与r互质的整数e,求得e关于r的模反元素,命名为d(ed = 1(mod r)模反元素存在,当且仅当e与r互质),e咱们一般取65537。
模反元素:
若是两个正整数a和n互质,那么必定能够找到整数 b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
好比3和5互质,3关于5的模反元素就多是2,由于3*2-1=5能够被5整除。因此很明显模反元素不止一个,2加减5的整数倍都是3关于5的模反元素{...-3, 2,7,12…} 放在公式里就是3*2 = 1 (mod 5)
上面所提到的欧拉函数用处实际上在于欧拉定理:
欧拉定理:
若是两个正整数 a和 n互质,则 n的欧拉函数 φ(n) 可让下面的等式成立:a^φ(n) = 1(mod n)
由此可得:a的φ(n - 1)次方确定是a关于n的模反元素。
欧拉定理就能够用来证实模反元素必然存在。
由模反元素的定义和欧拉定理咱们知道,a的φ(n)次方减去1,能够被n整除。好比,3和5互质,而5的欧拉函数φ(5)等于4,因此3的4次方(81)减去1,能够被5整除(80/5=16)。
小费马定理:
假设正整数a与质数p互质,由于质数p的 φ(p)等于 p-1,则欧拉定理能够写成a^(p-1) = 1 (mod p)
这实际上是欧拉定理的一个特例。
此时咱们的(N , e)是公钥,(N, d)为私钥,爱丽丝会把公钥(N, e)传给鲍勃,而后将(N, d)本身藏起来。一对公钥和私钥就产生了,而后具体的使用方法呢?请看:SSL协议之数据加密过程详解
咱们知道像RSA这种非对称加密算法很安全,那么到底为啥子安全呢?
咱们来看看上面这几个过程产生的几个数字:
N和e咱们都会公开使用,最为重要的就是私钥中的d,d一旦泄露,加密也就失去了意义。那么获得d的过程是如何的呢?以下:
因此得出了在上篇博客说到的结论,非对称加密的原理:
将a和b相乘得出乘积c很容易,但要是想要经过乘积c推导出a和b极难。即对一个大数进行因式分解极难
目前公开破译的位数是768位,实际使用通常是1024位或是2048位,因此理论上特别的安全。
RSA算法的核心就是欧拉定理,根据它咱们才能获得私钥,从而保证整个通讯的安全。