ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java:AES、MD5等java加解密

2020-04-05 17:41:31  阅读:309  来源: 互联网

标签:AES java String Author 加解密 final secretKey planText public


1、新建EncryptEnums枚举,用于定义组件提供的加解密种类

 

package com.hua.common.tools.encrypt;

import lombok.Getter;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:03
 **/
@Getter
public enum EncryptEnums {

    AES("AES"),
    MD5("MD5"),
    ;
    private String type;

    EncryptEnums(String type) {
        this.type = type;
    }
}

2、新建EncryptException类,用于自定义异常类

 

package com.hua.common.tools.encrypt;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:05
 **/
public class EncryptException extends RuntimeException {

    private String code;

    private String message;

    public EncryptException(String message) {
        super(message);
    }

    public EncryptException(String code, String message) {
        super(message);
        this.code = code;
        this.message = message;
    }

    public EncryptException(String message, Throwable cause) {
        super(message, cause);
    }
}

3、新建EncryptFactory ,用于初始化具体加解密组件

 

package com.hua.common.tools.encrypt;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:40
 **/
public final class EncryptFactory {

    protected static Map<String, EncryptService> ENCRYPT_SERVICE = new ConcurrentHashMap<>();

    static {
        ENCRYPT_SERVICE.put(EncryptEnums.AES.getType(), new AesEncryptService());
    }
}

4、新建EncryptService,用于定义加解密接口

 

package com.hua.common.tools.encrypt;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 12:53
 **/
public interface EncryptService {

    /**
     * @Description:
     * @Param: [planText  明文, secretKey 秘钥]
     * @Author: hongjianhua
     * @Date: 2020/4/4 12:57
     */
    String encode(String planText, String secretKey);

    /**
     * @Description: 解密
     * @Param: [secretText 密文,secretKey  秘钥]
     * @Author: hongjianhua
     * @Date: 2020/4/4 12:55
     */
    String decode(String secretText, String secretKey);
}

5、新建AbstractEncrypt,用于提供加解密公共方法

 

package com.hua.common.tools.encrypt;

import org.apache.commons.lang3.StringUtils;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 12:58
 **/
public abstract class AbstractEncrypt implements EncryptService {

    protected final void encodeValid(String planText, String secretKey) {
        if (StringUtils.isBlank(planText)) {
            throw new EncryptException("encode planText is null");
        }
        if (StringUtils.isBlank(secretKey)) {
            throw new EncryptException("encode secretKey is null");
        }
    }
}

6、新建AesEncryptService,用于AES加解密

 

package com.hua.common.tools.encrypt;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 12:52
 **/
public class AesEncryptService extends AbstractEncrypt {

    private static final String ALGORITHMSTR = "AES";

    private static final String DEFAULT_CHARSET = "utf-8";

    private static final int SIZE = 128;

    private static final int KEY_LENGTH = 16;

    @Override
    public String encode(String planText, String secretKey) {
        super.encodeValid(planText, secretKey);
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secretKey.getBytes(), ALGORITHMSTR));
            byte[] b = cipher.doFinal(planText.getBytes(DEFAULT_CHARSET));
            /*采用base64算法进行转码,避免出现中文乱码*/
            return Base64.encodeBase64String(b);
        } catch (Exception e) {
            throw new EncryptException("AES encode exception", e);
        }

    }

    @Override
    public String decode(String secretText, String secretKey) {
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey.getBytes(), ALGORITHMSTR));
            /*采用base64算法进行转码,避免出现中文乱码*/
            byte[] encryptBytes = Base64.decodeBase64(secretText);
            byte[] decryptBytes = cipher.doFinal(encryptBytes);
            return new String(decryptBytes);
        } catch (Exception e) {
            throw new EncryptException("AES decode exception", e);
        }
    }
}

7、新建EncryptComponent类,用于提供统一对外加解密功能

 

package com.hua.common.tools.encrypt;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:43
 **/
public final class EncryptComponent {

    public static String encode(final String planText, final String secretKey, EncryptEnums encryptEnums) {
        EncryptService encryptService = EncryptFactory.ENCRYPT_SERVICE.get(encryptEnums.getType());
        String secretText = encryptService.encode(planText, secretKey);
        return secretText;
    }

    public static String decode(final String secretText, final String secretKey, EncryptEnums encryptEnums) {
        EncryptService encryptService = EncryptFactory.ENCRYPT_SERVICE.get(encryptEnums.getType());
        String planText = encryptService.decode(secretText, secretKey);
        return planText;
    }
}

本人简书地址:https://www.jianshu.com/p/ecf143a9b8a2 

标签:AES,java,String,Author,加解密,final,secretKey,planText,public
来源: https://blog.csdn.net/hong_myth/article/details/105309623

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有