加密、解密算法 AES、DES

使用Hutool工具实现密钥+内容的加密与解密

Hutool是一个Java工具库,提供了丰富的加密解密工具类。下面我将介绍如何使用Hutool实现基于密钥的对称加密和解密。

签名方法 Mac、MessageDigest、Signature https://www.cnblogs.com/vipsoft/p/18795795
Java Hutool 实现非对称加密(RSA) https://www.cnblogs.com/vipsoft/p/18674812

1. 添加Hutool依赖

首先需要在项目中添加Hutool依赖:

Maven:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.20</version> <!-- 使用最新版本 -->
</dependency>

Gradle:

implementation 'cn.hutool:hutool-all:5.8.20'

2. 对称加密实现

Hutool支持多种对称加密算法,如AES、DES等。下面以AES为例:

加密方法

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;

public class CryptoUtils {
    
    /**
     * AES加密
     * @param content 明文内容
     * @param key 密钥(16/24/32字节)
     * @return 加密后的Base64字符串
     */
    public static String encrypt(String content, String key) {
        // 构建AES对象
        AES aes = SecureUtil.aes(key.getBytes());
        // 加密为16进制表示
        return aes.encryptHex(content);
        // 或者加密为Base64
        // return aes.encryptBase64(content);
    }
}

解密方法

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;

public class CryptoUtils {
    
    /**
     * AES解密
     * @param encryptStr 加密后的字符串
     * @param key 密钥(必须与加密时相同)
     * @return 解密后的原文
     */
    public static String decrypt(String encryptStr, String key) {
        // 构建AES对象
        AES aes = SecureUtil.aes(key.getBytes());
        // 解密字符串
        return aes.decryptStr(encryptStr);
    }
}

3. 使用示例

public class Main {
    public static void main(String[] args) {
        String content = "这是一段需要加密的敏感数据";
        String key = "1234567890123456"; // AES密钥要求16/24/32字节
        
        // 加密
        String encrypted = CryptoUtils.encrypt(content, key);
        System.out.println("加密结果: " + encrypted);
        
        // 解密
        String decrypted = CryptoUtils.decrypt(encrypted, key);
        System.out.println("解密结果: " + decrypted);
    }
}

4. 其他加密算法

Hutool还支持其他对称加密算法,使用方法类似:

DES加密示例

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;

public class DesCryptoUtils {
    
    public static String encrypt(String content, String key) {
        DES des = SecureUtil.des(key.getBytes());
        return des.encryptHex(content);
    }
    
    public static String decrypt(String encryptStr, String key) {
        DES des = SecureUtil.des(key.getBytes());
        return des.decryptStr(encryptStr);
    }
}

5. 注意事项

  1. 密钥长度

    • AES:16/24/32字节
    • DES:8字节
    • 3DES:24字节
  2. 安全性

    • 不要使用简单易猜的密钥
    • 实际项目中密钥应该安全存储,不要硬编码在代码中
  3. 异常处理

    • 实际使用时应该添加异常处理
    • 加密解密可能抛出CryptoException
  4. 编码问题

    • 确保加密解密使用相同的字符编码(通常UTF-8)

以上示例展示了如何使用Hutool进行基于密钥的对称加密和解密操作。根据实际需求,你可以选择不同的加密算法和配置参数。

AES与DES加密算法的区别及应用场景

一、AES与DES的主要区别

对比维度 AES (Advanced Encryption Standard) DES (Data Encryption Standard)
推出时间 2001年 1977年
密钥长度 128/192/256位 56位(实际64位,但8位用于奇偶校验)
分组长度 128位 64位
加密轮数 10/12/14轮(取决于密钥长度) 16轮
安全性 高,目前无已知有效攻击 低,已被暴力破解
算法结构 置换-置换网络(SPN) Feistel网络
性能 较快(硬件加速下更明显) 较慢
标准化 NIST标准 原NIST标准(已淘汰)

二、安全性比较

  1. AES

    • 目前没有已知的实用攻击方法能破解AES
    • 即使使用256位密钥,在可预见的未来也是安全的
    • 被美国政府用于保护最高机密信息(TOP SECRET)
  2. DES

    • 1999年已被证明可在22小时内暴力破解
    • 3DES(三重DES)提高了安全性但效率低下
    • 已被NIST于2005年正式废弃

三、性能比较

  1. 软件实现

    • AES通常比DES/3DES快5-10倍
    • AES算法设计更适合现代处理器
  2. 硬件实现

    • 现代CPU(如Intel AES-NI指令集)对AES有专门优化
    • AES硬件加速后性能可提升10倍以上

四、典型应用场景

AES适用场景:

  1. 高安全性需求

    • 政府机密通信
    • 军事数据加密
    • 金融交易安全(如SSL/TLS)
  2. 大数据量加密

    • 全磁盘加密(如BitLocker)
    • 数据库字段加密
    • 大文件加密
  3. 现代协议标准

    • WiFi加密(WPA2/WPA3)
    • VPN协议(IPSec)
    • SSH协议

DES/3DES适用场景:

  1. 遗留系统维护

    • 需要与老旧系统兼容时
    • 传统银行系统(逐步淘汰中)
  2. 低安全性需求

    • 内部非敏感数据加密
    • 短期数据保护
  3. 法律合规要求

    • 某些行业特定法规可能暂时要求(越来越少)

五、选择建议

  1. 优先选择AES的情况

    • 所有新开发的系统
    • 需要高安全性的应用
    • 处理大量数据的场景
    • 需要硬件加速的场景
  2. 可能考虑3DES的情况

    • 必须与老旧系统交互时
    • 受限于特定行业法规时
    • 短期过渡方案
  3. 不应使用DES的情况

    • 任何新系统设计
    • 敏感数据传输
    • 长期数据保护

六、Java实现示例对比

AES实现(Hutool):

// 加密
AES aes = SecureUtil.aes(key.getBytes());
String encrypted = aes.encryptHex(content);

// 解密
String decrypted = aes.decryptStr(encrypted);

3DES实现(Hutool):

// 加密
DESede des = SecureUtil.desede(key.getBytes()); // 密钥必须24字节
String encrypted = des.encryptHex(content);

// 解密
String decrypted = des.decryptStr(encrypted);

七、迁移建议

  1. 仍在使用DES/3DES的系统应尽快迁移到AES
  2. 迁移过程可采用双加密过渡方案:
    • 新数据使用AES加密
    • 旧数据保持3DES加密但逐步转换
  3. 密钥管理应同步升级

总结

AES作为DES的替代标准,在安全性、性能和适应性方面全面优于DES。除非有特殊的兼容性要求,现代系统都应采用AES作为默认的对称加密算法。DES因其固有的安全性弱点,已不再适合用于保护敏感信息。

posted @ 2025-03-28 09:43  VipSoft  阅读(542)  评论(0)    收藏  举报