VUE-AES算法前后端加解密

2 篇文章 0 订阅

AES算法介绍

百度百科:AES介绍

VUE-前端AES加解密

  1. 引入js包
    npm install crypto-js
    
  2. 编写脚本
    import CryptoJS from 'crypto-js/crypto-js'
    
    // 默认的 KEY 与 iv 如果没有给
    const KEY = CryptoJS.enc.Utf8.parse('1019E2991V09O17L1019E2991V09O17L')
    const IV = CryptoJS.enc.Utf8.parse('1019E2991V09O17L')
    /**
     * AES加密 :字符串 key iv  返回base64
     */
    export function Encrypt (word, keyStr, ivStr) {
      let key = KEY
      let iv = IV
    
      if (keyStr) {
        key = CryptoJS.enc.Utf8.parse(keyStr)
        iv = CryptoJS.enc.Utf8.parse(ivStr)
      }
    
      let srcs = CryptoJS.enc.Utf8.parse(word)
      var encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      })
      // console.log("-=-=-=-", encrypted.ciphertext)
      return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
    }
    /**
     * AES 解密 :字符串 key iv  返回base64
     *
     */
    export function Decrypt (word, keyStr, ivStr) {
      let key = KEY
      let iv = IV
    
      if (keyStr) {
        key = CryptoJS.enc.Utf8.parse(keyStr)
        iv = CryptoJS.enc.Utf8.parse(ivStr)
      }
    
      let base64 = CryptoJS.enc.Base64.parse(word)
      let src = CryptoJS.enc.Base64.stringify(base64)
    
      var decrypt = CryptoJS.AES.decrypt(src, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      })
    
      var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
      return decryptedStr.toString()
    }
    
    

Java后端端AES加解密

		package com.winning.devops.util;
		
		import org.apache.commons.codec.binary.Base64;
		
		import javax.crypto.Cipher;
		import javax.crypto.spec.IvParameterSpec;
		import javax.crypto.spec.SecretKeySpec;
		
		/**
		 * @ClassName AesUtil
		 * @Description TODO
		 * @Author Evol
		 * @Date 2019/07/23 13:54
		 **/
		public class AesUtil {
		
		    private static String KEY = "1019E2991V09O17L1019E2991V09O17L";
		
		    private static String IV = "1019E2991V09O17L";
		
		
		    /**
		     * 加密方法
		     *
		     * @param data 要加密的数据
		     * @param key  加密key
		     * @param iv   加密iv
		     * @return 加密的结果
		     * @throws Exception
		     */
		    public static String encrypt(String data, String key, String iv) throws Exception {
		        try {
		            //"算法/模式/补码方式"PKCS5Padding"
		            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		            byte[] plaintext = data.getBytes("UTF-8");
		
		            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
		            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
		
		            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
		            byte[] encrypted = cipher.doFinal(plaintext);
		
		            return new Base64().encodeToString(encrypted);
		
		        } catch (Exception e) {
		            e.printStackTrace();
		            return null;
		        }
		    }
		
		    /**
		     * 解密方法
		     *
		     * @param data 要解密的数据
		     * @param key  解密key
		     * @param iv   解密iv
		     * @return 解密的结果
		     * @throws Exception
		     */
		    public static String decrypt(String data, String key, String iv) throws Exception {
		        try {
		            byte[] encrypted1 = new Base64().decode(data);
		
		            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
		            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
		
		            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
		
		            byte[] original = cipher.doFinal(encrypted1);
		            String originalString = new String(original, "UTF-8");
		            return originalString;
		        } catch (Exception e) {
		            e.printStackTrace();
		            return null;
		        }
		    }
		
		    /**
		     * 使用默认的key和iv加密
		     *
		     * @param data
		     * @return
		     * @throws Exception
		     */
		    public static String encrypt(String data) throws Exception {
		        return encrypt(data, KEY, IV);
		    }
		
		    /**
		     * 使用默认的key和iv解密
		     *
		     * @param data
		     * @return
		     * @throws Exception
		     */
		    public static String decrypt(String data) throws Exception {
		        return decrypt(data, KEY, IV);
		    }
		
		
		    /**
		     * 测试
		     */
		    public static void main(String args[]) throws Exception {
		
		        String test1 = "root";
		        String test = new String(test1.getBytes(), "UTF-8");
		        String data = null;
		        String key = KEY;
		        String iv = IV;
		        data = encrypt(test, key, iv);
		        System.out.println("数据:" + test);
		        System.out.println("加密:" + data);
		        String jiemi = decrypt(data, key, iv);
		        System.out.println("解密:" + jiemi);
		    }
		
		}

注意: 后端的补码方式设置为PKCS5Padding,对应vue前端的CryptoJS.pad.Pkcs7。如果此处改为无补码的方式,解密后得到的字符串会有多余空格。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值