以下是一个简单的AES加密示例
java
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
* @author Sakura
* @date 2023/8/16 14:54
* @Description 测试网站 http://tool.chacuo.net/cryptaes
*/
public class AESUtil {
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
/**
* @param content 待加密字符串
* @param salt 加密盐
* @return
*/
public static String encrypt(String content, String salt) {
try {
//获得密码的字节数组
byte[] raw = salt.getBytes();
//根据密码生成AES密钥
SecretKeySpec skey = new SecretKeySpec(raw, KEY_ALGORITHM);
//根据指定算法ALGORITHM自成密码器
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥 16位
cipher.init(Cipher.ENCRYPT_MODE, skey);
//获取加密内容的字节数组(设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
byte [] byte_content = content.getBytes("utf-8");
//密码器加密数据
byte [] encode_content = cipher.doFinal(byte_content);
//将加密后的数据转换为Base64编码的字符串返回
return Base64.encodeBase64String(encode_content);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* @param content 待解密字符串
* @param salt 解密盐
* @return
*/
public static String decrypt(String content, String salt) {
try {
//获得密码的字节数组
byte[] raw = salt.getBytes();
//根据密码生成AES密钥
SecretKeySpec skey = new SecretKeySpec(raw, KEY_ALGORITHM);
//根据指定算法ALGORITHM自成密码器
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
cipher.init(Cipher.DECRYPT_MODE, skey);
//把密文字符串Base64转回密文字节数组
byte [] encode_content = Base64.decodeBase64(content);
//密码器解密数据
byte [] byte_content = cipher.doFinal(encode_content);
//将解密后的数据转换为字符串返回
return new String(byte_content,"utf-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String str = encrypt("13100000000", "1186738753e64f8cbc26857215ec934f");
System.out.println(str);
String str1 = decrypt("ppLyUqR9IbYueAvbNQbiaQ==", "1186738753e64f8cbc26857215ec934f");
System.out.println(str1);
}
}
在做AES加密的时候一定要注意private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding" 这个参数,很多时候前后端加密解密不一致都是这里配置不一致导致的
AES:
AES 是一种对称加密算法,使用相同的密钥进行加密和解密操作。
它是被广泛使用的加密标准,提供了高效且安全的数据加密。
ECB(Electronic Codebook Mode):
ECB 是最简单的加密模式,每个明文块独立加密成密文块。
缺点是相同的明文块会被加密成相同的密文块,容易受到模式分析攻击,因此不适合加密大数据或高安全性需求的场景。
举例来说,如果你加密的文本有很多重复的模式,使用 ECB 模式会暴露这些重复模式的信息,降低安全性。
PKCS5Padding:
PKCS5Padding 是一种填充方式,用于将明文数据填充到符合块大小的倍数。
AES 是块加密算法,通常处理 16 字节(128 位)大小的块。如果明文数据不是 16 字节的倍数,就需要进行填充。
PKCS5Padding 会根据需要填充的字节数,用相应的字节值进行填充。例如,如果需要填充 5 个字节,则填充值是 0x05,这样解密时可以轻松去除填充部分。