TripleDes字符串加解密工具类

2026年01月23日 07:15

描述

TripleDes加密/解密类

标签

Java
TripleDes字符串加解密工具类.txt 3,424 字符 | 115 行
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 复制