Java 3DES加密工具类

工作模式:ECB
填充方式:PKCS7
密钥长度:32位
输出格式:Base64

maven
描述:目前Java要实现PKCS7Padding填充模式的加密,需要借助第三方Jar包才可以实现,就是在初始化的时候 Security.addProvider 增加第三方的提供者

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.56</version>
</dependency>

代码仅供参考

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 3DES加密工具类
 * 工作模式:ECB
 * 填充方式:PKCS7
 * 密钥长度:32位
 * 输出格式:Base64
 * @Author Let's go Lakers
 * @Date 2023/11/1
 **/
public class DESedeUtil {

    /**
     * 问题报错:java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
     * java默认支持是PKCS5Padding填充方式
     * 目前Java要实现PKCS7Padding填充模式的加密,需要借助第三方Jar包才可以实现,就是在初始化的时候 Security.addProvider 增加第三方的提供者
     * 使用DES/ECB加密,加入下面的静态代码块来添加默认加密提供者即可
     */
    static {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    private static final String ALGORITHM = "DESede";
    private static final String TRANSFORMATION = "DESede/ECB/PKCS7Padding";
    private static final String CHARSET = "UTF-8";
    /**
     * 加密密钥
     */
    private static final String KEY = "3vQV2AhmUp999999ykKsDIDERkbRJKvd";

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) throws Exception {

        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("TRANDATE", "20230906");
        paramMap.put("ACCTNO", "51820****0029348");
        paramMap.put("ACCTNONAME", "兰州市城关***");
        paramMap.put("JOURNO", "911005000024");

        String toJsonStr = JSONUtil.toJsonStr(paramMap);
        System.out.println(sdf.format(new Date()) + " 加密前报文:" + toJsonStr);
        String desEncryptECB = encrypt(toJsonStr);
        System.out.println(sdf.format(new Date()) + " 加密后报文:" + desEncryptECB);
        System.out.println(sdf.format(new Date()) + " 解密后报文:" + decrypt(desEncryptECB));

        String result = HttpUtil.post("https://114.255.114.***CHECK", desEncryptECB, 1500);
        System.out.println(sdf.format(new Date()) + " 返回结果:" + result);
        System.out.println("解密后结果:" + decrypt(result));
    }

    // 加密
    public static String encrypt(String plainText) throws Exception {
        byte[] keyBytes = KEY.getBytes(CHARSET);
        DESedeKeySpec spec = new DESedeKeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
        SecretKey secretKey = keyFactory.generateSecret(spec);

        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(CHARSET));
        return Base64.encodeBase64String(encryptedBytes);
    }

    // 解密
    public static String decrypt(String encryptedText) throws Exception {
        byte[] keyBytes = KEY.getBytes(CHARSET);
        DESedeKeySpec spec = new DESedeKeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
        SecretKey secretKey = keyFactory.generateSecret(spec);

        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        byte[] encryptedBytes = Base64.decodeBase64(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes, CHARSET);
    }

}

打印输出

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值