Files
OneKeyCallVideoTablet/src/main/java/com/onekeycall/videotablet/utils/AESUtil.java

81 lines
2.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.onekeycall.videotablet.utils;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AESUtil {
// 使用ECB模式无需IV
private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
// 密钥长度要求128/192/256位16/24/32字节
private static final int KEY_LENGTH = 32; // 256位密钥
// 从环境变量获取密钥(生产环境推荐)
// private static final String SECRET_KEY = System.getenv("AES_KEY");
// 测试用密钥(确保长度符合要求)
private static final String SECRET_KEY = "dasdasdasdawqeq12345312gs6h092fs";
/**
* 加密方法ECB模式
* @param plaintext 明文
* @return Base64编码的密文
*/
public static String encrypt(String plaintext) {
try {
// 验证密钥长度
validateKey();
// 初始化加密器
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
// 加密数据
byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception e) {
throw new RuntimeException("加密失败", e);
}
}
/**
* 解密方法ECB模式
* @param ciphertext Base64编码的密文
* @return 解密后的明文
*/
public static String decrypt(String ciphertext) {
try {
// 验证密钥长度
validateKey();
// 初始化解密器
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
// 解密数据
byte[] decodedBytes = Base64.getDecoder().decode(ciphertext);
byte[] decrypted = cipher.doFinal(decodedBytes);
return new String(decrypted, StandardCharsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException("解密失败", e);
}
}
/**
* 验证密钥长度是否符合要求
*/
private static void validateKey() {
byte[] keyBytes = SECRET_KEY.getBytes(StandardCharsets.UTF_8);
if (keyBytes.length != 16 && keyBytes.length != 24 && keyBytes.length != 32) {
throw new IllegalArgumentException("无效的密钥长度。AES要求密钥长度为16(128位)、24(192位)或32字节(256位)。"
+ "当前长度: " + keyBytes.length + "字节");
}
}
}