RSA加密
一、概述
二、对称加密
三、RSA加密
四、OpenSSL使用
一、概述
RSA是一种非对称加密算法,1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,因此以三人姓氏的首字母命名了该非对称加密算法,RSA算法。
提到非对称加密,下面简单看一下对称加密流程:
二、对称加密
先举个栗子:
1、天王盖地虎对宝塔镇河妖,我们都知道,所以你给我发天王盖地虎,我就翻译成宝塔镇河妖。因此对称加密也可以说是秘密交易者的暗号;
2、战争片中的电报,发送方和接收方都有一个密码本,每一个字母都有与之对应的密文,发送时对照密码本发送密文,接收时拿密文在密码本上进行比对;
3、开发中如同我告诉接收方我给你的数据都是用base64加密的,那么接收方就可以采用base64解密。
综上所知,消息发送方与接收方均知道对数据的处理方式,那么我们称这种处理方式方法为秘钥(key),也就是上面暗号的上下句,密码本,base64。对数据加密解密都是由一个秘钥(key)来处理,消息发送端和消息接收端同时存有秘钥(key),因此也称之为单秘钥加密。第三方可以通过归纳总结或强行获取秘钥(key),如果第三方拿到了秘钥(key)那么消息也就会被第三方获取,所以对称加密安全性一般,适用与一般数据加密。如下图:
symmetric.png
三、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,6,7,8共7个,,因此φ(9)=7。
互质:除了1没有其他公因数的两个整数,称为互质整数。
通式:φ(x)=x∏(1-1/pi) 1=<x<n。(p1~pn为x的所有质因数)
若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。
欧拉定理
如果两个正整数m和n互质,那么m的φ(n) 次方对n取余衡等于1。m^φ(n)%n≡1。
费马小定理
存在一个质数p,而整数a不是p的倍数,则存在a^(p-1)%p≡1。费马小定理是欧拉定理的特殊情况。因为φ(p)=p-1(任何数都与质数互质)。
模反元素
如果两个正整数e和x互质,那么一定存在一个整数d,使得ed-1能够被x整除,则称d是e对x的模反元素。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为明文,e和d分别对应的是公钥私钥。迪菲卡尔曼秘钥交换对公式拆分:
m^e%n=c 加密
c^d%n=m 解密
其中c为通过e加密后的密文,然后通过d可以解出明文m。因此:
公钥: e、n
秘钥:d、n
明文:m
密文:c
RSA加密过程
1、取两个质数p1、p2;
2、确定n值,n=p1 * p2,n值一般会很大长度一般为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=3, p2=7;
2、n=p1 * p2=3 * 7=21;
3、φ(n)=(p1-1) * (p2-1)=2*6=12;
4、1<e<12,e=5(e与12互质则取值{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。
数据传输过程:
RSA.png
四、OpenSSL
OpenSSL是Mac系统内置的开源加密库,我们可以是用终端来获取私钥公钥,数据加密。
主要命令:
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、创建私钥公钥:
create.png
2、查看私钥公钥:
overview.png
3、创建文本:
message.png
4、公钥对数据加密:
encode1.png
5、私钥解密:
decode1.png
6、私钥加密:
encode2.png
7、公钥解密:
decode2.png
来看看长什么样:
cer.png
这么看就很熟悉了,哈哈,可以用起来。