LP框架组件:RSA+DES混合加密实现详解

数据安全传输 越来越被关注,在互联网时代如何保证数据传输安全?那就是数据加密

本文将从代码实现角度解析RSA+DES混合加密进行数据传输。

曾经有这样的疑问:

1、RSA是什么?公钥和私钥有什么区别?

2、DES在加密当中又起到了什么作用?

3、秘钥又是怎么生成的?


等等....


-----------------------问题解决开始--------------------------------

1、密钥匙是如何产生的

简单的来说,有的linux系统自带通过命令简单几句就可以生成。靠!!原来这么简单,没人说还真不知道,之前也是纠结了好久.

命令开始:

直接生成公钥和私钥:


1)私钥生成

openssl genrsa -out private.pem 1024
2、把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、公钥校验签名



或者公众号回复 关键字“RSA ”直接获得


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




猜你喜欢

转载自blog.csdn.net/zzhuan_1/article/details/80367121