数据安全传输 越来越被关注,在互联网时代如何保证数据传输安全?那就是数据加密
本文将从代码实现角度解析RSA+DES混合加密进行数据传输。
曾经有这样的疑问:
1、RSA是什么?公钥和私钥有什么区别?
2、DES在加密当中又起到了什么作用?
3、秘钥又是怎么生成的?
等等....
-----------------------问题解决开始--------------------------------
1、密钥匙是如何产生的
简单的来说,有的linux系统自带通过命令简单几句就可以生成。靠!!原来这么简单,没人说还真不知道,之前也是纠结了好久.
命令开始:
直接生成公钥和私钥:
1)私钥生成
openssl genrsa -out private.pem 10242、把RSA私钥转换成PKCS8格式(一版为PKCS8也有PKCS1)
openssl pkcs8 -nocrypt -topk8 -in private.pem -out pkcs8.pem
3、生成公钥
openssl rsa -in private.pem -pubout -out public.pem
如下图:导出即可
问题:
在ubuntu上要使用openssl的话需要先进行安装,命令如下:
sudo apt-get install openssl
安装完成就可以使用openssl了。
此外window也是不含有内部命令的
待完成:利用程序自动生成公钥和私钥
经过完善:jar包已经开发完成
1)支持程序自动生成公钥和私钥
2)支持私钥加密公钥解密
3)支持公钥加密私钥解密
4)私钥签名认证
下面会有使用说明以及附带源码。
哎!!!!!-
之前其实一直纠结,如何实现加密,感觉"高大上",一直好奇,可是总是忙(借口),挂在待完成任务足足有一年有余,
这两天终于决定突破一下,网上搜索了很多资料,也问了一些朋友,最终把开发当中用到的已经封装成独立加密的jar。
主要解决:客户端调用接口服务之间信息加密传送。
调用方法说明:
String url="http://www.shininas.com/service"; // System.out.println(encodeData("getSur","{age:12}"));; // 0、秘钥生成 KeyGenerator keyGenerator=new KeyGenerator(); System.out.println("---------------0、生成秘钥---------------"); boolean flay=keyGenerator.genKeyPair("E:/key","testmd5.keystore") ; System.out.println(flay); //1、客户端 公钥加密 传输数据给服务端 Map<String,Object> map=AuthUtils.encodeClient(url, AuthUtils.loadKeyByFile("E:/key/publicKey.keystore")); System.out.println("---------------1、客户端 公钥加密 传输数据给服务端:加密后的key:value---------------"); System.out.println(map); //2、服务端 私钥解密数据获取内容 String content=AuthUtils.decodeServer(map, AuthUtils.loadKeyByFile("E:/key/privateKey.keystore")); System.out.println("---------------2、服务端 私钥解密数据获取内容---------------"); System.out.println(content); RSA2028 rsa2028=new RSA2028(); //3、服务端加密数据返回客户端 System.out.println("---------------3、服务端私钥加密数据---------------");; String enServer= rsa2028.encryptPrivateSignServer("testpwdmd5", AuthUtils.loadKeyByFile("E:/key/privateKey.keystore")); System.out.println(enServer); //4、服务端加密 System.out.println("---------------4、客户端公钥解密---------------"); String bb= rsa2028.decryptPublicSignClient(enServer, AuthUtils.loadKeyByFile("E:/key/publicKey.keystore")); //Base64.decode(publicKey); System.out.println(bb); //5、服务端数字签名 System.out.println("---------------5、私钥签名过程------------------"); String sigContent = "ihep_这是用于签名的原始数据"; String signstr = RSASignature.sign(sigContent,AuthUtils.loadKeyByFile("E:/key/privateKey.keystore")); System.out.println("5、签名原串:" + sigContent); System.out.println("签名串:" + signstr); System.out.println("---------------6、公钥校验签名------------------"); System.out.println("签名原串:" + sigContent); System.out.println("签名串:" + signstr); System.out.println("验签结果:" + RSASignature.doCheck(sigContent, signstr, AuthUtils.loadKeyByFile("E:/key/publicKey.keystore"))); System.out.println();
测试结果
---------------0、生成秘钥--------------- true ---------------1、客户端 公钥加密 传输数据给服务端:加密后的key:value--------------- {value=kQasKLaoud8qR30oXjjxflXAgmAztDwkptCUYpAvGzylcZCJUPuwxmGzmEjdaSIovaY45urF5IRw AkWmmPlJJw==, key=WGapS5r1sC7FR9mXtae60MjLmR4nsRbdN94qGBXN8b24tkv88kIjYb7+J3bdtrFhNU2NbR1llDdw 7oPV6tcUyKgwsuYBC93/Exb1+oXpFQBCWl91tk07qniCOzhMt6ogG/8fMgBXL3EBgBaWlXM7ZqUN Rv4ubiGgtzXh5jFQGGaZr+rQoL9hS9ZlsxwcjbKsWJEYOgO/LIk9cW/9Ac/2l9/RUdVddBJhEgsb /tpyc1Ac2zBsjkgEcE8phE6vLJ7xPwSpvuzAKYINV+vWTqF9U+C5VXm8NqYjfOBtJEMIGFaDPuK8 RIHmKapP3fjy0uv9dRJHvjZ2AckMKVW/rw4dTQ==} ---------------2、服务端 私钥解密数据获取内容--------------- http://www.shininas.com/service你好 ---------------3、服务端私钥加密数据--------------- E0vo3cglMJF49YA4W8C3a6gYVrMhff4OCo5HYSbOPRAo1zPaxyd9dcUuTudXMui4pOdS6ehVpM+e kf/66p3CnorfRM9ugeAoA7gBajavYVjo83VpdVkuUi1ZMxsMjZ+pYmhsHJhzP0HAil7EQPOlEoWq 7aEOoMmQ2I2lpwUg+ZpYSZ1fD94yJwnpslnXMgZFLBJ7lqbzK+FxXFXdG+NMuu38o/x+nwIDfbzd yDPzgoO3gyH80q850u9JOf/8c6/Qmxj8TfwRsVUEkUBroeuj9HlFPBjJCCkiwptukT4/XMz5j08g 2D5gghZxi3pl2al6Lqab82ug8wUcwey9a3gTig== ---------------4、客户端公钥解密--------------- testpwdmd5dm ---------------5、私钥签名过程------------------ 5、签名原串:ihep_这是用于签名的原始数据 签名串:ZI6yACK79PsEEVPq6fIwTsjP3TMVZewKyxhUsiPIv2mtn0PWP62JCdPHMkbi3vdKeKGYeWGNYJ56SBUmWblkkN3x/UElradz5VFJt9WXrtnClapZfSnA9af/EGf83xfAGf2TOp82qdfjJBKcfuwOjg8Bi9ZaqB/hdwr7j4VILITSXeBV6oRZWTeUQZS1T9EGDAIflCds6P3O3gWKhJVP9qctCU+1HgNWOYScFNae2OcdyLqYHYyLhL7n4veU+m2oDvIvL3TH35AjuPQlnfs84hzew9V/1ZWX92LQN4LYZW6Us0I6HBY/odoKnAiWhCgwz/Ridig6cFxWE/SSqWfBZg== ---------------6、公钥校验签名------------------ 签名原串:ihep_这是用于签名的原始数据 签名串:ZI6yACK79PsEEVPq6fIwTsjP3TMVZewKyxhUsiPIv2mtn0PWP62JCdPHMkbi3vdKeKGYeWGNYJ56SBUmWblkkN3x/UElradz5VFJt9WXrtnClapZfSnA9af/EGf83xfAGf2TOp82qdfjJBKcfuwOjg8Bi9ZaqB/hdwr7j4VILITSXeBV6oRZWTeUQZS1T9EGDAIflCds6P3O3gWKhJVP9qctCU+1HgNWOYScFNae2OcdyLqYHYyLhL7n4veU+m2oDvIvL3TH35AjuPQlnfs84hzew9V/1ZWX92LQN4LYZW6Us0I6HBY/odoKnAiWhCgwz/Ridig6cFxWE/SSqWfBZg== 验签结果:true
下载地址:https://download.csdn.net/download/zzhuan_1/10425211
RSA、DES混合加密解决方案、数字签名,该文件包含源码和可直接使用的jar。功能包扩0、程序自动生成公私钥。 1、客户端 公钥加密 2、服务端 私钥解密数据获取内容3、服务端私钥加密数据4、客户端公钥解密 5、私钥签名过程 6、公钥校验签名
3、 混合加密的理由
a、前面提及了RSA加解密算法和DES加解密算法这两种加解密算法,由于随着计算机系统能力的不断发展,DES的安全性比它刚出现时会弱得多,追溯历史破解DES的案例层出不穷,一台实际的机器可以在数天内破解DES是让某些人相信他们不能依赖DES的安全性的唯一方法。而相对于DES,RSA的安全性则相对高些,虽然破解RSA的案例也有,但其所付出的代价是相对大的(相对DES),如今RSA的密钥也在升级,这说明破解RSA的难度也在增大。
b、在RSA加解密算法中提及到RSA加密明文会受密钥的长度限制,这就说明用RSA加密的话明文长度是有限制的,而在实际情况我们要进行加密的明文长度或许会大于密钥长度,这样一来我们就不得不舍去RSA加密了。对此,DES加密则没有此限制。
鉴于以上两点(个人观点),单独的使用DES或RSA加密可能没有办法满足实际需求,所以就采用了RSA和DES加密方法相结合的方式来实现数据的加密。
其实现方式即:
1、信息(明文)采用DES密钥加密。
2、使用RSA加密前面的DES密钥信息。
最终将混合信息进行传递。
而接收方接收到信息后:
1、用RSA解密DES密钥信息。
2、再用RSA解密获取到的密钥信息解密密文信息。
最终就可以得到我们要的信息(明文)。
参考链接 :https://www.cnblogs.com/Jeremy2001/p/6718412.html
博客待续
更多信息可以关注LP官网 www.shinians.com