SpringBoot - 实用工具类库common-util使用详解6(AES加密解密:AESUtil)
六、AES加密解密工具类(AESUtil)
1,基本介绍
(1)AES 算法是一种对称加密算法,现已经被多方分析且广为全世界所使用。要了解什么是对称加密算法,什么是非对称加密算法,可以参考我之前写的文章:
(2)AES(Advanced Encryption Standard)中文叫作高级加密标准,是美国联邦政府采用的一种区块加密标准。为适应不同的安全性要求和传输需求,其允许在多种不同的加密模式下工作(ECB 、CBC、CTR、CFB、OFB),关于 AES 更详细的介绍可以参考我之前写的文章:
(3)本文介绍的 AESUtil 是对常用的 AES 加解密进行封装,目前该工具类封装了两种加解密的模式:ECB 模式和 CBC 模式,并且填充模式是 PKCS5Padding。
2,ECB 模式的加密解密
(1)加密解密字符串:
// 原始字符串 String str = "欢迎访问 hangge.com"; // 密钥 String key = "aespower98765432"; // 开始加密 String encrypted = AESUtil.encodeByECB(str, key); // 输出结果 System.out.println("加密后字符串:" + encrypted); // 开始解密 String decrypted = AESUtil.decodeByECB(encrypted, key); // 输出结果 System.out.println("解密后字符串:" + decrypted);

(2)加密解密字节数组:
注意:encryptByCBC 和 decryptByCBC 方法分别进行字节数组的加密和解密,常用于加密或解密第三方的秘串。因为这两个方法没有做任何多余实现,不像上面加解密字符串方法可能和第三方的实现不对等,从而造成解密失败。
// 原始字节数组 byte[] cotent = Base64.decode("5qyi6L+O6K6/6ZeuIGhhbmdnZS5jb20="); // 密钥 byte[] key = Base64.decode("YWVzcG93ZXI5ODc2NTQzMg=="); // 开始加密 byte[] encrypted = AESUtil.encryptByECB(cotent, key); // 输出结果 System.out.println("加密后字节数组:" + encrypted); // 开始解密 byte[] decrypted = AESUtil.decryptByECB(encrypted, key); // 输出结果 System.out.println("解密后字节数组:" + decrypted); System.out.println("原始数据:" + new String(decrypted));

3,CBC 模式的加密解密
(1)加密解密字符串:
注意:与 ECB 模式模式不同,使用 CBC 模式加密时,除了提供一个密钥(key)外,还需要一个密钥偏移量(iv)。
// 原始字符串 String str = "欢迎访问 hangge.com"; // 密钥 String key = "aespower98765432"; // 密钥偏移量 String iv = "7201084316056726"; // 开始加密 String encrypted = AESUtil.encodeByCBC(str, key, iv); // 输出结果 System.out.println("加密后字符串:" + encrypted); // 开始解密 String decrypted = AESUtil.decodeByCBC(encrypted, key, iv); // 输出结果 System.out.println("解密后字符串:" + decrypted);

(2)加密解密字节数组:
注意:encryptByECB 和 decryptByECB 方法分别进行字节数组的加密和解密,常用于加密或解密第三方的秘串。因为这两个方法没有做任何多余实现,不像上面加解密字符串方法可能和第三方的实现不对等,从而造成解密失败。
// 原始字节数组 byte[] cotent = Base64.decode("5qyi6L+O6K6/6ZeuIGhhbmdnZS5jb20="); // 密钥 byte[] key = Base64.decode("YWVzcG93ZXI5ODc2NTQzMg=="); // 密钥偏移量 byte[] iv = Base64.decode("NzIwMTA4NDMxNjA1NjcyNg=="); // 开始加密 byte[] encrypted = AESUtil.encryptByCBC(cotent, key, iv); // 输出结果 System.out.println("加密后字节数组:" + encrypted); // 开始解密 byte[] decrypted = AESUtil.decryptByCBC(encrypted, key, iv); // 输出结果 System.out.println("解密后字节数组:" + decrypted); System.out.println("原始数据:" + new String(decrypted));
