对称加密与非对称加密
对称加密:加密和解密都是用同一个密钥的算法,称作对称加密。
非对称加密:加密和解密需要不同的密钥。
什么是RSA
RSA是一种非对称加密算法,它的名字由三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母组成的。
RSA被用于公钥密码和数字签名。
1983年,RSA公司为RSA算法在美国取得了专利,但现在该专利已经过期。
RSA加密与解密介绍
在RSA中,明文、密钥和密文都是数字。
RSA加密
RSA的加密过程可以用下面的公式来表达:
RSA的密文是对代表了明文的数字的E次方求mod N的结果。就是将明文和自己做E次乘方,然后将其结果除以N求余数,这个余数就是密文。
E和N两个数字对RSA的加密结果起着决定性作用。
E和N两个数才组成一个公钥,因此我们一般会写出“公钥是(E,N)”或者“公钥是{E,N}”这样的形式
RSA解密
RSA的解密过程可以用下面的公式来表达:
该公式表示对密文的数字的D次方求mod N就可以得到明文。就是将密文自己做D次乘法,再对其结果除以N求余数,就可以得到明文。
D和N两个数字也对解密结果起着决定性机会,这里的N和RSA加密的N是同一个数字。
D和N两个数组成了一个私钥,因此我们一般会写出“私钥是(D,N)”或者“私钥是{D,N}”这样的形式
所以到这里我们似乎只要知道怎么产生公钥(E,N)和私钥(D,N)。
RSA加密与解密详细
数学知识准备
RSA加密与解密算法中,只用到素数、互质数、指数运算、模运算等几个简单的数学知识。所以,我们也需要了解这几个概念即可。
素数
素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。
互质数
百度百科上的解释是:公因数只有1的两个数,叫做互质数。;维基百科上的解释是:互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。
常见的互质数判断方法主要有以下几种:
- 两个不同的质数一定是互质数。例如,2与7、13与19。
- 一个质数,另一个不为它的倍数,这两个数为互质数。例如,3与10、5与 26。
- 相邻的两个自然数是互质数。如 15与 16。
- 相邻的两个奇数是互质数。如 49与 51。
- 较大数是质数的两个数是互质数。如97与88。
- 小数是质数,大数不是小数的倍数的两个数是互质数。例如 7和 16。
- 2和任何奇数是互质数。例如2和87。
- 1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
- 辗转相除法。
指数运算
指数运算又称乘方计算,计算结果称为幂。nm指将n自乘m次。把nm看作乘方的结果,叫做”n的m次幂”或”n的m次方”。其中,n称为“底数”,m称为“指数”。
模运算
模运算即求余运算。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个正整数,若得相同余数,则二整数同余。
两个整数a,b,若它们除以正整数m所得的余数相等,则称a,b对于模m同余,记作: a ≡ b (mod m);读作:a同余于b模m,或者,a与b关于模m同余。例如:26 ≡ 14 (mod 12)。
加密和解密
使用Alice和他的小伙伴来举例子。
假设Alice想通过一个不可靠的媒体接受Bob的一条私人消息,他可以用下面的方式产生一个公钥和私钥。
- 1. 随意选择两个大的质数p和q,p不等于q,计算N = pq.
- 2. 根据欧拉函数,求得r=φ(N)=φ(p)φ(q)=(p-1)(q-1)。
- 3. 选择一个小于r的整数e,是e与r互质。并求得e关于r的模反元素,命名为d。(求d令ed≡1(mod r))。(模反元素存在,当且仅当e与r互质)
- 4. 将p和q的记录销毁。
其中(N,e)是公钥,(N,d)是私钥。
举个例子:
- 1. Alice随机选两个不相等的质数61和53,并计算两数的积N=61*53=3233,N的长度就是密钥长度。3233的二进制是110010100001,一共12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,总要的场合是2048位。
- 2. 计算N的欧拉函数。 φ(N)=(p-1)(q-1)=60*52=3120.
- 3. Alice 在1到3120上随机选择了一个随机数e=17。
- 4. 计算e对φ(N)的模反元素d,即时,ed-1=kφ(N)。
- 即使求解:17x+3120y=1.用扩展欧几里得算法求解。可以算出一组解(x,y)=(2753,-15),即d=2753。
至此完成计算。
其中N=3233,e=17,d=2753。所以公钥就是(N,e)=(3233,17),私钥(N,d)=(3233,2753)。实际应用中公钥和私钥都是采用ASN.1格式表达的。
加密
加密要用到公钥(N,e)。
假设Bob要向Alice发送加密信息m,他就要用Alice的公钥(N,e)对m进行加密。但m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓加密就是计算下式的c。
m^e ≡ c (mod n)
假设m=65,Alice的公钥(3233,17),所以等式如下:
65^17≡2790(mod 3233)
所以c等于2790,Bob就把2790发给Alice。
解密
Alice收到Bob发来的2790后,就用自己的私钥(3233,2755)进行解密。
c^d ≡ m (mod n)
也就是c的d次方除以n的余数就是m。
2790^2753 ≡ 65 (mod 3233)
因此得到原文65。
refer:
https://blog.csdn.net/chengqiuming/article/details/82725137
https://www.jianshu.com/p/48ceec5e0124
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html