AES加密算法

在系統開發的或城中,爲了安全性的考慮,我會們對一些數據進行加密的處理,這邊提供了AES加密算法的java實現,有本身的一些理解,也有網上的一些代碼,算是一個綜合吧,有不足之處,望你們指教,話很少少,直接上代碼: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;
    }

}
相關文章
相關標籤/搜索