DES和RSA混合加密及解密

 实际开发过程中,RSA生成的公钥应保存在加密方,私钥应保存在解密方,可使用读取文件内容方式获取密钥。

maven依赖:

 <!-- DES --><dependency><groupId>javax.xml.rpc</groupId><artifactId>javax.xml.rpc-api</artifactId><version>1.1.1</version></dependency><!-- RSA --><dependency><groupId>org.apache.axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><!-- base64 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency>

DES工具类:

package common;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.NoSuchAlgorithmException;/*** @program: Demo* @Date: 2019/2/20 20:59* @Author: LiJc* @Description:*/
public class DESUtil {/***  生成KEY*/public static byte[] getKey(){KeyGenerator keyGenerator = null;try {keyGenerator = KeyGenerator.getInstance("DES");} catch (NoSuchAlgorithmException e) {e.printStackTrace();System.out.println("----------------KEY生成失败!");return null;}keyGenerator.init(56);SecretKey secretKey = keyGenerator.generateKey();byte[] byteKey = secretKey.getEncoded();return byteKey;}/*** DES加密** @param context* @return*/public static byte[] desEncrypt(String context, String key) {try {// KEY转换DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");SecretKey conventSecretKey = secretKeyFactory.generateSecret(desKeySpec);// 加密Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, conventSecretKey, new IvParameterSpec(key.getBytes("UTF-8")));return cipher.doFinal(context.getBytes("UTF-8"));} catch (Throwable e) {e.printStackTrace();return null;}}/*** DES解密** @param context* @return*/public static byte[] desDecrypt(byte[] context, String key) {try {// KEY转换DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");SecretKey conventSecretKey = secretKeyFactory.generateSecret(desKeySpec);// 解密Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, conventSecretKey, new IvParameterSpec(key.getBytes("UTF-8")));return cipher.doFinal(context);} catch (Throwable e) {e.printStackTrace();return null;}}
}

RSA工具类:

package common;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;import javax.crypto.Cipher;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** @program: Demo* @Date: 2019/2/21 22:56* @Author: LiJc* @Description:*/
public class RSAUtil {/*** 转密钥字符串(base64编码)** @return*/public static String getKeyString(Key key) throws Exception {byte[] keyBytes = key.getEncoded();String s = new String(Base64.encodeBase64(keyBytes));return s;}/*** 得到公钥* @param publicKey 密钥字符串(经过base64编码)* @throws Exception*/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {//通过X509编码的Key指令获得公钥对象KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);return key;}/*** 得到私钥* @param privateKey 密钥字符串(经过base64编码)* @throws Exception*/public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {//通过PKCS#8编码的Key指令获得私钥对象KeyFactory keyFactory = KeyFactory.getInstance("RSA");PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);return key;}/*** 生成密钥对* @param pubfilePath 公钥存放的文件路径* @param prifilePath 私钥存放的文件路径*/public static void genKeyPair(String pubfilePath, String prifilePath) {// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024, new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();try {// 得到公钥字符串String publicKeyString = getKeyString(publicKey);// 得到私钥字符串String privateKeyString = getKeyString(privateKey);// 将密钥对写入到文件FileWriter pubfw = new FileWriter(pubfilePath);FileWriter prifw = new FileWriter(prifilePath);BufferedWriter pubbw = new BufferedWriter(pubfw);BufferedWriter pribw = new BufferedWriter(prifw);pubbw.write(publicKeyString);pribw.write(privateKeyString);pubbw.flush();pubbw.close();pubfw.close();pribw.flush();pribw.close();prifw.close();} catch (Exception e) {e.printStackTrace();}}/*** 公钥加密* @param data     需要加密的内容* @param publicKey  公钥* @return*/public static String publicEncrypt(String data, RSAPublicKey publicKey){try{Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);return new String(Base64.encodeBase64(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes("UTF-8"), publicKey.getModulus().bitLength())));}catch(Exception e){throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);}}/*** 私钥解密* @param data           需要加密的内容* @param privateKey 私钥* @return*/public static String privateDecrypt(String data, RSAPrivateKey privateKey){try{Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), "UTF-8");}catch(Exception e){throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);}}private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize){int maxBlock = 0;if(opmode == Cipher.DECRYPT_MODE){maxBlock = keySize / 8;}else{maxBlock = keySize / 8 - 11;}ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] buff;int i = 0;try{while(datas.length > offSet){if(datas.length-offSet > maxBlock){buff = cipher.doFinal(datas, offSet, maxBlock);}else{buff = cipher.doFinal(datas, offSet, datas.length-offSet);}out.write(buff, 0, buff.length);i++;offSet = i * maxBlock;}}catch(Exception e){throw new RuntimeException("加解密阀值为["+maxBlock+"]的数据时发生异常", e);}byte[] resultDatas = out.toByteArray();IOUtils.closeQuietly(out);return resultDatas;}
}

单元测试:
注意:RSA用到的密钥对为上一篇文章生成的 https://blog.csdn.net/JcMR_Li/article/details/87873079

package common;import org.apache.commons.codec.binary.Base64;
import org.junit.Test;import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;/*** @program: Demo* @Date: 2019/2/22 10:18* @Author: LiJc* @Description:*/
public class DESAndRSATest {/*** DES和RSA混合加密,先进行DES加密,将DES加密后的内容进行base64编码,再将base64编码的DES进行RSA加密*/@Testpublic void test1() throws InvalidKeySpecException, NoSuchAlgorithmException {String deskey = "password";//des密钥//长度8位String content = "真香警告!"; //内容System.out.println("原始加密内容为:"+content);//DES加密byte[] encryptbyte =  DESUtil.desEncrypt(content, deskey); //加密后返回为字节数组String descontent = Base64.encodeBase64String(encryptbyte);System.out.println("DES加密后内容为:"+ descontent);//RSA部分startString pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQ1IqhPNo8M/R1pHpocNuJ6enntJoB7OAaJrVoaHbvJOI4APkheX0J1UKizOGQNRr/V6vp3B+3MrPVGJ4lfRirrgnIK86PD5K/MChSWhxslWf3jQxr7AO8rMIPre7uoGjmY3pbSY82QUGDEhgDVsWTLTjWWqFQHVTwEfBPGgaktQIDAQAB";//根据公钥key获取公钥RSAPublicKey publicKey =  RSAUtil.getPublicKey(pubkey);//RSA加密String rsacontent = RSAUtil.publicEncrypt(descontent, publicKey);System.out.println("RSA加密后内容为:"+rsacontent);String prikey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJDUiqE82jwz9HWkemhw24np6ee0mgHs4BomtWhodu8k4jgA+SF5fQnVQqLM4ZA1Gv9Xq+ncH7cys9UYniV9GKuuCcgrzo8Pkr8wKFJaHGyVZ/eNDGvsA7yswg+t7u6gaOZjeltJjzZBQYMSGANWxZMtONZaoVAdVPAR8E8aBqS1AgMBAAECgYBtteOSApPa2QyM9VyYsy1LCrvafs/PN44HoVz4S3IU9B69h9cxCWOzyC3jP0p7QA9EcDhVPh90Wl8pxK0//sRpWZrKps3ZqCQKogLSHTIaRJvvgQwN26KtIwSoXDwKqpmyhufIhXdFDmSIKb8v8rF3Sl3Mt5I+hDT83fnTjyPUPQJBAOBNObrgZQ7CvMuwtKilWhAqlNbhibfc3k4dtJ+23uixUgHq+WME6w7B0NUixT6ua7v+RKZD1RO9ANDGCEIQzfsCQQClTDPsjrkerRBsXrge6xK2drisIpEFBdYoIz9lYmCHXJctkx5nhLogxxTeAJgFWBIcOgrx5OCYOQgr5p6FikkPAkA45j470sqwCOR9w3DAy1lienrRW9tkwem+5Tg5v9kiLEFCbUogPVInpzEDsFNbCEIaKXFewBxganS3gVT89WhbAkAV90NrKyg0iGEHVar4CNsKvkoaLdnBph3oZY62JVWYh1hbqRJARWYKlwoR2lhZVXPKpnfv3y9tax7H3rSwIElHAkB7j65B6+L8Ty0RiEzHCOVXnUoUTai/BZfQ5erA9yVM/VW8p1mE/qhJOTQ5hFniO0dicl3YZyaYHW1D+Z1V4naO";//获取私钥RSAPrivateKey privateKey = RSAUtil.getPrivateKey(prikey);//RSA解密String content1 = RSAUtil.privateDecrypt(rsacontent, privateKey);System.out.println("RSA解密后内容为:"+content1);//RSA部分end//DES解密byte[] decryptbyte = DESUtil.desDecrypt(Base64.decodeBase64(content1), deskey);  //将加密后返回的字节数组进行解密System.out.println("DES解密后内容为:"+ new String(decryptbyte));}
}

测试结果:

DES和RSA混合加密及解密-JAVA相关推荐

  1. DES和RSA混合加密解密

    关于DES和RSA各自单独加密的弊端大家自行学习吧,本文使用对称式加密算法DES和非对称式加密算法RSA结合做数据加密的方式,先进行DES加密,将DES加密后的内容进行base64编码,再将base6 ...

  2. 一张图让你搞懂DES与RSA混合加密技术

    原址 1.RSA加解密原理 第1步:ipB先给A发送B公钥,ipA用B公钥加密A公钥发送给ipB,ipB拿到后,用B私钥去取里面内容,ipB拿到A公钥. 第2步:双方通信前,先把自己公钥发给对方!用对 ...

  3. AES与RSA混合加密完整实例

    前段时间看到一篇文章讲如何保证API调用时数据的安全性(传送门:https://blog.csdn.net/ityouknow/article/details/80603617),文中讲到利用RSA来 ...

  4. WebSocket数据加密——AES与RSA混合加密

    前言 之前在写"一套简单的web即时通讯",写到第三版的时候没什么思路,正好微信公众号看到一篇讲API交互加密,于是就自己搞了一套AES与RSA混合加密,无意中产生应用在WebSo ...

  5. RSA非对称加密和解密(同时生成密钥)

    RSA非对称加密和解密(同时生成密钥) 准备jar包 bcprov-jdk16-1.46.jar commons-codec-1.15.jar 获取jar地址:https://mvnrepositor ...

  6. RSA前端加密后端解密

    前面说过接口数据在后端如何使用RSA加解密 这里遇到了使用RSA前端加密后端解密的需求. 实现方式如下: 1.后端的RSA工具 package com.ieslab.interactivequery. ...

  7. RSA加密与解密(Java实现)

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. RSA的应用 RSA是一种非对称加密算法.现在,很多登陆 ...

  8. 对称非对称算法混合加密实战(DES和AES混合加密)

    最近需要用加密算法,开始研究加密算法,果然大学落下的需要全都补回来.泪奔啊! 网上找各种资料,看别人的原理解释看了了很多,使用非对称算法和对称算法混合加密在实际项目中是经常用的,但原理听的差不多,没有 ...

  9. RSA非对称加密简析-java

    1 非对称加密算法 1.1 概述 1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这 ...

最新文章

  1. c++构建工具之cmake使用小结
  2. WDK tips (9.1) 同步机制与锁
  3. c语言程序设计 函数说课,《C语言程序设计》之函数说课课件.ppt
  4. php连接虚拟机中mysql数据库吗,PHP连接MySQL数据库的三种方式
  5. 【杂文】Vue 杂文
  6. gcc4.4下实现backtrace代码
  7. node.js上传图片
  8. 解析数论导轮中的数学实验(python)
  9. python个人简历-个人简历
  10. SpringIOC和DI简单总结
  11. 奔腾的芯——英特尔公司
  12. python实时监控文件目录_教你三种方法,用 Python实时监控文件
  13. 计算机算最大值如何操作,如何合理设置计算机的虚拟内存值(初始大小及最大值)?...
  14. 8086/8088 寻址方式
  15. 如何找到微信公众号的视频链接及视频?
  16. hpm128无法共享打印_HP M128fn打印机共享后无法打印
  17. 对比这10个注意事项,你的网页文字排版达标了么?
  18. 阿里云(云呼叫中心)API接口
  19. 单片机——IIC协议与24C02
  20. 地铁杂记 - 风寒咳嗽

热门文章

  1. Ts定义对象和数组类型
  2. 爬取所有地区的历史天气
  3. win10桌面显示未激活
  4. Elasticsearch——Windows下ES集群部署 Linux下ES单节点、集群部署
  5. docker 部署 subversion
  6. 对Android中arm64-v8a、armeabi-v7a、armeabi、x86认识
  7. 创建自己的手册 um命令
  8. Python车牌的正则表达式
  9. Cognex Visionpro-9.5 software handbook translate
  10. Android AC97驱动杂记