Java封装DES3Util类实现CBC加密/解密

import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.HashMap;
import java.util.Map;

public class DES3Util {
    /**
     * 秘钥 长度24
     * GTQdmtWyvBjKPVmZdCpamlAX
     */
    private byte[] key;
    /**
     * 偏移量 长度为8
     * abc12345
     */
    private byte[] keyiv;

    /**
     * 无参构造函数
     * 不需要传key,直接使用默认key
     */
    public DES3Util() {
        key = "GTQdmtWyvBjKPVmZdCpamlAX".getBytes(StandardCharsets.UTF_8);
        keyiv = "abc12345".getBytes(StandardCharsets.UTF_8);
    }

    /**
     * 带参构造函数
     * 需要传key
     *
     * @param keyStr 密钥
     */
    public DES3Util(String keyStr) {
        key = keyStr.getBytes(StandardCharsets.UTF_8);
        keyiv = "abc12345".getBytes(StandardCharsets.UTF_8);
    }

    /**
     * DES3 加密
     *
     * @param str 明文字符串
     * @return 密文字符串
     */
    public String des3Encode(String str) {
        String des3String = null;
        try {
            //CBC 加密
            byte[] des3EncodeArr = des3EncodeCBC(str.getBytes());
            byte[] base64Arr = Base64.encodeBase64(des3EncodeArr);
            des3String = new String(base64Arr, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return des3String;
    }
    
    /**
     * DES3 解密
     *
     * @param str 密文字符串
     * @return 明文字符串
     */
    public String des3Decode(String str) {
        String des3String = null;
        byte[] base64Arr = Base64.decodeBase64(str);
        try {
            //CBC 解密
            byte[] des3DecodeArr = des3DecodeCBC(base64Arr);
            des3String = new String(des3DecodeArr, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return des3String;
    }

    /**
     * CBC 加密
     *
     * @param data 明文
     * @return 返回字节数组
     * @throws Exception 抛出异常信息
     */
    public byte[] des3EncodeCBC(byte[] data) throws Exception {
        Key deskey = null;
        DESedeKeySpec spec = new DESedeKeySpec(key);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("DESede" + "/CBC/PKCS5Padding");
        IvParameterSpec ips = new IvParameterSpec(keyiv);
        cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
        return cipher.doFinal(data);
    }

    /**
     * CBC  解密
     *
     * @param data 密文
     * @return 返回字节数组
     * @throws Exception 抛出异常信息
     */
    public byte[] des3DecodeCBC(byte[] data) throws Exception {
        Key deskey;
        DESedeKeySpec spec = new DESedeKeySpec(key);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("DESede" + "/CBC/PKCS5Padding");
        IvParameterSpec ips = new IvParameterSpec(keyiv);
        cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
        return cipher.doFinal(data);

    }

    /**
     * 获取用户名和密码
     *
     * @param key 根据解密字符串
     * @return 字符串数组
     */
    private String[] getUserAndPsdfromToken(String key) {
        String[] initenstr = new String[2];
        String[] str1 = key.split(",");
        if (str1.length < 1) {
            return null;
        }
        String[] str2 = str1[0].split(":");
        String[] str3 = str1[1].split(":");
        if (str2.length > 1 && str3.length > 1) {
            initenstr[0] = str2[1];
            initenstr[1] = str3[1];
        }
        return initenstr;
    }

    /**
     * 返回用户名和密码
     *
     * @param key 解密
     * @return Map
     */
    public Map<String, String> getAcountByToken(String key) {
        Map<String, String> keymap = new HashMap<String, String>();
        String[] initenstr = getUserAndPsdfromToken(key);
        assert initenstr != null;
        String username = initenstr[0];
        String password = initenstr[1];
        keymap.put("name", username);
        keymap.put("pwd", password);
        return keymap;
    }

    public static void main(String[] args) {
        // 默认keyStr
        DES3Util des3Util = new DES3Util();

//        //自定义keyStr
//        String keyStr = "GTQdmtWyvBjKPVmZdCpamlAX";
//        DES3Util des3Util = new DES3Util(keyStr);

        String encodeStr = "username:zhangsan,password:123@abc,logintime:2023-10-25 21:25:00";
        //des3Util1.des3Encode(encodeStr);
        System.out.printf("原字符串:%s%n", encodeStr);
        System.out.printf("加密结果:%s%n", des3Util.des3Encode(encodeStr));
        System.out.println("************************************************************************************************");
        String decodeStr = "2VAN3hN2jJCTcxp97OzAJSX8b5rAaNPvk1+VM29ztQ6B57A5PbOxSpWzMBG1SRz5n8+Xt7dcIJmcGrJTNbyg2zHWmHwJZnhZ";
        //des3Util1.des3Decode(decodeStr);
        System.out.printf("原字符串:%s%n", decodeStr);
        System.out.printf("解密结果:%s%n", des3Util.des3Decode(decodeStr));
        System.out.println("************************************************************************************************");
        System.out.printf("账号密码:%s%n", des3Util.getAcountByToken(des3Util.des3Decode(decodeStr)));
        Map<String, String> mapToken = des3Util.getAcountByToken(des3Util.des3Decode(decodeStr));
        System.out.printf("解密信息:%s%n", mapToken);
        JSONObject jsonObject = new JSONObject(mapToken);
        if (jsonObject.containsKey("name") && null != jsonObject.getString("name")) {
            System.out.printf("用户名:%s%n", jsonObject.getString("name"));
        }
        if (jsonObject.containsKey("pwd") && null != jsonObject.getString("pwd")) {
            System.out.printf("密码:%s%n", jsonObject.getString("pwd"));
        }
//        原字符串:username:zhangsan,password:123@abc,logintime:2023-10-25 21:25:00
//        加密结果:2VAN3hN2jJCTcxp97OzAJSX8b5rAaNPvk1+VM29ztQ6B57A5PbOxSpWzMBG1SRz5n8+Xt7dcIJmcGrJTNbyg2zHWmHwJZnhZ
//                ************************************************************************************************
//        原字符串:2VAN3hN2jJCTcxp97OzAJSX8b5rAaNPvk1+VM29ztQ6B57A5PbOxSpWzMBG1SRz5n8+Xt7dcIJmcGrJTNbyg2zHWmHwJZnhZ
//        解密结果:username:zhangsan,password:123@abc,logintime:2023-10-25 21:25:00
//                ************************************************************************************************
//        账号密码:{name=zhangsan, pwd=123@abc}
//        解密信息:{name=zhangsan, pwd=123@abc}
//        用户名:zhangsan
//        密码:123@abc
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值