Java 使用AES/CBC/PKCS7Padding 加解密字符串 – CodeWeblog.com

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

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

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

下载地址:http://www.bouncycastle.org/archive/139/bcprov-jdk16-139.jar

废话不说了,下面上代码

加解密类

<span class="hljs-comment">/**</span>

*

* @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;

}

}

 

测试类

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Test</span> {

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

来源URL:http://www.codeweblog.com/java-%e4%bd%bf%e7%94%a8aes-cbc-pkcs7padding-%e5%8a%a0%e8%a7%a3%e5%af%86%e5%ad%97%e7%ac%a6%e4%b8%b2/