AES 加密中文,加密前不是乱码,加密后密文解密中文乱码

4,802 阅读2分钟

import com.qiniu.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.spec.AlgorithmParameterSpec;

/**

  • AES 是一种可逆加密算法,对用户的敏感信息加密处理
  • 对原始数据进行AES加密后,在进行Base64编码转化;
  • @author
  • @time 2017/11/27 15:54
  • 填充:zeropadding 128位
  • 模式:CBC
  • 密码:Kbj.543Lbwb5kNbP
  • 偏移量:B*L032Ykls9-g858

/ public class AesCBCUtil { //私钥 AES固定格式为128/192/256 bits.即:16/24/32bytes public static final String APP_LOGIN_IN_KEY = "Kbj.543Lbwb5kNbP"; //初始化向量参数,AES 为16bytes public static final String GIV = "BL032Ykls9-g858";

/**
 * CBC
 *
 * @param data
 * @param key
 * @return
 * @throws Exception
 */
public static String encrypt(String data, String key) {

// Logger.getInstace().i("[Data-Original]", data); try { Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize();

        byte[] dataBytes = data.getBytes();
        int plaintextLength = dataBytes.length;
        if (plaintextLength % blockSize != 0) {
            plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
        }

        byte[] plaintext = new byte[plaintextLength];
        System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

        SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivspec = new IvParameterSpec(GIV.getBytes());

        cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
        byte[] encrypted = cipher.doFinal(plaintext);

        //return new sun.misc.BASE64Encoder().encode(encrypted);
        String datakey = Base64.encodeToString(encrypted, 0)
                .replace("\n", "").trim();

// Logger.getInstace().i("[Data-AesCBC]", datakey); return datakey; } catch (Exception e) { e.printStackTrace(); return null; } }

/**
 * 替换指定字符串
 */

// public static String replaceStr(String str) { // return str.replace("+", "__2B").replace("/", "__2F").replace("=", "__2C"); // }

/**
 * 解码
 *
 * @param str
 * @param key
 */
public static String AES_Decode(String str, String key) {
    try {

// str = replaceEnStr(str); byte[] textBytes = Base64.decode(str, 0); // byte[] textBytes = str.getBytes("UTF-8"); AlgorithmParameterSpec ivSpec = new IvParameterSpec(GIV.getBytes("UTF-8")); SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec); return new String(cipher.doFinal(textBytes), "UTF-8").replace("\n", "").trim(); } catch (Exception e) { e.printStackTrace(); return null; } }

/**
 * 替换指定字符串
 */

// public static String replaceEnStr(String str) { // return str.replaceAll("__2B", "+").replaceAll("__2F", "/").replaceAll("__2C", "="); // } public static void main(String[] args) { //866297039791111 String str = "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"; String en = AesCBCUtil.encrypt(str, "Kbj.543Lbwb5kNbP"); System.out.println("加密 数据 串en:" + en);

    String dr = AesCBCUtil.AES_Decode(str, "Kbj.543Lbwb5kNbP");
    System.out.println("解密 数据 串dr:" + dr);


}

}