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); } }