import org.apache.commons.lang.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/**
* @author yang
* @Title: AESUtil.java
* @Package
* @Description: AES加解密
* @date 2018年11月05日 13:46
*/
public class AESUtil {
//偏移量
static final public byte[] KEY_VI = "1234567812345678".getBytes();//{ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8};
//编码方式
public static final String bm = "UTF-8";
/**
* 加密方法
*
* @param dataPassword 密钥
* @param cleartext 明文
* @return
* @throws Exception
*/
public static String encrypt(String dataPassword, String cleartext)
throws Exception {
IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);
SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");
填充类型
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));
return new String (parseByte2HexStr(encryptedData));
}
/**
* 解密方法
*
* @param dataPassword 密钥
* @param encrypted 密文
* @return
* @throws Exception
*/
public static String decrypt(String dataPassword, String encrypted)
throws Exception {
byte[] byteMi = parseHexStr2Byte(encrypted);
IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);
SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
byte[] decryptedData = cipher.doFinal(byteMi);
return new String(decryptedData,bm);
}
/**
* 将16进制转换为二进制
*
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1) {
return null;
}
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**
* 将二进制转换成16进制
*
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**
*使用指定的字符串生成秘钥
*
* @param str 生成密钥时的加密字符串
*/
public static String getKeyByPass(String str){
try {
KeyGenerator kg = KeyGenerator.getInstance("AES");
if (StringUtils.isBlank(str)){
//随机生成密钥
kg.init(128);//要生成多少位,只需要修改这里即可128, 192或256
}else {
//使用加密参数生成密钥
//SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以生成的秘钥就一样。
kg.init(128, new SecureRandom(str.getBytes()));
}
SecretKey sk = kg.generateKey();
byte[] b = sk.getEncoded();
String s = parseByte2HexStr(b);
//System.out.println(s);
System.out.println("十六进制密钥长度为"+s.length());
System.out.println("二进制密钥的长度为"+s.length()*4);
return s;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
System.out.println("没有此算法。");
return "";
}
}
/*public static void main(String[] args) {
try {
//生成16进制的加密参数
String hex = getKeyByPass("ASINCSDSDNMA156");
System.out.println("密钥:"+hex);
//加密(加密后为16进制的字符串)
String cleartext = "系统初始化时,生成伪随机「AES密钥」";
System.out.println("明文:"+cleartext);
String encypt = encrypt(hex,cleartext);
System.out.println("加密后:"+encypt);
//解密
String decrypt = decrypt(hex ,encypt);
System.out.println("解密后:"+decrypt);
} catch (Exception e) {
e.printStackTrace();
}
}*/
}
报错提示:
java.security.InvalidKeyException: Illegal key size
解决办法:
https://blog.csdn.net/m0_37882063/article/details/88668343
执行mian方法 输出
十六进制密钥长度为32
二进制密钥的长度为128
密钥:DBAC73EEF0C1D28F8F11C692C2A87A0B
明文:系统初始化时,生成伪随机「AES密钥」
加密后:0C0CD6E56C522527C33A6451917AA6910C5EFF15F7B97CEEF46320CB64457276B29DCDDBB121BC1D3A1BDB218936E128F4A67A2F7F1C8F8423510E9E8D07C783
解密后:系统初始化时,生成伪随机「AES密钥」