https://blog.csdn.net/linuxandroidwince/article/details/81141815
http://bank.hexun.com/2009-06-24/118958531.html
https://baike.baidu.com/item/RSA%E7%AE%97%E6%B3%95/263310?fr=aladdin
Ron Rivest, Adi Shamir, Leonard Adleman.
RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。
RSA的安全基于大数分解的难度。其公钥和私钥是一对大质数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大质数之积(这是公认的数学难题)。
RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:
这个很重要,所以标题放在前面。
考虑到对整体的理解,或者你数学很好根本不需要,内容放在本文最下方。
(1)首先任意选择两个不相等的质数p和q
(2)计算p和q的乘积n,令p=61, q=53,则n = 61×53 = 3233
3)计算n的欧拉函数φ(n) = (p-1)(q-1) φ(3233)=60×52=3120
4)随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质
在1到3120之间,随机选择了17,e=17。
5)计算e对于φ(n)的模反元素d
根据前面模反元素公式e^φ(N)=e*e^φ(N-1)≡1mod(N),这个公式中的N等于这里的φ(n), 令d=e^φ(N-1), 则ed≡1mod(N),即
ed ≡ 1 (mod φ(n))
这个式子等价于
ed - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解
ex + φ(n)y = 1
已知 e=17, φ(n)=3120
17x + 3120y = 1
这个方程可以用”扩展欧几里得算法”求解,此处省略具体的计算过程,有兴趣可以研究下这个算法,算出一组整数解为 (x,y)=(2753,-15),即 d=2753。至此所有计算完成。
6)将n和e封装成公钥,n和d封装成私钥
n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)
(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:。
(8)解密过程为:。
在这篇科普小文章里,不可能对RSA算法的正确性作严格的数学证明,但我们可以通过一个简单的例子来理解RSA的工作原理。为了便于计算。在以下实例中只选取小数值的质数p,q,以及e,假设用户A需要将明文“key”通过RSA加密后传递给用户B,过程如下:
(1)设计公私密钥(e,n)和(d,n)。
令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3与20互质)则e×d≡1 mod f(n),即3×d≡1 mod 20。
d怎样取值呢?可以用试算的办法来寻找。试算结果见下表:
通过试算我们找到,当d=7时,e×d≡1 mod f(n)同余等式成立。因此,可令d=7。从而我们可以设计出一对公私密钥,加密密钥(公钥)为:KU =(e,n)=(3,33),解密密钥(私钥)为:KR =(d,n)=(7,33)。
(2)英文数字化。
将明文信息数字化,并将每块两个数字分组。假定明文英文字母编码表为按字母顺序排列数值,即:
则得到分组后的key的明文信息为:11,05,25。
(3)明文加密
用户加密密钥(3,33) 将数字化明文分组信息加密成密文。由C≡Me(mod n)得:
(4)密文解密。
用户B收到密文,若将其解密,只需要计算,即:
用户B得到明文信息为:11,05,25。根据上面的编码表将其转换为英文,我们又得到了恢复后的原文“key”。
你看,它的原理就可以这么简单地解释!
当然,实际运用要比这复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024位甚至2048位才能保证安全,因此,p、q、e的选取、公钥私钥的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。
首先说明,RSA的安全性没有被证明,是否等同于大数分解一直未能得到理论上的证明。
但也没有证明不通过暴力大树分解还有其他的办法破解。
不管怎样,分解n是最显然的攻击方法。
回顾上面的密钥生成步骤,一共出现六个数字:
p
q
n
φ(n)
e
d
这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
那么,有无可能在已知n和e的情况下,推导出d?
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。
可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基百科这样写道:
在RSA密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的e和n的数值(n等于pq),想法求出d的数值,这样就可以得到私钥来破解密文。从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我们可以看出。密码破解的实质问题是:从Pq的数值,去求出(p-1)和(q-1)。换句话说,只要求出p和q的值,我们就能求出d的值而得到私钥。
当p和q是一个大质数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。比如当pq大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。因此,RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。
此外,RSA的缺点还有:A)产生密钥很麻烦,受到质数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。
一、 什么是“质数”?
质数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是质数;又如,12=6*2=4*3,所以12也不是质数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个质数。质数也称为“素数”
二、什么是“互质数”(或“互质数”)?
小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。
判别方法主要有以下几种(不限于此):
(1)两个质数一定是互质数。例如,2与7、13与19。
(2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与 26。
(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
(4)相邻的两个自然数是互质数。如 15与 16。
(5)相邻的两个奇数是互质数。如 49与 51。
(6)大数是质数的两个数是互质数。如97与88。
(7)小数是质数,大数不是小数的倍数的两个数是互质数。如 7和 16。
(8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。
三、什么是模指数运算?
指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。
模指数运算就是先做指数运算,取其结果再做模运算。如
四、欧拉函数
何为欧拉函数?
在任意的正整数n,请问在小于等于n的正整数中,有多少个与n构成互质关系,计算这个值的方法,就叫做欧拉函数,以φ(n)表示。
比如正整数8,φ(8)=?,很快算出有1、3、5、7,所以φ(8)=4
根据前面对质数,互质关系,欧拉函数的介绍,大牛们把欧拉函数又推导出下面几个等式也成立:
1)如果n可以分解成两个互质的整数之积,即n=p×q,则有:φ(n)=φ(pq)=φ(p)φ(q);
2)一个数如果是质数,则小于它的所有正整数与它都是互质数;所以如果一个数p是质数,则有:φ(p)=p-1。
3)如果n可以分解成两个互质的整数之积n = p1 × p2,则φ(n) = φ(p1p2) = φ(p1)φ(p2)
4)如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则
φ(p^k)=p^k-p^(k-1)=p^k(1-1/p).
比如: φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4; φ(8) = φ(2^3)=2^3(1-1/2)=4
5)因为任意一个大于1的正整数,都可以写成一系列质数的积:
n=p1^k1p2^k2…pr^kr,根据第三条定律,则φ(n)=φ(p1^k1)φ(p2^k2)…φ(pr^kr)
再根据第四条定律,则φ(n)=p1^k1p2^k2…pr^kr(1-1/p1)(1-1/p2)…(1-1/pr),也就等于
φ(n)=n(1-1/p1)(1-1/p2)…(1-1/pr),这就是欧拉函数的通用计算公式,举例:1323的欧拉函数,计算过程如下:
φ(1323)=φ(3^3x7^2)=1323(1-1/3)(1-1/7)=756
五、欧拉定理
欧拉函数的用处,在于欧拉定理。
如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:
a^φ(n)≡1mod(n)
比如,3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。
六、同余定理
给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。
七、扩展欧几里得算法
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然
存在整数对 x,y ,使得 gcd(a,b)=ax+by。
具体求解方法本人也没有看懂,只是试了一下java的函数可以求出解。有兴趣的可以了解一下具体算法。
八、模反元素定理
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
根据欧拉定理有:
a^φ(n)=axa^φ(n-1)≡1mod(n),令b=a^φ(n-1),则ab≡1mod(n),这里b就是a的模反元素。
比如,3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {…,-18,-7,4,15,26,…},即如果b是a的模反元素,则 b+kn 都是a的模反元素。