Java实现AES/CBC/PKCS7Padding加解密


最近项目需要选择一套对称加密算法,来满足前后端之间的加解密操作。初步打算前端使用crypto-js来实现,后端使用java本身的加密算法实现,但遇到了一个问题:java本身只支持NoPadding和PKCS5Padding,而crypto-js提供的padding方式没有PKCS5Padding,所以不得以,前后端最终使用PKCS7Padding来实现功能.因此只能通过引入第三方jar包的方式让jave支持pkcs7padding

引入依赖#

Copy
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency>

完整代码#

Copy
package com.hzjd.miniapp.util; import java.security.Security; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import com.sun.istack.internal.NotNull; public class AESUtil { private static final String CHARSET_NAME = "UTF-8"; private static final String AES_NAME = "AES"; // 加密模式 public static final String ALGORITHM = "AES/CBC/PKCS7Padding"; // 密钥 public static final String KEY = "1954682168745975"; // 偏移量 public static final String IV = "1954682168745975"; static { Security.addProvider(new BouncyCastleProvider()); } /** * 加密 * * @param content * @param key * @return */ public String encrypt(@NotNull String content) { byte[] result = null; try { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(CHARSET_NAME), AES_NAME); AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec); result = cipher.doFinal(content.getBytes(CHARSET_NAME)); } catch (Exception e) { e.printStackTrace(); } return Base64.encodeBase64String(result); } /** * 解密 * * @param content * @param key * @return */ public String decrypt(@NotNull String content) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(CHARSET_NAME), AES_NAME); AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); return new String(cipher.doFinal(Base64.decodeBase64(content)), CHARSET_NAME); } catch (Exception e) { e.printStackTrace(); } return StringUtils.EMPTY; } public static void main(String[] args) { AESUtil aes = new AESUtil(); String contents = "121456465"; String encrypt = aes.encrypt(contents); System.out.println("加密后:" + encrypt); String decrypt = aes.decrypt(encrypt); System.out.println("解密后:" + decrypt); } }
posted @   Tiro8183  阅读(1590)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示
CONTENTS