ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

非对称加密算法--RSA加密原理

2020-12-29 10:58:04  阅读:185  来源: 互联网

标签:加密 -- RSA upload https jianshu images 加密算法


>[密码](https://baike.baidu.com/item/%E5%AF%86%E7%A0%81)学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。

 

 

#### 密码学发展史

在说RSA加密算法之前, 先说下密码学的发展史。其实密码学的诞生,就是为了运用在战场,在公元前,战争之中出现了秘密书信。在中国历史上最早的加密算法的记载出自于周朝兵书《六韬.龙韬》中的《阴符》和《阴书》。在遥远的西方,在希罗多德(Herodotus)的《历史》中记载了公元前五世纪,希腊城邦和波斯帝国的战争中,广泛使用了移位法进行加密处理战争通讯信息。

 

相传凯撒大帝为了防止敌人窃取信息,就使用加密的方式传递信息。那么当时的加密方式非常的简单,就是对二十几个罗马字母建立一张对照表,将明文对应成为密文。那么这种方式其实持续了很久。甚至在二战时期,日本的电报加密就是采用的这种原始加密方式。

![凯撒密码对照表](https://upload-images.jianshu.io/upload_images/5741330-5ee8c4ebef3e7b23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

早期的密码学一直没有什么改进,几乎都是根据经验慢慢发展的。直到20世纪中叶,由香农发表的《秘密体制的通信理论》一文,标志着加密算法的重心转移往应用数学上的转移。于是,逐渐衍生出了当今重要的三类加密算法:非对称加密、对称加密以及哈希算法(HASH严格说不是加密算法,但由于其不可逆性,已成为加密算法中的一个重要构成部分)。

 

1976年以前,所有的加密方法都是同一种模式:加密和解密使用同样规则(简称"密钥"),这被称为["对称加密算法"](http://zh.wikipedia.org/zh-cn/%E5%AF%B9%E7%AD%89%E5%8A%A0%E5%AF%86),使用相同的密钥,两次连续的对等加密运算后会回复原始文字,也有很大的安全隐患。

 

1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为["Diffie-Hellman密钥交换算法"](http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange)。也正是因为这个算法的产生,人类终于可以实现非对称加密了:A给B发送信息

> 1. B要先生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

> 2. A获取B的公钥,然后用它对信息加密。

> 3. B得到加密后的信息,用私钥解密。

理论上如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

 

1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做[RSA算法](http://zh.wikipedia.org/zh-cn/RSA%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95)。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是232个十进制位,也就是768个二进制位,因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全,当然量子计算机除外。

 

#### RSA算法的原理

下面进入正题,解释RSA算法的原理,其实RSA算法并不难,只需要一点[数论知识](http://jeremykun.com/2011/07/30/number-theory-a-primer/)就可以理解。

> 1. **素数**:又称**质数**,指在一个大于1的[自然数](https://link.jianshu.com/?t=http%3A%2F%2Fbaike.baidu.com%2Fview%2F19911.htm)中,除了1和此[整数](https://link.jianshu.com/?t=http%3A%2F%2Fbaike.baidu.com%2Fview%2F71484.htm)自身外,不能被其他自然数[整除](https://link.jianshu.com/?t=http%3A%2F%2Fbaike.baidu.com%2Fview%2F135932.htm)的数。

> 2. **互质**,又称**互素**。若N个整数的[最大公因子](https://link.jianshu.com/?t=http%3A%2F%2Fzh.wikipedia.org%2Fwiki%2F%25E6%259C%2580%25E5%25A4%25A7%25E5%2585%25AC%25E5%259B%25A0%25E6%2595%25B8)是1,则称这N个整数互质。

> 3. **模运算**即**求余运算**。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个**正**整数,若得相同[余数](https://link.jianshu.com/?t=https%3A%2F%2Fzh.wikipedia.org%2Fwiki%2F%25E4%25BD%2599%25E6%2595%25B0),则二整数**同余**。

##### 欧拉函数

任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)计算这个值的方法就叫做[欧拉函数](http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0),以φ(n)表示。

- 计算8的欧拉函数,和8互质的 **1**、2、**3**、4、**5**、6、**7**、8

φ(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的欧拉函数,和7互质的 **1**、**2**、**3**、**4**、**5**、**6**、7

φ(7) = 6

如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。

- 计算56的欧拉函数

φ(56) = φ(8) * φ(7) = 4 * 6 = 24

如果n可以分解成两个互质的整数之积,即 n = p * k ,则φ(n) = φ(p * k) = φ(p1)*φ(p2)

 

> **欧拉定理**:如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。

![欧拉定理.png](https://upload-images.jianshu.io/upload_images/5741330-aac5d632d5294ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

 

> **费马小定理**:欧拉定理的特殊情况,如果两个正整数m和n互质,而且n为质数!那么φ(n)结果就是n-1。

![费马小定理.png](https://upload-images.jianshu.io/upload_images/5741330-4145a3b04b0b1f4f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

##### 模反元素

还剩下最后一个概念,**模反元素**:如果两个正整数e和x互质,那么一定可以找到整数d,使得 ed-1 被x整除,或者说ed被x除的余数是1。

那么d就是e相对于x的模反元素。

![d是模反元素](https://upload-images.jianshu.io/upload_images/5741330-911313c2150bbbf7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

##### 等式转换

1. 根据欧拉定理

![等式转换1](https://upload-images.jianshu.io/upload_images/5741330-5af05cb7a189c0ed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

2. 由于1^k ≡ 1,等号左右两边都来个k次方

![等式转换](https://upload-images.jianshu.io/upload_images/5741330-ad1f177f9269a81c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

3. 由于1* m ≡ m,等号左右两边都乘上m

![等式转换3.png](https://upload-images.jianshu.io/upload_images/5741330-a1d3a636cd0c4d3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

根据模反元素,因为e*d 一定是x的倍数加1。所以如下:

![等式转换](https://upload-images.jianshu.io/upload_images/5741330-63a22fee3418c300.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

通过多次的等式转换。终于可以将这两个等式进行合并了!如下:

![最终等式转换](https://upload-images.jianshu.io/upload_images/5741330-461b1074f409a257.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

这个等式成立有一个前提!就是关于模反元素的,就是当整数e和φ(n)互质!一定有一个整数d是e相对于φ(n)的模反元素。

我们可以测试一下。

m取值为4

n取值为15

φ(n)取值为8

e 如果取值为3

d 可以为 11、19...(模反元素很明显不止一个,其实就是解二元一次方程)

如果你测试了,那么你可以改变m的值试一下,其实这个等式不需要m和n 互质。只要m小于n 等式依然成立。

这里需要注意的是,我们可以看做 m 通过一系列运算得到结果仍然是 m。这一系列运算中,分别出现了多个参数n、φ(n)、e还有d。

 

m 的 e乘上d 次方为**加密运算**,得到结果 c

c 模以 n 为**解密运算**,得到结果 m

这似乎可以用于加密和解密。但这样,加密的结果会非常大。明文数据将非常小(虽然RSA用于加密的数据也很小,但是没这么大悬殊),真正的RSA要更加强大,那么RSA是怎么演变来的呢??

早期很多数学家也停留在了这一步!直到1967年迪菲赫尔曼密钥交换打破了僵局!

##### 迪菲赫尔曼密钥交换

这个密钥交换当时轰动了整个数学界!而且对人类密码学的发展非常重要,因为这个伟大的算法能够拆分刚才的等式。当非对称加密算法没有出现以前,人类都是用的对称加密。所以密钥的传递,就必须要非常小心。

迪菲赫尔曼密钥交换 就是解决了密钥传递的保密性,我们来看一下

![迪菲赫尔曼密钥交换](https://upload-images.jianshu.io/upload_images/5741330-40ed49e5422fbb70.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

假设一个传递密钥的场景。算法就是用3 的次方去模以17。 三个角色

- 服务器 随机数 15

这个15只有服务器才知道。通过算法得到结果 6 因为 3的15次方 mod 17 = 6 。然后将结果 6 公开发送出去,拿到客户端的 12 ,然后用12^15 mod 17 得到结果10(10就是交换得到的密钥)

- 客户端 随机数13

客户端用3 的 13次方 mod 17 = 12 然后将得到的结果12公布出去。

拿到服务器的 6 ,然后用6^13 mod 17 得到结果10(10就是交换得到的密钥)

- 第三者

第三者只能拿到6 和 12 ,因为没有私密数据13、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。迪菲赫尔曼密钥交换最核心的地方就在于这个规律

![迪菲赫尔曼密钥交换转换](https://upload-images.jianshu.io/upload_images/5741330-b839319bdbffbffb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

##### RSA的诞生

![RSA原理](https://upload-images.jianshu.io/upload_images/5741330-56953f7fe5a720ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

>现在我们知道了m^e % n = c是加密,c^d % n = m是解密,m就是原始数据,c是密文,公钥是n和e,私钥是n和d,所以只有n和e是公开的。加密时我们也要知道φ(n)的值,最简单的方式是用两个质数之积得到,别人想破解RSA也要知道φ(n)的值,只能对n进行因数分解,那么我们不想m被破解,n的值就要非常大,就是我们之前说的,长度一般为1024个二进制位,这样就很安全了。但是据说量子计算机(用于科研,尚未普及)可以破解,理论上量子计算机的运行速度无穷快,大家可以了解一下。

 

以上就是RSA的数学原理

##### 检验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输入结果

![终端演示](https://upload-images.jianshu.io/upload_images/5741330-a531cc45689396d4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

##### OpenSSL进行RSA的命令运行

Mac可以直接使用OpenSSL,首先进入相应文件夹

- 生成公私钥

```

// 生成RSA私钥,文件名为private.pem,长度为1024bit

openssl genrsa -out private.pem 1024

```

 

```

// 从私钥中提取公钥

openssl rsa -in private.pem -pubout -out publick.pem

```

 

![生成私钥](https://upload-images.jianshu.io/upload_images/5741330-c18635adb620fa5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

```

// 查看刚刚生成好的私钥

cat private.pem

```

 

```

// 查看刚刚生成好的公钥

cat publick.pem

```

 

![查看公私钥](https://upload-images.jianshu.io/upload_images/5741330-f9021727e38ee91e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

我们可以看到base64编码,明显私钥二进制很大,公钥就小了很多。

这时候我们的文件夹内已经多了刚刚生成好的公私钥文件了

 

![公私钥文件](https://upload-images.jianshu.io/upload_images/5741330-16eb45ed60a97f1f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

```

// 将私钥转换为明文

openssl rsa -in private.pem -text -out private.txt

```

![96111F25-0954-4854-9B36-75413A439AFD.png](https://upload-images.jianshu.io/upload_images/5741330-3ce0504c0e8ca2d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 

里面就是P1、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的主战场是加密比较小的数据,比如对大数据进行对称加密,再用RSA给对称加密的KEY进行加密,或者加密Hash值,也就是数字签名。

 

关于RSA数字签名后面再慢慢阐述。该文章为记录本人的学习路程,希望能够帮助大家,也欢迎大家点赞留言交流!!!

标签:加密,--,RSA,upload,https,jianshu,images,加密算法
来源: https://blog.csdn.net/ArtisticProgramming/article/details/111883099

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有