TripleDes加密/解密类
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
/**
* 3DES(Triple DES)加密解密工具类
* 使用 CBC 模式和 PKCS5Padding 填充方式
* 注意:此类使用了硬编码的密钥和向量,仅适用于特定场景,生产环境建议使用更安全的方式
*/
public class TripleDes {
/**
* 3DES 密钥(24字节 = 8字节 × 3)
* 注意:密钥应该是随机生成的,这里硬编码仅作示例
* 实际应用中应该从安全配置或密钥管理系统获取
*/
private static final String KEY = "YeM0kpj8O98RKVpsQSqQS5fr"; // 密钥长度应为24字节(8字节×3)
/**
* 初始化向量 IV(Initialization Vector)
* 对于 CBC 模式,IV 应该是随机且唯一的,这里硬编码仅作示例
* 长度必须为8字节(64位),与DES块大小相同
*/
private static final String IV = "703493EQ"; // IV长度应为8字节
/**
* 加密算法字符串
* DESede: 表示3DES算法
* CBC: Cipher Block Chaining 密码分组链接模式
* PKCS5Padding: 使用PKCS5标准进行数据填充
*/
private static final String ALGORITHM = "DESede/CBC/PKCS5Padding";
/**
* 初始化向量规格对象
* 将字符串形式的IV转换为Java加密API需要的IvParameterSpec对象
*/
private static final IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes());
/**
* 3DES密钥对象
* 通过静态初始化块生成,确保只初始化一次
*/
private static final SecretKey key;
// 静态初始化块:类加载时执行一次,初始化3DES密钥
static {
try {
// 创建3DES密钥规范,将字符串密钥转换为符合3DES要求的格式
KeySpec keySpec = new DESedeKeySpec(KEY.getBytes());
// 获取3DES密钥工厂实例
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
// 使用密钥工厂生成符合规范的3DES密钥
key = keyFactory.generateSecret(keySpec);
} catch (Exception e) {
// 如果密钥初始化失败,抛出运行时异常终止程序
// 因为加密功能是核心功能,无法正常工作时应立即停止
throw new RuntimeException("Error initializing TripleDesHardcoded", e);
}
}
/**
* 使用3DES算法加密明文字符串
*
* @param data 需要加密的明文字符串
* @return 加密后的Base64编码字符串(通过KentString工具类转换)
* @throws Exception 加密过程中可能抛出的各种异常
*/
public static String encrypt(String data) throws Exception {
// 获取指定算法的Cipher实例
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化Cipher为加密模式,设置密钥和IV
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
// 执行加密操作,将明文转换为密文字节数组
byte[] encrypted = cipher.doFinal(data.getBytes());
// 将密文字节数组转换为字符串(可能是Base64或其他编码)
// 注意:需要确保KentString.bytes2string能正确处理二进制数据
return KentString.bytes2string(encrypted);
}
/**
* 使用3DES算法解密密文字符串
*
* @param encryptedData 经过encrypt方法加密的字符串
* @return 解密后的原始明文字符串
* @throws Exception 解密过程中可能抛出的各种异常
*/
public static String decrypt(String encryptedData) throws Exception {
// 获取指定算法的Cipher实例
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化Cipher为解密模式,设置相同的密钥和IV
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
// 将字符串格式的密文转换回字节数组
// 注意:需要确保KentString.string2bytes能正确还原加密前的字节数据
byte[] encryptedBytes = KentString.string2bytes(encryptedData);
// 执行解密操作,将密文字节数组还原为明文字节数组
byte[] original = cipher.doFinal(encryptedBytes);
// 将明文字节数组转换为字符串(使用平台默认字符集)
return new String(original);
}
}
支持 Ctrl+A 全选,Ctrl+C 复制