AES加密算法属于对称加密算法,秘钥长度比DES长,同样安全性也就更高
话不多说,直接上代码
1.AES加密(相对安全的填充方式)
public static String encryptAes(String data, String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// AES初始化向量为12位(随机)
SecureRandom random = new SecureRandom();
byte[] iv = new byte[12];
random.nextBytes(iv);
//密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
//加密器(安全的填充方式)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
//初始化加密器
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, gcmSpec);
//加密数据
byte[] encryptData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
//Base64编码
return Base64.getEncoder().encodeToString(encryptData);
2.AES解密
public static String decryptAes(String data, String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// AES初始化向量(12位)
String aesIv = "abcdefghijkl";
//将密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, aesIv.getBytes());
//解密器(必须与加密采用相同的填充方式)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
//初始化解密器
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, gcmSpec);
//Base64解码
byte[] decryptData = Base64.getDecoder().decode(data);
//解密数据
byte[] decryptedData = cipher.doFinal(decryptData);
//返回解密后的数据
return new String(decryptedData, StandardCharsets.UTF_8);
}
注意:虽然AES安全性更高,但是其密钥长度较长,密钥管理困难,但是采用非对称加密算法就能避免这些问题,例如RSA加密算法(链接如下)