AES_CBC模式加密之前后端实现

199 阅读1分钟
  1. 前端安装crypto包: npm install crypto-js
  2. 前端封装crypto.js文件:
import CryptoJS from 'crypto-js';

// 16位16进制key.
const key = CryptoJS.enc.Utf8.parse('1111111111111111');
const iv = CryptoJS.enc.Utf8.parse('key_111111111111');

const crypto = {

    /**
     * 解密方法.
     *
     * @param {String} text 待解密文本
     * @returns 解密结果
     */

    Decrypt(text) {
        const encrypted = CryptoJS.AES.decrypt(text, key, {
            iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.toString(CryptoJS.enc.Utf8);
    },

    /**
     * 加密方法.
     *
     * @param {String} text 待加密文本
     * @returns 加密结果
     */

    Encrypt(text) {
        const encrypted = CryptoJS.AES.encrypt(text, key, {
            iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    }
};
export default crypto;

  1. 后端加密和解密方法
   /**
     * 编码.
     */
    private static final String ENCODING = "UTF-8";

    /**
     * 算法定义.
     */
    private static final String AES_ALGORITHM = "AES";

    /**
     * 指定填充方式.
     */
    private static final String CIPHER_CBC_PADDING = "AES/CBC/PKCS5Padding";

    private static final String aesKey = "1111111111111111";
    private static final String ivSeed = "key_111111111111";
    
    /**
     * AES解密-CBC模式.
     *
     * @param text 待解密文本
     * @return 解密结果
     */
    public static String decryptCbc(String text) {
        try {
            byte[] bytes = aesKey.getBytes(ENCODING);
            //设置解密算法,生成秘钥.
            SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
            //偏移.
            IvParameterSpec iv = new IvParameterSpec(ivSeed.getBytes(ENCODING));
            // "算法/模式/补码方式".
            Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);
            //选择解密.
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

            //先进行Base64解码.
            byte[] decodeBase64 = Base64.decodeBase64(text);

            //根据待解密内容进行解密.
            byte[] decrypted = cipher.doFinal(decodeBase64);
            //将字节数组转成字符串.
            return new String(decrypted, ENCODING);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * AES加密-CBC模式.
     *
     * @param text 待加密文本
     * @return 加密结果
     */
    public static String encryptCbc(String text) {
        try {
            byte[] bytes = aesKey.getBytes(ENCODING);
            //设置加密算法,生成秘钥.
            SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
            // "算法/模式/补码方式".
            Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);
            //偏移.
            IvParameterSpec iv = new IvParameterSpec(ivSeed.getBytes(ENCODING));
            //选择加密.
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            //根据待加密内容生成字节数组.
            byte[] encrypted = cipher.doFinal(text.getBytes(ENCODING));
            //将字节数组转成字符串.
            return Base64.encodeBase64String(encrypted);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }