java aes 填充_java中使用AES加密(加密模式为CBC,填充方式:AES/CBC/PKCS7Padding,密钥长度32位)...

本文介绍了一个使用Java编写的AES加密解密工具,重点讲解了AES/CBC/PKCS7Padding模式、密钥和向量的创建,以及如何利用BouncyCastle库处理PKCS7Padding。通过实例演示了如何对字符串进行加密和解密,并提到了必要的依赖配置。
摘要由CSDN通过智能技术生成

首先导入依赖

commons-codec

commons-codec

工具类

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import java.io.UnsupportedEncodingException;

import java.security.Security;

/**

* AES加解密工具

*/

public class EncryptUtil {

private static final String CipherMode="AES/CBC/PKCS7Padding";

private static final String SecretKey="key";

private static final Integer IVSize=16;

private static final String EncryptAlg ="AES";

private static final String Encode="UTF-8";

private static final int SecretKeySize=32;

private static final String Key_Encode="UTF-8";

/**

* 创建密钥

* @return

*/

private static SecretKeySpec createKey(){

StringBuilder sb=new StringBuilder(SecretKeySize);

sb.append(SecretKey);

if (sb.length()>SecretKeySize){

sb.setLength(SecretKeySize);

}

if (sb.length()

while (sb.length()

sb.append(" ");

}

}

try {

byte[] data=sb.toString().getBytes(Encode);

return new SecretKeySpec(data, EncryptAlg);

}catch (Exception e){

e.printStackTrace();

}

return null;

}

/**

* 创建16位向量: 不够则用0填充

* @return

*/

private static IvParameterSpec createIV() {

StringBuffer sb = new StringBuffer(IVSize);

sb.append(SecretKey);

if (sb.length()>IVSize){

sb.setLength(IVSize);

}

if (sb.length()

while (sb.length()

sb.append("0");

}

}

byte[] data=null;

try {

data=sb.toString().getBytes(Encode);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return new IvParameterSpec(data);

}

/**

* 加密:有向量16位,结果转base64

* @param context

* @return

*/

public static String encrypt(String context) {

try {

//下面这行在进行PKCS7Padding加密时必须加上,否则报错

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

byte[] content=context.getBytes(Encode);

SecretKeySpec key = createKey();

Cipher cipher = Cipher.getInstance(CipherMode);

cipher.init(Cipher.ENCRYPT_MODE, key, createIV());

byte[] data = cipher.doFinal(content);

String result= Base64.encodeBase64String(data);

return result;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* 解密

* @param context

* @return

*/

public static String decrypt(String context) {

try {

byte[] data=Base64.decodeBase64(context);

SecretKeySpec key = createKey();

Cipher cipher = Cipher.getInstance(CipherMode);

cipher.init(Cipher.DECRYPT_MODE, key, createIV());

byte[] content = cipher.doFinal(data);

String result=new String(content,Encode);

return result;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

}

注意:PKCS7Padding加密时需要调用BouncyCastleProvider让java支持PKCS7Padding

相应的依赖

org.bouncycastle

bcprov-jdk16

1.46

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值