DES加解密工具(DES/ECB、DES/CBC)

DES加解密代码如下:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Arrays;

/**
 * @author : chenfan
 * @className : MyDESUtil
 * @date : Created in 2021/12/07 16:41
 * @description : DES加密工具类
 */
public class MyDESUtil {
	/**
	 *  ECB加解密
	 * @param encrypt true:加密;false:解密
	 * @param desKey 密钥
	 * @param data  待加/解密数据
	 * @return  加/解密后结果
	 */
	private static byte[] encryptOrDecrypt(boolean encrypt, byte[] desKey,
			byte[] data) {
		if (data == null || data.length <= 0) {
			return null;
		}

		try {
			Cipher cipher;
			SecureRandom sr = new SecureRandom();
			DESKeySpec dks = new DESKeySpec(desKey);
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey key = keyFactory.generateSecret(dks);
			if (encrypt) {
				cipher = Cipher.getInstance("DES");
				cipher.init(Cipher.ENCRYPT_MODE, key, sr);
			} else {
//				cipher = Cipher.getInstance("DES/ECB/NoPadding");
				cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
				cipher.init(Cipher.DECRYPT_MODE, key, sr);
			}

			return cipher.doFinal(data);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 生成KEY
	 * @param password 密码
	 * @return 生成的KEY
	 * @throws Exception
	 */
	private static Key generateKey(String password) throws Exception {
		DESKeySpec dks = new DESKeySpec(password.getBytes("utf-8"));
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		return keyFactory.generateSecret(dks);
	}

	/**
	 * Byte[]类型数据ECB加密
	 * @param data 待加密的Byte类型数据
	 * @param desKey 数据加密key
	 * @return 加密后的数据
	 * @throws Exception 数据加密异常
	 */
	public static char[] encrypt(byte[] data, byte[] desKey) throws Exception {
		// return Base64.encode(encryptOrDecrypt(true, desKey, data));
		return new char[0];
	}

	/**
	 * Byte[]类型数据ECB解密
	 * @param data 待解密Byte类型数据
	 * @param desKey 数据解密key
	 * @return 解密后的数据
	 * @throws Exception 数据解密异常
	 */
	public static byte[] decrypt(char[] data, byte[] desKey) throws Exception {
		// TODO:luoshifei data.toString
		return encryptOrDecrypt(
				false,
				desKey,
				Base64.decode(Arrays.toString(data)));
	}

	/**
	 * DES ECB加密
	 * @param data 待加密的数据
	 * @param key 密钥
	 * @return 加密后的数据
	 * @throws Exception 数据加密异常
	 */
	public static String ecbEncrypt(String data, String key, String charset) throws Exception {

		byte[] bytes = encryptOrDecrypt(true,
				key.getBytes(Charset.forName(charset)),
				data.getBytes(Charset.forName(charset)));

		return new BASE64Encoder().encode(bytes);
	}

	/**
	 * DES ECB解密
	 * @param data 待加密数据
	 * @param key 密钥
	 * @return 解密后的数据
	 * @throws Exception 数据解密异常
	 */
	public static String ecbDecrypt(String data, String key, String charset) throws Exception {
		byte[] bytes = encryptOrDecrypt(false,
				key.getBytes(Charset.forName(charset)),
				new BASE64Decoder().decodeBuffer(data));

		return ( new String(bytes,"utf-8") );
	}


	/**
	 * DES CBC 加密
	 * @param data 待加密字符串
	 * @param password 加密密码,长度不能小于8位
	 * @param ivParam 偏移量
	 * @return 加密后内容
	 */
	public static String cbcEncrypt(String data, String password, String ivParam) {
		if (password== null || password.length() < 8) {
			throw new RuntimeException("加密失败,key不能小于8位");
		}
		if (data == null)
			return null;
		try {
			Key secretKey = generateKey(password);
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			IvParameterSpec iv = new IvParameterSpec(ivParam.getBytes("utf-8"));
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
			byte[] encrypted = cipher.doFinal(data.getBytes("utf-8"));
			return new BASE64Encoder().encode(encrypted); //此处使用BASE64做转码功能,同时能起到2次加密的作用。
		} catch (Exception e) {
			e.printStackTrace();
			return data;
		}
	}

	/**
	 * DES CBC 解密
	 * @param data 待解密字符串
	 * @param password 解密密码,长度不能小于8位
	 * @param ivParam 偏移量
	 * @return 解密后内容
	 */
	public static String cbcDecrypt(String data, String password, String ivParam) {
		if (password== null || password.length() < 8) {
			throw new RuntimeException("加密失败,key不能小于8位");
		}
		if (data == null)
			return null;
		try {
			Key secretKey = generateKey(password);
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			IvParameterSpec iv = new IvParameterSpec(ivParam.getBytes("utf-8"));
			cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
			byte[] encrypted = new BASE64Decoder().decodeBuffer(data);//先用base64解密
			byte[] original = cipher.doFinal(encrypted);
			return  ( new String(original,"utf-8") );
		} catch (Exception e) {
			e.printStackTrace();
			return data;
		}
	}


}

测试样例:

public static void main(String[] args){
	String test = "{\n" +
			"\t\"username\":\"admin\",\n" +
			"\t\"password\":\"123456\",\n" +
			"\t\"info\":\"加解密测试信息\"\n" +
			"}";
	String key ="12345678";
	String iv ="abcdefgh";
	String ecbEncrypt = null;
	String ecbDecrypt = null;
	String cbcEncrypt = null;
	String cbcDecrypt = null;
	try {
		ecbEncrypt = MyDESUtil.ecbEncrypt(test, key, "UTF-8");
		ecbDecrypt = MyDESUtil.ecbDecrypt(ecbEncrypt, key, "UTF-8");
		System.out.println("DES ECB加密结果: " + ecbEncrypt);
		System.out.println("DES ECB解密结果: " + ecbDecrypt);
	} catch (Exception e) {
		e.printStackTrace();
	}
	cbcEncrypt = MyDESUtil.cbcEncrypt(test, key, iv);
	cbcDecrypt = MyDESUtil.cbcDecrypt(cbcEncrypt, key, iv);

	System.out.println("DES CBC加密结果: " + cbcEncrypt);
	System.out.println("DES CBC解密结果: " + cbcDecrypt);
}

测试结果:

"C:\Program Files (x86)\Java \jdk1.8.0_74\bin/java.exe" ...
DES ECB加密结果: 5YLhyu5EcCAxqfASX3jNuPe8rffaQ+caXcz0CUqB7/FsH4PLlg5U6fZTGuiGOrqZ8xyte+5RYKM9
k0i4Q2DfsgVWj1zC4JYz1eM+z8RculY=
DES  ECB解密结果:{
	"username":"admin",
	"password":"123456",
	"info":"加解密测试信息"
}
DES  CBC加密结果: wZclRYPEcNS6YrzLe9QTAznLNflU8ORYjt5LstDBFouyYia9J5JKPFXVIbGZamCO9EKpSyNvY1I/
kVhKcbY3WcSrioAaI4zevhMwgQXqjHc=
CBC解密结果:{
	"username":"admin",
	"password":"123456",
	"info":"加解密测试信息"
}
Process finished with exit code 0
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出Java中提供了3DES加解密工具类,同时支持ECBCBC两种加密模式。如果需要使用3DESCBC解密工具类,可以按照以下步骤进行操作: 1. 导入相关的Java类库。 2. 创建3DESCBC解密工具类的实例。 3. 调用解密方法,传入密文和密钥等参数。 4. 获取解密后的明文数据。 下面是一个简单的示例代码: ``` import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Java3DESCBCDecryptUtil { private static final String ALGORITHM = "DESede"; private static final String TRANSFORMATION = "DESede/CBC/PKCS5Padding"; private static final String CHARSET = "UTF-8"; public static String decrypt(String key, String iv, String encryptedData) throws Exception { byte[] keyBytes = key.getBytes(CHARSET); byte[] ivBytes = iv.getBytes(CHARSET); byte[] encryptedBytes = Base64.decodeBase64(encryptedData.getBytes(CHARSET)); SecretKey secretKey = new SecretKeySpec(keyBytes, ALGORITHM); IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, CHARSET); } } ``` 在上面的代码中,我们使用了Java中的Cipher类来进行解密操作。同时,我们还需要提供密钥和初始化向量等参数。在实际使用中,我们可以根据具体的需求来修改代码中的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值