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);
}
}
AES加密工具類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.