AES加密算法

在系统开发的或城中,为了安全性的考虑,我会们对一些数据进行加密的处理,这边提供了AES加密算法的java实现,有自己的一些理解,也有网上的一些代码,算是一个综合吧,有不足之处,望大家指教,话不多少,直接上代码:

package ice.snow.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * AES加密解密
 * @author Binbin.Yang
 * @date 2018-06-06
 */
public class AESUtil {

    private final static Logger logger = LoggerFactory.getLogger(AESUtil.class);

    private static final String DEFAULT_ENCRYPT_TYPE = "AES"; // 默认加密方式
    private static final String DEFAULT_ENCRYPT_METHOD = "AES/ECB/PKCS5Padding"; // 默认加密算法
    private static final String ENCODING_TYPE = "UTF-8";// 编码类型
    private static final String DEFAULT_METHOD = "SHA1PRNG";//默认算法实现

    private AESUtil(){

    }
    /**
     * 加密算法
     * @param content 需要被加密的对象
     * @param key 加密秘钥
     * @return
     */
    public static String encrypt(String content,String key){
        try{
            // 创建密码器
            Cipher cipher = Cipher.getInstance(DEFAULT_ENCRYPT_METHOD);
            // 密码器初始化为加密模式
            cipher.init(Cipher.ENCRYPT_MODE,createSecretKey(key));
            // 进行数据加密,获得相应的字节数组
            byte[] result = cipher.doFinal(content.getBytes(ENCODING_TYPE));
            // 使用base64加密返回字符串
            return paresByte2HexString(result);
        }catch (Exception e){
            logger.error("对 " +content+ " 加密出现异常",e);
        }
        return null;
    }

    /**
     * 解密算法
     * @param content 需要被解密的对象
     * @param key 解密秘钥,需和加密秘钥相同
     * @return
     */
    public static String decrypt(String content,String key){
        try{
            // 创建密码器
            Cipher cipher = Cipher.getInstance(DEFAULT_ENCRYPT_METHOD);
            // 密码器初始化为解密模式
            cipher.init(Cipher.DECRYPT_MODE,createSecretKey(key));
            // 先使用base64对内容进行解密获得字节数组,然后在进行aes解密
            byte[] result = cipher.doFinal(paresHexString2Byte(content));
            return new String(result,ENCODING_TYPE);
        }catch (Exception e){
            logger.error("对 "+content+ " 解密出现异常",e);
        }
        return null;
    }

    /**
     * 生成对应的秘钥
     * @param key
     * @return
     */
    private static SecretKeySpec createSecretKey(String key){
        try{
            // 获得指定算法加密生成器
            KeyGenerator generator = KeyGenerator.getInstance(DEFAULT_ENCRYPT_TYPE);
            // 获得随机秘钥信息,通过Instancef方法和setSeed方法进行处理,保证在不同的操作系统下生成的结果一致
            // 如果直接使用 generator.init(128,new SecureRandom(key.getBytes(ENCODING_TYPE))),会出现在linux系统下每次加密的结果不一致,
            // 这是因为SecureRandom 实现完全随操作系统本身的内部状态
            SecureRandom random = SecureRandom.getInstance(DEFAULT_METHOD);
            random.setSeed(key.getBytes(ENCODING_TYPE));
            // 指定秘钥长度,以及秘钥信息
            generator.init(128,random);
            // 生成秘钥
            SecretKey secretKey = generator.generateKey();
            // 返回AES专用秘钥
            return new SecretKeySpec(secretKey.getEncoded(),DEFAULT_ENCRYPT_TYPE);
        } catch (Exception e){
            logger.error("通过 "+key+" 获取秘钥出现异常",e);
        }
        return null;
    }

    /**
     * 二进进制转为十六进制
     * @param buf
     * @return
     */
    private static String paresByte2HexString(byte[] buf){
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 十六进制转为二进制
     * @param hexStr 必须为十六进制字符串
     * @return
     */
    private static byte[] paresHexString2Byte(String hexStr){
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length()/2];
        for (int i = 0;i< hexStr.length()/2; i++) {
            int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
            int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

}

 

posted @ 2018-07-03 16:04  冰丶丿小墨  阅读(242)  评论(0编辑  收藏  举报