(ECC)RSA和AES混合算法实战(客户端、服务端双向加密)

https://blog.csdn.net/myzksky/article/details/81042135

RSA和ECC混合算法实战(客户端、服务端双向加密)

注意点(RSA加密数据性能较弱,而且有长度限制,最多不能超过117位数据,超出后则抛出异常)

默认情况下AES加密、ECC加密都是只支持128位加密(16个字符),如有需要,则更改美国对软件出口的控制。

JCE8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

替换C:\Java\jdk1.8.0_72\jre\lib\security下local_policy.jar、US_export_policy.jar进行替换。
因此我们的总体算法是Rsa加密AesKey,AesKey加密数据

分析操作:

1、服务端创建一对(RSA、ECC)非对称加密公私钥(A-PublicKey、A-PrivateKey)
此时服务器存储私钥,公钥对所有客户端公开,且客户端需要保存公钥
如果返回给客户端数据也需要加密的话,则在客户端也创建一对(RSA、ECC)非对称加密公私钥(B-PublicKey、B-PrivateKey)

(a)、客户端本地创建RSA公私钥B-PublicKey、B-PrivateKey,本地保存私钥,公钥发起请求上传B-PublicKey到服务端,同时客户端需要传输一个UUID来
保存请求,第一次请求是没有用户的,因此此UUID需要保持唯一,若用户更换客户端,则之前的B-PublicKey和UUID已废弃,需重新生成

(b)、服务端接受客户端请求,根据UUID保存用户的B-PublicKey到Redis或MongoDB,便于后续此用户操作直接从后台拿到B-PublicKey

2、客户端发起请求需要用使用AES先加密数据得到AesEncodeData,使用A-PublicKey加密AesKey得到RsaEncodeData其中A-PublicKey是保存在客户端的,不需要传输,最终发起请求的数据为Data=AesEncodeData & Key=RsaEncodeData

3、服务端获取到客户端请求后,先使用私钥A-PrivateKey进行解密,获取到AesKey,再使用AesKey解密获取到用户真实请求的数据

4、服务端业务操作完成之后,使用之前客户端的B-PublicKey加密返回数据,和步骤2操作一致此时需要用使用AES先加密数据得到AesEncodeData,使用B-PublicKey加密AesKey得到RsaEncodeData其中B-PublicKey是保存在客户端的,不需要传输,最终返回的数据为Data=AesEncodeData & Key=RsaEncodeData

5、客户端获取到服务端响应数据后,先使用私钥B-PrivateKey进行解密,获取到AesKey,再使用AesKey解密获取到服务端真实响应的数据

总结:服务端和客户端都是用RSA创建公私钥,服务端私钥是一个,各个客户端使用的公钥也是不变的,而客户端创建公私钥是多个,服务端保存每一个客户端的公钥,用于加密数据返回给客户端。RSA公私钥是非对称加密,公私钥需要分开保存,但是由于RSA的特殊性(长度和性能限制),则需要结合AES等对称加密算法一起使用,保证数据安全

ECC英文全称"Ellipse Curve Cryptography",椭圆曲线算法

RSA是通过2个较大质数求乘积,从而使得因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥

ECC164位的密钥产生的安全级别相当于RSA1024位密钥提供的安全强度,且计算量较小,处理速度更快,存储空间和传输带宽占用较少。目前我国居民二代身份证也正在使用256位的椭圆曲线密码,虚拟货币(比特币)也选择ECC作为加密算法。

 

猜你喜欢

转载自blog.csdn.net/caodongfang126/article/details/84026930