AES加密工具類

package com.zhjg.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

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

/**
 * AES/CBC加密工具
 * 使用128位密鑰,JDK自帶jar包不支持256位
 * 如果要使用256位密鑰需要將JDK自帶jar包替換掉
 * 在ORACLE官網搜索JCE下載後替換即可
 * @author zhjg
 *
 */
public class AesUtils {
    
	//初始向量
	private static String VECTOR = "1111111111111111";
	
	//加密器類型:加密算法爲AES,加密模式爲CBC,補碼方式爲PKCS5Padding
	private static String CIPHER_TYPE = "AES/CBC/PKCS5Padding";
	
	//算法類型:用於指定生成AES的密鑰
	private static String ALGORITHM = "AES";
	
    /**
     * AES加密
     *
     * @param plainMess:明文
     * @param key:密鑰
     * @return
     * @throws Exception
     */
    public static String encrypt(String plainMess, String key) throws Exception {
        //判空略判斷密鑰長度略
        byte[] keyBytes = key.getBytes();
        //構造密鑰
        SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, ALGORITHM);
        //創建AES加密器
        Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
        //創建初始向量iv用於指定密鑰偏移量(可自行指定但必須爲128位),因爲AES是分組加密,下一組的iv就用上一組加密的密文來充當
        IvParameterSpec iv = new IvParameterSpec(VECTOR.getBytes());
        //使用加密器的加密模式
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        //加密
        byte[] encrypted = cipher.doFinal(plainMess.getBytes());
        //使用BASE64對加密後的二進制數組進行編碼
        return new BASE64Encoder().encode(encrypted);
    }

    
    /**
     * AES解密
     *
     * @param secretMess:密文
     * @param key:密鑰
     * @return
     * @throws Exception
     */
    public static String decrypt(String secretMess, String key) throws Exception {
       //判空略判斷密鑰長度略
        byte[] keyBytes = key.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, ALGORITHM);
        Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
        IvParameterSpec iv = new IvParameterSpec(VECTOR.getBytes());
        //解密時使用加密器的解密模式
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        //使用BASE64解碼爲二進制數組,這裏是加密過的
        byte[] secretBytes = new BASE64Decoder().decodeBuffer(secretMess);
        //解密獲取未加密的二進制數組
        byte[] plainBytes = cipher.doFinal(secretBytes);
        return new String(plainBytes);

    }
    

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章