Java 使用AES/CBC/PKCS7Padding 加解密字符串

介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别

要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现

所以需要一个jar 来支持。bcprov-jdk16-146.jar

下载地址:http://central.maven.org/maven2/org/bouncycastle/bcprov-jdk16/1.46/bcprov-jdk16-1.46.jar

废话不说了,下面上代码

加解密类

/**

*

* @author ngh

* AES128 算法

*

* CBC 模式

*

* PKCS7Padding 填充模式

*

* CBC模式需要添加一个参数iv

*

* 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别

* 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现

*/

public class AES {

// 算法名称

final String KEY_ALGORITHM = "AES";

// 加解密算法/模式/填充方式

final String algorithmStr = "AES/CBC/PKCS7Padding";

//

private Key key;

private Cipher cipher;

boolean isInited = false;

byte[] iv = { 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 };

public void init(byte[] keyBytes) {

// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要

int base = 16;

if (keyBytes.length % base != 0) {

int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);

byte[] temp = new byte[groups * base];

Arrays.fill(temp, (byte) 0);

System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);

keyBytes = temp;

}

// 初始化

Security.addProvider(new BouncyCastleProvider());

// 转化成JAVA的密钥格式

key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);

try {

// 初始化cipher

cipher = Cipher.getInstance(algorithmStr, "BC");

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchProviderException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 加密方法

*

* @param content

* 要加密的字符串

* @param keyBytes

* 加密密钥

* @return

*/

public byte[] encrypt(byte[] content, byte[] keyBytes) {

byte[] encryptedText = null;

init(keyBytes);

System.out.println("IV:" + new String(iv));

try {

cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));

encryptedText = cipher.doFinal(content);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return encryptedText;

}

/**

* 解密方法

*

* @param encryptedData

* 要解密的字符串

* @param keyBytes

* 解密密钥

* @return

*/

public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {

byte[] encryptedText = null;

init(keyBytes);

System.out.println("IV:" + new String(iv));

try {

cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));

encryptedText = cipher.doFinal(encryptedData);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return encryptedText;

}

}

ublic class Test {
 public static void main(String[] args) {
  AES aes = new AES();
//   加解密 密钥
  byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };
  String content = "1";
  // 加密字符串
  System.out.println("加密前的:" + content);
  System.out.println("加密密钥:" + new String(keybytes));
  // 加密方法
  byte[] enc = aes.encrypt(content.getBytes(), keybytes);
  System.out.println("加密后的内容:" + new String(Hex.encode(enc)));
  // 解密方法
  byte[] dec = aes.decrypt(enc, keybytes);
  System.out.println("解密后的内容:" + new String(dec));
 }

}
测试结果:
加密前的:1
加密密钥:12345678
IV:0102030405060708
加密后的内容:b59227d86200d7fedfb8418a59a8eea9
IV:0102030405060708
解密后的内容:1