AES(高级加密标准)是当今世界上最为流行和广泛认可的加密算法之一,它已成为保护电子数据的金标准。该算法是美国国家标准与技术研究院(NIST)于2001年正式采纳的一种电子数据加密技术,用以取代旧有的DES(数据加密标准)。 AES算法基于对称密钥加密,即加密和解密使用同一密钥。其所提供的密钥长度为128、192和256位,分别对应AES-128、AES-192和AES-256三个变体。这种灵活的密钥长度使得AES既可以适应对较低安全级别需求的场景,也能满足高安全需求环境下的强加密要求。 与DES算法的56位密钥相比,AES的密钥更长,安全性自然也更高。它能有效抵抗包括暴力破解在内的多种密码攻击。AES的一个重要特点是其算法结构的简单性,这使得它在多种计算设备上都能有效运行,包括那些拥有有限处理能力的小型设备。
此外,AES也具有高度的灵活性和可扩展性,它可以适用于各种数据加密的需求,如文件加密、网络通信安全、无线网络的安全以及作为其他安全协议和技术(如SSL/TLS、VPN)的核心组成部分。随着数据安全越来越受到重视,AES的重要性和应用范围无疑会继续扩大。
package com.common.util;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AesUtils {
private static final String AES = "AES";
// AES加密模式为CBC,填充方式为PKCS5Padding
private static final String AES_TYPE = "AES/CBC/PKCS5Padding";
// AES密钥为16位
private static final String AES_KEY = "1234567890987654";
// AES初始化向量16位
private static final String AES_IV = "4567890876331121";
/**
* AES加密
*
* @param data 待加密的数据
* @return 加密后的数据,使用Base64编码
*/
public static String encrypt(String data) throws Exception {
// 将AES密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES);
// 将AES初始化向量转换为IvParameterSpec对象
IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
// 根据加密算法获取加密器
Cipher cipher = Cipher.getInstance(AES_TYPE);
// 初始化加密器,设置加密模式、密钥和初始化向量
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
// 加密数据
byte[] encryptedData = cipher.doFinal(data.getBytes());
// 对加密后的数据使用Base64编码
return Base64.getEncoder().encodeToString(encryptedData);
}
/**
* AES解密
*
* @param encryptedData 加密后的数据,使用Base64编码
* @return 解密后的数据
*/
public static String decrypt(String encryptedData) throws Exception {
// 将AES密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES);
// 将AES初始化向量转换为IvParameterSpec对象
IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
// 根据加密算法获取解密器
Cipher cipher = Cipher.getInstance(AES_TYPE);
// 初始化解密器,设置解密模式、密钥和初始化向量
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
// 对加密后的数据使用Base64解码
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
// 解密数据
byte[] decryptedData = cipher.doFinal(decodedData);
// 返回解密后的数据
return new String(decryptedData);
}
public static void main(String[] args) throws Exception {
String data = "你好!";
String encryptedData = encrypt(data);
System.out.println("加密后的数据:" + encryptedData);
String decryptedData = decrypt(encryptedData);
System.out.println("解密后的数据:" + decryptedData);
}
}
1.AES算法采用的密钥长度更长,密钥空间更大,安全性更高,能够有效地抵抗暴力破解攻击。 2.密钥长度较长,需要的存储也更多。对于对称加密算法而言,最大的痛点就在于密钥管理困难,相比而言,非对称加密就没有这个担忧。