import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Random;
/**
-
AES加、解密算法工具类
*/
public class AesUtil {/**
- 内部固定key
- /
public static final String internalFixedKey=“123qazwsx”;
/* - 加密算法AES
*/
private static final String KEY_ALGORITHM = “AES”;
/**
- key的长度,Wrong key size: must be equal to 128, 192 or 256
- 传入时需要16、24、36
*/
private static final Integer KEY_LENGTH = 16 * 8;
/**
- 算法名称/加密模式/数据填充方式
- 默认:AES/ECB/PKCS5Padding
*/
private static final String ALGORITHMS = “AES/CBC/PKCS5Padding”;
/**
- 后端AES的key,由静态代码块赋值
*/
public static String key;
/**
- 不能在代码中创建
- JceSecurity.getVerificationResult 会将其put进 private static final Map<Provider,Object>中,导致内存缓便被耗尽
*/
//private static final BouncyCastleProvider PROVIDER = new BouncyCastleProvider();
static {
key = getKey();
}/**
- 获取key
*/
public static String getKey() {
StringBuilder uid = new StringBuilder();
//产生16位的强随机数
Random rd = new SecureRandom();
for (int i = 0; i < KEY_LENGTH / 8; i++) {
//产生0-2的3位随机数
int type = rd.nextInt(3);
switch (type) {
case 0:
//0-9的随机数
uid.append(rd.nextInt(10));
break;
case 1:
//ASCII在65-90之间为大写,获取大写随机
uid.append((char) (rd.nextInt(25) + 65));
break;
case 2:
//ASCII在97-122之间为小写,获取小写随机
uid.append((char) (rd.nextInt(25) + 97));
break;
default:
break;
}
}
return uid.toString();
}
/**
-
加密
-
@param content 加密的字符串
-
@param encryptKey key值
*/
public static String encrypt(String content, String encryptKey) throws Exception {
//设置Cipher对象
Cipher cipher = Cipher.getInstance(ALGORITHMS);
byte[] initParam = internalFixedKey.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM), ivParameterSpec);//调用doFinal
// 转base64
return Base64.encodeBase64String(cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)));
}
/**
-
解密
-
@param encryptStr 解密的字符串
-
@param decryptKey 解密的key值
*/
public static String decrypt(String encryptStr, String decryptKey) throws Exception {
//base64格式的key字符串转byte
byte[] decodeBase64 = Base64.decodeBase64(encryptStr);
byte[] initParam = internalFixedKey.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
//设置Cipher对象
Cipher cipher = Cipher.getInstance(ALGORITHMS);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM), ivParameterSpec);//调用doFinal解密
return new String(cipher.doFinal(decodeBase64),“UTF-8”);
}
/**
- MD5验证方法
- @param text 明文
- @param key 密钥
- @param md5 密文
- @return true/false
- @throws Exception
*/
public boolean verify(String text, String md5) throws Exception {
//根据传入的密钥进行验证
String md5Text = md5(text);
if(md5Text.equalsIgnoreCase(md5))
{
return true;
}
return false;
}
/**
- MD5方法
- @param text 明文
- @param key 密钥
- @return 密文
- @throws Exception
*/
public String md5(String text) throws Exception {
//加密后的字符串
String encodeStr= DigestUtils.md5Hex(text+“5WuQXkFmlhllL8Q3”);
return encodeStr;
}
public static void main(String[] args) throws Exception {
String a=“1234566768sdffsdfsdffs68”;
String aj=encrypt(a,“5WuQXkFmlhllL8Q3”);
System.out.println(aj);
String jm=decrypt(aj,“5WuQXkFmlhllL8Q3”);
System.out.println(jm);}
}