参考文档:
对称加密及RSA非对称加密的原理参考视频1
常见的加密有:对称加密,非对称加密,不可逆加密
sign签名则是使对外暴漏的接口能被安全的不爆露参数的访问
对称加密:
- 常见的对称加密:AES,DES,Base64加密等
- 对称加密指的是:加密者和解密者使用同一个密钥,双方需要私下见面约定一个密钥,如果在网络传输的话很有可能被劫持导致信息泄露,且由于原理简单,即使没有劫持到密钥,普通计算机24H以内也可破解,所以不建议使用
- 对称加密的加密原理:通过对原文的ascii码,经过密钥和一定的数学运算得到密文
- 对称加密的解密原理:通过对密文的ascli码,经过密钥和数学逆运算得到原文
- 例如,ABC对应的ascli分别是:65、66、67 双方规定的密钥为3,规定的算法为+,得到的ascli码为:68、69、70,密文为DEF(当然在真正的应用场景比这个复杂的多,这个仅仅是个例子)
非对称加密:
- 常见的非对称加密:RSA
- 非对称加密指的是:由于对称加密,加密解密过程相对比较容易被破译,且需要双方通过非网络的形式约定密钥,既不方便有不安全。非对称加密采用的算法→模运算使加密过程相对比较容易,但是解密过程特别困难,甚至不可能。
- 非对称加密原理:
- 模运算
第一个公式:m的e次方对N取余和c对N取余值是一样的,可以将原文m加密为密文c
第二个公式:c的d次方对N取余和m对N取余值是一样的,可以将密文c解密为原文m
模运算的特点是知道公钥和私钥,可以很快的得到密文或原文,但是如果不知道公钥或私钥,根据公式去推倒,是几乎不可能的
而且公钥和私钥不能解自身加密过的,但是可以相互解对方加密过的密文,即用公钥加密,即可用私钥解密;用私钥加密,即可用公钥解密。
2. 数学原理
那么应该怎么得到公钥和私钥呢?
(1).欧拉定理:任何一个正整数 n >1 都可以唯一地分解为一组质数p1,p2的乘积,例如:77 = 7*11,且7和11都为质数
(2).欧拉函数:数是小于n的正整数中与n互质的数的数目φ(n) = (p1-1)(p2-1),例如:小于77且与77互质的数目为φ(77) = (7-1)*(11-1) = 60
(3).N和e,d的选择:
N的选择一般是随机取一个较大的数,
1 < e < φ(N),且e与φ(N)互质,满足这两个条件即可
d = ( k * φ(N) +1) / e,k值不定,但是必须保证d算出为整数
(4).例如我们对A进行RSA加密,A的ascli码为65
选取N= 3127 = 53*59(53和59都为质数),
φ(3127) = (53-1)*(59-1) = 52*58 = 3016
1 < e < 3016,且与3016互质,取e = 3
d = ( k * φ(N) +1) / e = ( k * 3016 +1) / 3,取 k= 2 ,d = 2011
所以,公钥为(3,3127),私钥为(2011,3127)
(5).我们用上述公钥和私钥对B和C加密
- 日常应用中要比上述复杂的多 ,我们一般会在本地生成私钥和公钥,然后通过网络把公钥发送给远端。
- 发送信息时,首先进行私钥的加密处理,送达远端后,远端拿着公钥去解密获取原文。
- 接受信息时,远端会用公钥给文件加密,送达本地后,本地拿着私钥去解密获取原文。
- 但是由于公钥和信息都是通过网络传输的,所以容易被人截获,造成信息泄露
- 为了解决信息容易被截获的问题,所以就有了https协议,即http+ssl
- 通过第三方机构的CA证书,即第三方的公钥和密钥,来进行双层的加密
- 具体过程是,本地首先将公钥发送给第三方机构,第三方机构用私钥为本地的公钥加密,生成证书连同第三方机构的公钥 发送给本地
- 本地将证书,第三方公钥,本地私钥加密后的密文发送给远端
- 远端用第三方公钥解密证书得到本地公钥,用本地公钥来解密密文
- 这种方式通过双层加密,但是仍然后一定的安全性问题
不可逆加密:
- 常见的不可逆加密:MD5
- 不可逆加密指的是:只管加密,不管解密,也就是说是无法解密的,只能通过比较密文来判断原文是否相等
sign接口签名:
- 我们虽然有基于RSA算法的https协议,但是仍然有安全问题,例如:证书,第三方公钥被截获到,密文也就无效了
- sign签名:有过期时间的加密的访问路径
- 对所有的参数按照ascll码进行升序排序
{"c":"1","a":"2","b":"3"}
排序后
{"a":"2","b":"3","c":"1"}
- 把参数名和参数值连接成字符串
a=2&b=3&c=1
- 把凭证用户名和密码放在参数的前面
user=zhangsan&pwd=123&a=2&b=3&c=1
- 用时间戳连接到参数的尾部
user=zhangsan&pwd=123&a=2&b=3&c=1×tamp=20210607
- 把这个字符串进行32位MD5加密,再转换成大写
sign = 187B812906E8A76F30BB4FE47C459B5B
- 规定一定时间内有效即可