Java 加解密工具类(AES,DES,DES3)

文章介绍了如何在Java中使用内置工具类实现AES、DES和DES3的加解密功能,包括加密算法的选择、参数设置以及提供了一个测试类进行实例演示。
摘要由CSDN通过智能技术生成

前言

实际工作中做了一个请求API的服务,在请求第三方API时需要配置是否对请求内容进行加密,需求要求的加密的算法为AES,DES,DES3。

可以使用Java自带的加解密工具类来实现

代码

加解密算法枚举类

enum EncryptType {
    DES(1, "DES", 56),
    AES(2, "AES", 128),
    DES3(3, "DESede", 168);

    static {
        map = Arrays.stream(values()).collect(toMap(EncryptUtils.EncryptType::getValue, e -> e));
    }

    private final Integer value;

    private final String desc;

    private final Integer keySize;

    private static final Map<Integer, EncryptUtils.EncryptType> map;

    EncryptType(Integer value, String desc, Integer keySize) {
        this.value = value;
        this.desc = desc;
        this.keySize = keySize;
    }

    public Integer getValue() {
        return this.value;
    }

    public String getDesc() {
        return this.desc;
    }

    public Integer getKeySize() {
        return keySize;
    }

    public static EncryptUtils.EncryptType getEncryptType(Integer value) {
        return map.getOrDefault(value, DES);
    }
}

加解密工具类

/**
 * 加密算法:DES AES DESede
 * 加密模式:ECB CBC CTR OFB CFB
 * 填充方式:PKCS5Padding PKCS7Padding
 */
public class EncryptUtils {

    /**
     * 通用加密方法
     *
     * @param encryptType 加密算法
     * @param encryptString 加密算法/加密模式/填充方式
     * @param encryptKey 密钥
     * @param content 明文
     * @return 密文
     */
    public static String encrypt(Integer encryptType, String encryptString, String encryptKey, String content) {
        try {
            EncryptType type = EncryptType.getEncryptType(encryptType);

            KeyGenerator kgen = KeyGenerator.getInstance(type.getDesc());
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(encryptKey.getBytes());
            kgen.init(type.getKeySize(), secureRandom);
            SecretKey secretKey = kgen.generateKey();
            // 生成实例(加解密算法/工作方式/填充方式)
            Cipher cipher = Cipher.getInstance(encryptString);
            // (模式(加密模式),转换的key)
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secretKey.getEncoded(), type.getDesc()));
            // 加密
            byte[] bytes = cipher.doFinal(content.getBytes());
            return Base64.getEncoder().encodeToString(bytes);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
                 IllegalBlockSizeException | BadPaddingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 通用加密方法
     *
     * @param encryptType 加密算法
     * @param encryptString 加密算法/加密模式/填充方式
     * @param encryptKey 密钥
     * @param content 密文
     * @return 明文
     */
    public static String decrypt(Integer encryptType, String encryptString, String encryptKey, String content) {
        try {
            EncryptType type = EncryptType.getEncryptType(encryptType);

            KeyGenerator kgen = KeyGenerator.getInstance(type.getDesc());
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(encryptKey.getBytes());
            kgen.init(type.getKeySize(), secureRandom);
            SecretKey secretKey = kgen.generateKey();
            // 生成实例(加解密算法/工作方式/填充方式)
            Cipher cipher = Cipher.getInstance(encryptString);
            // (模式(解密模式),转换的key)
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey.getEncoded(), type.getDesc()));
            // 解密
            byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(content));
            return new String(bytes);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
                 IllegalBlockSizeException | BadPaddingException e) {
            throw new RuntimeException(e);
        }
    }

}

测试类

class EncryptUtilsTest {

    @Test
    void encrypt() {
        String encryptKey = "123456789123456789123456789123456789";
        String content = "qwertyuiopasdfgghjklzxcvvbnm";

        String encryptString = "DES/ECB/PKCS5Padding";
        String encode = EncryptUtils.encrypt(DES.getValue(), encryptString, encryptKey, content);
        System.out.println(encode);
        String decode = EncryptUtils.decrypt(DES.getValue(), encryptString, encryptKey, encode);
        System.out.println(decode);

        encryptString = "AES/ECB/PKCS5Padding";
        encode = EncryptUtils.encrypt(AES.getValue(), encryptString, encryptKey, content);
        System.out.println(encode);
        decode = EncryptUtils.decrypt(AES.getValue(), encryptString, encryptKey, encode);
        System.out.println(decode);

        encryptString = "DESede/ECB/PKCS5Padding";
        encode = EncryptUtils.encrypt(DES3.getValue(), encryptString, encryptKey, content);
        System.out.println(encode);
        decode = EncryptUtils.decrypt(DES3.getValue(), encryptString, encryptKey, encode);
        System.out.println(decode);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值