import java.security.Security;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
/**
* 对称加密工具类,用于对数据使用相同的密钥和向量进行加密和解密
* 第三方包的maven依赖:
* <dependency>
<groupId>bouncycastle</groupId>
<artifactId>bouncycastle-jce-jdk13</artifactId>
<version>112</version>
<scope>runtime</scope>
</dependency>
* @author 大别山人
*/
public final class AESUtil {
private AESUtil() {throw new UnsupportedOperationException("工具类不需要实例化");}
private static final String ALGORITHM = "AES";
private static final String ALGORITHM_CBC = "AES/CBC/PKCS5Padding";
/**
* 使用指定密钥和向量对参数数据进行加密处理
* @param data 明文数据
* @param key 密钥
* @param vi 向量
* @return 密文数据(base64编码)
*/
public static final String encrypt(String data,String key,String vi) {
try {
return Base64.getEncoder().encodeToString(execute(data.getBytes(),key,vi,false));
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 使用指定密钥和向量对密文数据进行解迷处理
* @param data 密文数据
* @param key 密钥
* @param vi 向量
* @return 明文数据
*/
public static final String decrypt(String data,String key,String vi) {
try {
return new String(execute(Base64.getDecoder().decode(data.getBytes()),key,vi,true));
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
private static final byte[] execute(byte[] data,String key,String vi,boolean isDecrypt) throws Exception {
Security.addProvider(new BouncyCastleProvider());
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec ips = new IvParameterSpec(vi.getBytes());
Cipher cipher = Cipher.getInstance(ALGORITHM_CBC,"BC");
cipher.init(isDecrypt?Cipher.DECRYPT_MODE:Cipher.ENCRYPT_MODE, keySpec, ips);
return cipher.doFinal(data);
}
public static void main(String[] args) {
String key = "12345678901234561234567890123456";
String vi = "1234567890123456";
String data = "bai日依山尽,黄河入海流。123!@#!@#<>?,./";
String encrypt = encrypt(data, key, vi);
System.out.println(encrypt);
System.out.println(decrypt(encrypt, key, vi));
}
}