最近筆者工作中涉及到AES加密解密開始很懵到網上找了很多文章都沒解決最後通過不懈努力終於解決所以在此記錄解決方法希望給能你們帶來幫助。
簡介啥的我就不多說了網上一搜一大把如果需要了解請自行百度這裏我直接上代碼。
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
/**
* AES解密工具類
*/
public class AESUtil {
/**
* 密鑰
*/
private static String mKey="flde@@13sdf*@345";
/**
* 加解密算法/工作模式/填充方式 AES/ECB/PKCS5Padding、AES/ECB/PKCS7Padding
*/
private static String mTransformation="AES/ECB/PKCS5Padding";
/**
* 算法
*/
private static String mAlgorithm="AES";
/**
* 編碼格式
*/
private static String mCharset="utf-8";
/**
* 解密
* @param s
* @return
*/
public static String decrypt(String s) {
return decodeAES(s);
}
/**
* 解密
* @param s
* @return
*/
public static String encrypt(String s) {
return encryptAES(s);
}
/**
* 加密
* @param data
* @return
*/
private static String encryptAES(String data){
try {
byte[] raw = mKey.getBytes(mCharset);
SecretKeySpec skeySpec = new SecretKeySpec(raw, mAlgorithm);
Cipher cipher = Cipher.getInstance(mTransformation);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(data.getBytes(mCharset));
return encryptBASE64(encrypted);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return null;
}
/**
* 解密AES
* @param data
* @return
* @throws Exception
*/
private static String decodeAES(String data) {
try {
byte[] raw = mKey.getBytes(mCharset);
SecretKeySpec skeySpec = new SecretKeySpec(raw, mAlgorithm);
Cipher cipher = Cipher.getInstance(mTransformation);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encrypted1 = decryptBASE64(data);
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, mCharset);
return originalString;
} catch (Exception e) {
return null;
}
} catch (Exception ex) {
return null;
}
}
/**
* BASE64解密
* @param key
* @return
* @throws Exception
*/
private static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* BASE64加密
* @param key
* @return
*/
private static String encryptBASE64(byte[] key){
return (new BASE64Encoder()).encodeBuffer(key);
}
}
調用方法
public static void main(String[] args) {
//需加/解密前字符串
String data = "\t{\"name\":\"winks\",\"city\":\"成都\"}";
System.out.println("需要加密解密字符串:"+data);
String dataE = encrypt(data);
System.out.println("加密後字符串:"+dataE);
String dataD = decrypt(dataE);
System.out.println("解密後字符串:"+dataD);
}
調用結果
注:在加密解密的時候一定要注意密鑰、編碼格式、加解密算法/工作模式/填充方式一定要切記因爲筆者就犯過類似的錯誤。
如果需要驗證數據是否正確可以使用AES在線加/解密工具查看,希望我的方法能解決你的問題。