/**
|
* Alipay.com Inc.
|
* Copyright (c) 2004-2020 All Rights Reserved.
|
*/
|
package com.alipay.easysdk.kernel.util;
|
|
import com.alipay.easysdk.kernel.AlipayConstants;
|
import org.bouncycastle.util.encoders.Base64;
|
|
import javax.crypto.Cipher;
|
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.SecretKeySpec;
|
|
/**
|
* 加密工具
|
*/
|
public class AES {
|
private static final String AES_ALG = "AES";
|
private static final String AES_CBC_PCK_ALG = "AES/CBC/PKCS5Padding";
|
private static final byte[] AES_IV = initIV();
|
|
/**
|
* AES加密
|
*
|
* @param plainText 明文
|
* @param key 对称密钥
|
* @return 密文
|
*/
|
public static String encrypt(String plainText, String key) {
|
try {
|
Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
|
|
IvParameterSpec iv = new IvParameterSpec(AES_IV);
|
cipher.init(Cipher.ENCRYPT_MODE,
|
new SecretKeySpec(Base64.decode(key.getBytes()), AES_ALG), iv);
|
|
byte[] encryptBytes = cipher.doFinal(plainText.getBytes(AlipayConstants.DEFAULT_CHARSET));
|
return new String(Base64.encode(encryptBytes));
|
} catch (Exception e) {
|
throw new RuntimeException("AES加密失败,plainText=" + plainText +
|
",keySize=" + key.length() + "。" + e.getMessage(), e);
|
}
|
}
|
|
/**
|
* 密文
|
*
|
* @param cipherText 密文
|
* @param key 对称密钥
|
* @return 明文
|
*/
|
public static String decrypt(String cipherText, String key) {
|
try {
|
Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
|
IvParameterSpec iv = new IvParameterSpec(AES_IV);
|
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.decode(key.getBytes()), AES_ALG), iv);
|
|
byte[] cleanBytes = cipher.doFinal(Base64.decode(cipherText.getBytes()));
|
return new String(cleanBytes, AlipayConstants.DEFAULT_CHARSET);
|
} catch (Exception e) {
|
throw new RuntimeException("AES解密失败,cipherText=" + cipherText +
|
",keySize=" + key.length() + "。" + e.getMessage(), e);
|
}
|
}
|
|
/**
|
* 初始向量的方法,全部为0
|
* 这里的写法适合于其它算法,AES算法IV值一定是128位的(16字节)
|
*/
|
private static byte[] initIV() {
|
try {
|
Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
|
int blockSize = cipher.getBlockSize();
|
byte[] iv = new byte[blockSize];
|
for (int i = 0; i < blockSize; ++i) {
|
iv[i] = 0;
|
}
|
return iv;
|
} catch (Exception e) {
|
int blockSize = 16;
|
byte[] iv = new byte[blockSize];
|
for (int i = 0; i < blockSize; ++i) {
|
iv[i] = 0;
|
}
|
return iv;
|
}
|
}
|
}
|