RSA加密

一、概述

RSA是一种非对称加密算法,1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,因此以三人姓氏的首字母命名了该非对称加密算法,RSA算法。

提到非对称加密,下面简单看一下对称加密流程:

二、对称加密

先举个栗子:

1、天王盖地虎对宝塔镇河妖,我们都知道,所以你给我发天王盖地虎,我就翻译成宝塔镇河妖。因此对称加密也可以说是秘密交易者的暗号;

2、战争片中的电报,发送方和接收方都有一个密码本,每一个字母都有与之对应的密文,发送时对照密码本发送密文,接收时拿密文在密码本上进行比对;

3、开发中如同我告诉接收方我给你的数据都是用base64加密的,那么接收方就可以采用base64解密。

综上所知,消息发送方与接收方均知道对数据的处理方式,那么我们称这种处理方式方法为秘钥(key),也就是上面暗号的上下句,密码本,base64。对数据加密解密都是由一个秘钥(key)来处理,消息发送端和消息接收端同时存有秘钥(key),因此也称之为单秘钥加密。第三方可以通过归纳总结或强行获取秘钥(key),如果第三方拿到了秘钥(key)那么消息也就会被第三方获取,所以对称加密安全性一般,适用与一般数据加密。如下图:

三、RSA加密

RSA非对称加密存在大量的取模运算,加密速度慢,只适用于对小数据量加密,所有在应用中经常结合对称加密使用,对对称加密的私钥进行加密。非对称加密应用有支付宝,微信等支付做签名验证,苹果开发证书签名等。
欧拉函数
在数论中,存在正整数 n,小于n并且与n互质的正整数的数目称为n的欧拉函数记着φ(n)。例如:
φ(7) 7对应的比7小的与7互质的数有1、2、3、4、5、6共6个,因此φ(7)=6
φ(8) 8对应的比8小的与8互质的数有1,3,5,7共4个,因此φ(8)=4
φ(9) 9对应的比9小的与9互质的数有1,2,4,5,7,8共6个,,因此φ(9)=6

互质: 除了1没有其他公因数的两个整数,称为互质整数。

通式:φ(x)=x∏(1-1/pi) 1=<x<n。(p1~pnx的所有质因数)

m n互质:φ(n * m)=φ(n)* φ(m),如果n为质数那么φ(n)=n-1

分解质因数求值:φ(12)=φ(4 * 3)=φ( 2^2 * 3^1 )=( 2^2 - 2^1 ) * (3^1 - 3^0)=4

欧拉定理
如果两个正整数mn互质,那么mφ(n) 次方对n取余衡等于1m^φ(n)%n≡1

费马小定理
存在一个质数p,而整数a不是p的倍数,则存在a^(p-1)%p≡1。费马小定理是欧拉定理的特殊情况。因为φ(p)=p-1(任何数都与质数互质)。

模反元素
如果两个正整数ex互质,那么一定存在一个整数d,使得ed-1能够被x整除,则称dex的模反元素。e * d % x≡1,那么e * d ≡ k*x+1

由以上定理得出以下几个公式:
1、m^φ(n)%n≡1
2、m^(k * φ(n))%n≡1 两端同乘以m
3、m^(k * φ(n)+1)%n≡m
4、e * d≡k * x+1
5、m^e * d%n≡m 替换第3步k * φ(n)+1

m^e*d%n≡m就是我们需要的一个非对称加密的公式。m为明文,ed分别对应的是公钥私钥。迪菲卡尔曼秘钥交换对公式拆分:
m^e%n=c 加密
c^d%n=m 解密
其中c为通过e加密后的密文,然后通过d可以解出明文m。因此:
公钥: en
秘钥:dn
明文:m
密文:c

RSA加密过程
1、取两个质数p1p2
2、确定n值,n=p1 * p2n值一般会很大长度一般为1024个二进制位;
3、确定φ(n)φ(n)=(p1-1) * (p2-1)
4、确定e值,1<e<φ(n)e为整数并且与φ(n)互质;
5、确定d值,e*d%φ(n)=1
6、加密 c=m^e%n
7、解密m=c^d%n

实际验证:
1、p1=3p2=7
2、n=p1 * p2=3 * 7=21
3、φ(n)=(p1-1) * (p2-1)=2*6=12
4、1<e<12e=5e12互质则取值{1,5,7,11}φ(12)=4个互质数,满足条件的有4个);
5、e * d % φ(n)=5 * d % 12=1,得d=17
6、设置明文m=3,则c = m^e % n = 3^5 % 21=12
7、解密密文m=c^d % n=12^17 % 21=3

数据传输过程:

四、OpenSSL

OpenSSLMac系统内置的开源加密库,我们可以是用终端来获取私钥公钥,数据加密。

主要命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1、生成一个RSA私钥
openssl genrsa -out private.pem 1024
2、从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem
3、将私钥转换成明文
openssl rsa -in private.pem -text -out private.txt
4、通过公钥进行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enmsg.txt
5、通过私钥进行解密
openssl rsautl -decrypt -in enmsg.txt -inkey private.pem -out demsg.txt
6、通过私钥进行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enmsg2.txt
7、通过公钥进行解密
openssl rsautl -verify -in enmsg2.txt -inkey public.pem -pubin -out demsg2.txt

通过终端显示加密解密过程:

1、创建私钥公钥:

2、查看私钥公钥:

3、创建文本:

4、公钥对数据加密:

5、私钥解密:

6、私钥加密:

7、公钥解密:

来看看长什么样:

这么看就很熟悉了,哈哈,可以用起来。