密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。
在说RSA加密算法以前, 先说下密码学的发展史。其实密码学的诞生,就是为了运用在战场,在公元前,战争之中出现了秘密书信。在中国历史上最先的加密算法的记载出自于周朝兵书《六韬.龙韬》中的《阴符》和《阴书》。在遥远的西方,在希罗多德(Herodotus)的《历史》中记载了公元前五世纪,希腊城邦和波斯帝国的战争中,普遍使用了移位法进行加密处理战争通信信息。算法
相传凯撒大帝为了防止敌人窃取信息,就使用加密的方式传递信息。那么当时的加密方式很是的简单,就是对二十几个罗马字母创建一张对照表,将明文对应成为密文。那么这种方式其实持续了好久。甚至在二战时期,日本的电报加密就是采用的这种原始加密方式。安全
早期的密码学一直没有什么改进,几乎都是根据经验慢慢发展的。直到20世纪中叶,由香农发表的《秘密体制的通讯理论》一文,标志着加密算法的重心转移往应用数学上的转移。因而,逐渐衍生出了当今重要的三类加密算法:非对称加密、对称加密以及哈希算法(HASH严格说不是加密算法,但因为其不可逆性,已成为加密算法中的一个重要构成部分)。服务器
1976年之前,全部的加密方法都是同一种模式:加密和解密使用一样规则(简称"密钥"),这被称为"对称加密算法",使用相同的密钥,两次连续的对等加密运算后会回复原始文字,也有很大的安全隐患。网络
1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,能够在不直接传递密钥的状况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。也正是由于这个算法的产生,人类终于能够实现非对称加密了:A给B发送信息函数
- B要先生成两把密钥(公钥和私钥)。公钥是公开的,任何人均可以得到,私钥则是保密的。
- A获取B的公钥,而后用它对信息加密。
- B获得加密后的信息,用私钥解密。
理论上若是公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通讯就是安全的。学习
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,能够实现非对称加密。这种算法用他们三我的的名字命名,叫作RSA算法。从那时直到如今,RSA算法一直是最广为使用的"非对称加密算法"。绝不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法很是可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是232个十进制位,也就是768个二进制位,所以能够认为,1024位的RSA密钥基本安全,2048位的密钥极其安全,固然量子计算机除外。测试
下面进入正题,解释RSA算法的原理,其实RSA算法并不难,只须要一点数论知识就能够理解。大数据
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(好比,在1到8之中,有多少个数与8构成互质关系?)计算这个值的方法就叫作欧拉函数,以φ(n)表示。编码
φ(8) = 4
若是n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则φ(n) = φ(p^k) = p^k - p^(k-1)。也就是φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4加密
φ(7) = 6
若是n是质数,则 φ(n)=n-1 。由于质数与小于它的每个数,都构成互质关系。好比5与一、二、三、4都构成互质关系。
φ(56) = φ(8) φ(7) = 4 6 = 24
若是n能够分解成两个互质的整数之积,即 n = p k ,则φ(n) = φ(p k) = φ(p1)*φ(p2)
欧拉定理:若是两个正整数m和n互质,那么m的φ(n)次方减去1,能够被n整除。
![]()
费马小定理:欧拉定理的特殊状况,若是两个正整数m和n互质,并且n为质数!那么φ(n)结果就是n-1。
![]()
还剩下最后一个概念,模反元素:若是两个正整数e和x互质,那么必定能够找到整数d,使得 ed-1 被x整除,或者说ed被x除的余数是1。
那么d就是e相对于x的模反元素。
根据模反元素,由于e*d 必定是x的倍数加1。因此以下:
经过屡次的等式转换。终于能够将这两个等式进行合并了!以下:
这个等式成立有一个前提!就是关于模反元素的,就是当整数e和φ(n)互质!必定有一个整数d是e相对于φ(n)的模反元素。
咱们能够测试一下。
m取值为4
n取值为15
φ(n)取值为8
e 若是取值为3
d 能够为 十一、19...(模反元素很明显不止一个,其实就是解二元一次方程)
若是你测试了,那么你能够改变m的值试一下,其实这个等式不须要m和n 互质。只要m小于n 等式依然成立。
这里须要注意的是,咱们能够看作 m 经过一系列运算获得结果仍然是 m。这一系列运算中,分别出现了多个参数n、φ(n)、e还有d。
m 的 e乘上d 次方为加密运算,获得结果 c
c 模以 n 为解密运算,获得结果 m
这彷佛能够用于加密和解密。但这样,加密的结果会很是大。明文数据将很是小(虽然RSA用于加密的数据也很小,可是没这么大悬殊),真正的RSA要更增强大,那么RSA是怎么演变来的呢??
早期不少数学家也停留在了这一步!直到1967年迪菲赫尔曼密钥交换打破了僵局!
这个密钥交换当时轰动了整个数学界!并且对人类密码学的发展很是重要,由于这个伟大的算法可以拆分刚才的等式。当非对称加密算法没有出现之前,人类都是用的对称加密。因此密钥的传递,就必需要很是当心。
迪菲赫尔曼密钥交换 就是解决了密钥传递的保密性,咱们来看一下
假设一个传递密钥的场景。算法就是用3 的次方去模以17。 三个角色
客户端用3 的 13次方 mod 17 = 12 而后将获得的结果12公布出去。
拿到服务器的 6 ,而后用6^13 mod 17 获得结果10(10就是交换获得的密钥)
第三者只能拿到6 和 12 ,由于没有私密数据1三、15,因此它无法获得结果10。
为何 6的13次方会和12的15次方获得同样的结果呢?由于这就是规律,咱们能够用小一点的数字测试一下3^3 mod 17 = 10和10 ^ 2 mod 17 ; 3 ^ 2 mod 17 = 9和9^3 mod 17结果都是15。迪菲赫尔曼密钥交换最核心的地方就在于这个规律
如今咱们知道了m^e % n = c是加密,c^d % n = m是解密,m就是原始数据,c是密文,公钥是n和e,私钥是n和d,因此只有n和e是公开的。加密时咱们也要知道φ(n)的值,最简单的方式是用两个质数之积获得,别人想破解RSA也要知道φ(n)的值,只能对n进行因数分解,那么咱们不想m被破解,n的值就要很是大,就是咱们以前说的,长度通常为1024个二进制位,这样就很安全了。可是听说量子计算机(用于科研,还没有普及)能够破解,理论上量子计算机的运行速度无穷快,你们能够了解一下。
以上就是RSA的数学原理
咱们用终端命令演示下这个加密、解密过程。
假设m = 12(随便取值,只要比n小就OK),n = 15(仍是随机取一个值),φ(n) = 8,e = 3(只要和φ(n)互质就能够),d = 19(3d - 1 = 8,d也能够为3,11等等,也就是d = (8k + 1)/3 )
终端分别以m=12,7输入结果
Mac能够直接使用OpenSSL,首先进入相应文件夹
// 生成RSA私钥,文件名为private.pem,长度为1024bit openssl genrsa -out private.pem 1024
// 从私钥中提取公钥 openssl rsa -in private.pem -pubout -out publick.pem
// 查看刚刚生成好的私钥 cat private.pem
// 查看刚刚生成好的公钥 cat publick.pem
咱们能够看到base64编码,明显私钥二进制很大,公钥就小了不少。
这时候咱们的文件夹内已经多了刚刚生成好的公私钥文件了
// 将私钥转换为明文 openssl rsa -in private.pem -text -out private.txt
里面就是P一、P2还有KEY等信息。
// 编辑文件message内容为hello Vincent!!! // 刚刚的public.pem写成了publick.pem(哎。。。) $ vi message.txt $ cat message.txt hello Vincent!!! // 经过公钥加密数据时,使用encrypt对文件进行加密 $ openssl rsautl -encrypt -in message.txt -inkey publick.pem -pubin -out enc.txt // 此时查看该文件内容为乱码 $ cat enc.txt j��E]a��d�kUE�&< ��I*��V/��pL[���ˋ�O�+�-�M��K�ܱ�&⪅ծO��2���o34�:�$���6��C�L��,b�'M�S�k�0���A��3%�[I���1�����ps"% // 经过私钥解密数据 $ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt // 已成功解密,正确显示文件内容 $ cat dec.txt hello Vincent!!!
// 经过私钥加密数据时,要使用sign对文件进行重签名 $ openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bin // 此时查看该文件内容一样为乱码 $ cat enc.bin {���Ew�3�1E��,8-OA2�Is�:���:�ԅ@MU���� �i1B���#��6���ׂm�D(�t#/��� �ہ�������ݬ>(�>�^@�C��3�ӸMQт�O% // 经过公钥解密数据 $ openssl rsautl -verify -in enc.bin -inkey publick.pem -pubin -out dec.bin // 已成功解密,正确显示文件内容 $ cat dec.bin hello Vincent!!!
到这里,你们都知道RSA经过数学算法来加密和解密,效率比较低,因此通常RSA的主战场是加密比较小的数据,好比对大数据进行对称加密,再用RSA给对称加密的KEY进行加密,或者加密Hash值,也就是数字签名。
关于RSA数字签名后面再慢慢阐述。该文章为记录本人的学习路程,但愿可以帮助你们,也欢迎你们点赞留言交流!!!https://www.jianshu.com/p/ad3...