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());