package com.fpi.epoch.pms.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
/**
* 对称加密解密AES算法
*
*/
public class AesUtils {
//private static final Logger logger = LoggerFactory.getLogger(AesUtils.class);
private static final String TRANSFORMATION ="AES/CBC/PKCS5Padding";
private static final String ALGORITHM ="AES";
private static final String CHARSET ="utf-8";
/**
* 建议为16或者32位
*/
private static final String KEY ="IU-YKEYKEYKEYKEY";
/**
* 必须16位
* 初始化向量IV不可以为32位,否则异常java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
*/
private static final String IV ="Fpi-Dmp-Fpi-Dmp~";
/**
* 加密
*
* @param context
* @return
*/
public static String encrypt(String context) {
try {
byte[]decode = context.getBytes(CHARSET);
byte[]bytes =createKeyAndIv(decode,Cipher.ENCRYPT_MODE);
BASE64Encoder base64Encoder =new BASE64Encoder();
return base64Encoder.encode(bytes);
}catch (Exception e) {
//logger.error("AES", e);
}
return null;
}
/**
* 解密
*
* @param context
* @return
*/
public static String decrypt(String context) {
try {
BASE64Decoder decoder =new BASE64Decoder();
byte[]decode =decoder.decodeBuffer(context);
byte[]bytes =createKeyAndIv(decode,Cipher.DECRYPT_MODE);
return new String(bytes,CHARSET);
}catch (Exception e) {
//logger.error("AES", e);
}
return null;
}
/**
* 获取key & iv
*
* @param context
* @param opmode
* @return
* @throws Exception
*/
public static byte[]createKeyAndIv(byte[] context,int opmode)throws Exception {
byte[]key =KEY.getBytes(CHARSET);
byte[]iv =IV.getBytes(CHARSET);
return cipherFilter(context, opmode,key,iv);
}
/**
* 执行操作
*
* @param context
* @param opmode
* @param key
* @param iv
* @return
* @throws Exception
*/
public static byte[]cipherFilter(byte[] context,int opmode,byte[] key,byte[] iv)throws Exception {
Key secretKeySpec =new SecretKeySpec(key,ALGORITHM);
AlgorithmParameterSpec ivParameterSpec =new IvParameterSpec(iv);
Cipher cipher =Cipher.getInstance(TRANSFORMATION);
cipher.init(opmode,secretKeySpec,ivParameterSpec);
return cipher.doFinal(context);
}
/**
* 主方法测试
*
* @param args
*/
public static void main(String[] args) {
String context ="123456";
System.out.println("元数据" +context);
String encrypt =encrypt(context);
System.out.println("加密之后:" +encrypt);
String decrypt =decrypt(encrypt);
System.out.println("解密之后:" +decrypt);
String wt =decrypt("OkDOYrdBTBcq36OKApyAlA==");
System.out.println("wt=" +wt);
}
}
网友评论