AES 128 , KEY 的长度为 16字节(16*8=128bit)
CBC 模式需要IV, IV的值是固定写死,还是当参数传入,自己看情况。IV的长度没研究,这里用的是16字符。
java PKCS5Padding 对应 C#.NET 的 PKCS7 。
明文,KEY和IV 三者 string 转 byte[] 时要统一编码,如UTF-8。
加密后 cipher.doFinal() 得到密文byte[] ,是直接转string,还是转为base64编码的string ,要统一。
Base64Utils :
package com.company;
import org.apache.commons.codec.binary.Base64;
public class Base64Utils {
public static final String _charset = "UTF-8";
* BASE64字符串解码为二进制数据
* @param str
* @return
* @throws Exception
public static byte[] decode(String str) throws Exception {
Base64 _base64 = new Base64();
return _base64.decodeBase64(str.getBytes(_charset));
* 二进制数据编码为BASE64字符串
* @param bytes
* @return
* @throws Exception
public static String encode(byte[] bytes) throws Exception {
Base64 _base64 = new Base64();
return new String(_base64.encodeBase64Chunked(bytes));
AesUtil:
package com.company;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
* AES CBC PKCS5 模式加密解密
public class AesUtil {
private static final String charset = "UTF-8";
* @param content
* @param key
* @param iv
* @return
* @throws Exception
public static String encrypt(String content, String key, String iv)
throws Exception {
//明文
byte[] contentBytes = content.getBytes(charset);
//AES KEY
byte[] keyBytes = key.getBytes(charset);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
//AES IV
byte[] initParam = iv.getBytes(charset);
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);
byte[] byEnd = cipher.doFinal(contentBytes);
//加密后的byte数组转BASE64字符串
String strEnd = Base64Utils.encode(byEnd);
return strEnd;
* @param content
* @param key
* @param iv
* @return
* @throws Exception
public static String decrypt(String content, String key, String iv)
throws Exception {
//反向解析BASE64字符串为byte数组
byte[] encryptedBytes = Base64Utils.decode(content);
//AES KEY
byte[] keyBytes = key.getBytes(charset);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
//AES IV
byte[] initParam = iv.getBytes(charset);
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
byte[] byEnd = cipher.doFinal(encryptedBytes);
//加密后的byte数组直接转字符串
String strEnd = new String(byEnd, charset);
return strEnd;
AesUtil:base 64 编码引用了 org.apache.commons.codec.binary.Base64,可以从网上下载。http://commons.apache.org/proper/commons-codec/download_codec.cgi
名字:commons-codec-1.12.jar
测试代码 main:
package com.company;
public class Main {
private static final String IV_STRING = "abcdefghABCDEFGH";
public static void main(String[] args) {
try {
String cc = "中华 HELLO~!@#¥%……&*()——+1";
System.out.println("明文:\r\n" + cc);
System.out.println("AES 256 -------:\r\n");
String aesKey = "12345678901234567890123456789012";
String aa = AesUtil.encrypt(cc, aesKey, IV_STRING);
System.out.println("密文:\r\n" + aa);
String dd = AesUtil.decrypt(aa, aesKey, IV_STRING);
System.out.println("解密后明文:\r\n" + dd);
} catch (Exception ex) {
System.out.println("ex:\r\n" + ex.getMessage());