对称加密AES算法,前端cryptojs实现,后端Java实现

demo代码地址:https://download.csdn.net/download/qq_33512843/10525116

一、后端java代码

package com.example.commons.util;

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

/**
 * 对称加密解密AES算法
 *
 * @author zhaors
 */
public class AESUtils {

    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
    private static final String ALGORITHM = "AES";
    private static final String CHARSET = "utf-8";
    /**
     * 建议为16位或32位
     */
    private static final String KEY = "A-16-Byte-keyValA-16-Byte-keyVal";
    /**
     * 必须16位
     * 初始化向量IV不可以为32位,否则异常java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
     */
    private static final String IV = "A-16-Byte-String";

    /**
     * 加密
     *
     * @param context
     * @return
     */
    public static String encrypt(String context) {
        try {
            byte[] decode = context.getBytes(CHARSET);
            byte[] bytes = createKeyAndIv(decode, Cipher.ENCRYPT_MODE);
            return Base64.getEncoder().encodeToString(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解密
     *
     * @param context
     * @return
     */
    public static String decrypt(String context) {
        try {
            Base64.Decoder decoder = Base64.getDecoder();
            byte[] decode = decoder.decode(context);
            byte[] bytes = createKeyAndIv(decode, Cipher.DECRYPT_MODE);
            return new String(bytes, CHARSET);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取key & iv
     *
     * @param context
     * @param opmode
     * @return
     * @throws Exception
     */
    public static byte[] createKeyAndIv(byte[] context, int opmode) throws Exception {
        byte[] key = KEY.getBytes(CHARSET);
        byte[] iv = IV.getBytes(CHARSET);
        return cipherFilter(context, opmode, key, iv);
    }

    /**
     * 执行操作
     *
     * @param context
     * @param opmode
     * @param key
     * @param iv
     * @return
     * @throws Exception
     */
    public static byte[] cipherFilter(byte[] context, int opmode, byte[] key, byte[] iv) throws Exception {
        Key secretKeySpec = new SecretKeySpec(key, ALGORITHM);
        AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(opmode, secretKeySpec, ivParameterSpec);
        return cipher.doFinal(context);
    }

    /**
     * 主方法测试
     *
     * @param args
     */
    public static void main(String[] args) {
        String context = "zhaors";
        System.out.println("元数据" + context);
        String encrypt = encrypt(context);
        System.out.println("加密之后:" + encrypt);
        String decrypt = decrypt(encrypt);
        System.out.println("解密之后:" + decrypt);
    }

}

运行结果:


注意事项:

1.Java实现AES加密,异常java.security.InvalidKeyException: Illegal key size 的解决方案,

请参考:https://blog.csdn.net/wangjunjun2008/article/details/50847426

2.初始化向量(上文中的IV常量)不可以为32位,否则异常java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long

二、前端JS代码

crypto-js github地址:https://github.com/brix/crypto-js

1.导入所需要的js.

2.核心js代码

var key = CryptoJS.enc.Utf8.parse("A-16-Byte-keyVal"); 
var iv = CryptoJS.enc.Utf8.parse("A-16-Byte-String");

//aes加密
function encrypt(context) {
   var encrypted = '';
   if (typeof(context) == 'string') {

   }else if(typeof(context) == 'object'){
      context = JSON.stringify(context);
   }
   var srcs = CryptoJS.enc.Utf8.parse(context);
   encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}  
// aes解密
function decrypt(context) {
    var decrypt = CryptoJS.AES.decrypt(context, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
}

完整代码:

html>


charset="utf-8">
</span>crypto-js<span style="color:#e8bf6a;">





加密前:type="text" id="jiamibefore"/> type="button" name="" value="AES加密" οnclick="getAES();"/> 加密后:type="text" id="jiamiafter" readonly="readonly" />
解密前:type="text" id="jiemibefore"/> type="button" name="" value="AES解密" οnclick="getDAes();"/> 解密后:type="text" id="jiemiafter" readonly="readonly"/>

运行结果:



你可能感兴趣的