欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前后端实现AES加解密(一):java后端实现

程序员文章站 2022-07-10 15:23:26
...

首先需要导入一个第三方jsr包,commons-codec.jar
下面是一个写好的工具类,调用该类的方法,实现使用指定**对明文进行加解密:

package util;

import java.io.UnsupportedEncodingException;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class AesUtil {

//byte数组转字符串
    public static String byteToString(byte[] byte1)
            throws UnsupportedEncodingException {
        return new String(byte1);
    }
//加密时调用方法,三个参数分别是:明文,**,向量,注意向量的长度只能是16byte,而且加密解密时必须使用一致的向量。
    public static byte[] AES_CBC_Encrypt(byte[] content, byte[] keyBytes,
            byte[] iv) {

        try {
            SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) {
            System.out.println("exception:" + e.toString());
        }
        return null;
    }
//解密方法,三个参数:密文,**,向量
    public static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes,
            byte[] iv) {

        try {
            SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) {
            // TODO Auto-generated catchblock
            System.out.println("exception:" + e.toString());
        }
        return null;
    }

    /**
     *将base64类型的字符串转成byte类型
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return Base64.decodeBase64(key.getBytes());
    }

    /**
     * 将byte类型转变为base64类型的字符串
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return new String(Base64.encodeBase64(key));
    }
    /**
     * 这个方法在大多数时候是用不到的,可以选择无视。
     * @param src byte数组
     * @return 十六进制的字符串
     */
    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 字符串转二进制字符串
     * 
     * @param str
     */

    public String toBinary(String str) {

        char[] strChar = str.toCharArray();
        String result = "";
        for (int i = 0; i < strChar.length; i++) {
            result += Integer.toBinaryString(strChar[i]) + "";
        }

        return result;
    }

    /**
     * 字符串转16进制字符串
     * @param s
     * @return
     */
    public static String strTo16(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = (int) s.charAt(i);
            String s4 = Integer.toHexString(ch);
            str = str + s4;
        }
        return str;
    }


    /**
     * 得到一个任意长度随即**
     * @param KeyLength
     * @return
     */
    public static String KeyCreate(int KeyLength) {

        String base = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
        Random random = new Random();
        StringBuffer Keysb = new StringBuffer();
        for (int i = 0; i < KeyLength; i++) // 生成指定位数的随机秘钥字符串
        {
            int number = random.nextInt(base.length());
            Keysb.append(base.charAt(number));
        }
        return Keysb.toString();
    }
}

直接将上面的工具类复制到项目中,下面demo用来演示加密解密过程:

//明文
String returnMessageContent = "症结所在";
//aes的key值
String key = AesUtil.KeyCreate(16);
//注意第一个参数-明文转化为byte数组的时候,一定要指定是按照utf-8的格式进行转化的,不然对中文的加密就会出现加密后无法解密的情况。
//第三个参数-向量,一定是16byte长度的,这里采用**字符串的前16位。
byte[] encrypted = AesUtil.AES_CBC_Encrypt(returnMessageContent.getBytes("utf-8"), key.getBytes(), key.substring(0, 16).getBytes());
//将加密后的密文转成base64格式的字符串
String secretWord = AesUtil.encryptBASE64(encrypted);

解密的demo

String chat_content = secretWord;
// 解密,获得消息明文
byte[] chat_contentming = AesUtil.AES_CBC_Decrypt(AesUtil.decryptBASE64(chat_content),aesming.getBytes(),aesming.substring(0, 16).getBytes());
//将明文byte按照utf-8的形式转化为String字符串
String messageming = new String(chat_contentming, "utf-8");