使⽤CBC + PKCS5Padding + HEX 加解密

467 阅读1分钟

前端代码

key 自主生成
iv 自主生成
import CryptoJS from "crypto-js";
// 加密
export function Encrypt(word) {
  let key = '';
  let iv = '';
  key = CryptoJS.enc.Utf8.parse(key);
  iv = CryptoJS.enc.Utf8.parse(iv);
  let str = ''
  if (typeof (word) == 'string') {
    str = word
  } else if (typeof (word) == 'object') {
    str = JSON.stringify(word);
  }
  let srcs = CryptoJS.enc.Utf8.parse(str);
  // 加密模式为CBC,补码方式为PKCS5Padding(也就是PKCS7)
  let encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  //返回Hex
  return CryptoJS.enc.Hex.stringify(encrypted.ciphertext);
}

// 解密
export function Decrypt(word) {
  let key = '';
  let iv = '';
  key = CryptoJS.enc.Utf8.parse(key);
  iv = CryptoJS.enc.Utf8.parse(iv);
  let base64 = CryptoJS.enc.Hex.parse(word);
  let src = CryptoJS.enc.Base64.stringify(base64);
  // 解密模式为CBC,补码方式为PKCS5Padding(也就是PKCS7)
  let decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}

后端代码

/**
 * 解密操作
 * @param content        待解密内容
 * @param encodingFormat 编码⽅式
 * @param sKey           密钥
 * @param ivParameter    偏移量
 * @return
 * @throws Exception
 */

public static String decrypt(String content, String encodingFormat, String sKey, String ivParameter) {
    try {
        byte[] raw = sKey.getBytes("ASCII");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] bytes = Hex.decodeHex(content);
        byte[] original = cipher.doFinal(bytes);
        String originalString = new String(original, encodingFormat);
        return originalString;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}
/**
 * 加密操作
 * @param content        待加密内容
 * @param encodingFormat 编码⽅式
 * @param sKey           密钥
 * @param ivParameter    偏移量
 * @return
 * @throws Exception
 */
public static String encrypt(String content, String encodingFormat, String sKey, String ivParameter) {
    try {
        byte[] raw = sKey.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(content.getBytes(encodingFormat));
        return Hex.encodeHexString(encrypted).toLowerCase();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}