import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
/**
* AES加解密
*/
public class AESUtils {
/**
* 需为 16字节
*/
private static final String sKey = "CwcqTxU4EJJpfBR6";
private static final Logger log = LoggerFactory.getLogger(AESUtils.class);
/**
* 加密
* @param sourceStr 源数据
* @return
*/
public static String encrypt(String sourceStr){
try{
if(StringUtils.isEmpty(sourceStr))return null;
byte[] raw = sKey.getBytes(Constants.UTF8);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sourceStr.getBytes(StandardCharsets.UTF_8));
return Base64.encodeBase64String(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 解密
* @param encryptStr 密文数据
* @return
*/
public static String decrypt(String encryptStr){
try{
if(StringUtils.isEmpty(encryptStr))return null;
byte[] raw = sKey.getBytes(Constants.UTF8);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//先用base64解密
byte[] base64Str = Base64.decodeBase64(encryptStr);
try {
byte[] original = cipher.doFinal(base64Str);
String decryptStr = new String(original, StandardCharsets.UTF_8);
if(StringUtils.isNotEmpty(decryptStr)){
return decryptStr;
}
return encryptStr;
} catch (Exception e) {
log.error("decrypt error, string: " + encryptStr, e);
return encryptStr;
}
}catch (Exception e){e.printStackTrace();}
return null;
}
}