首页 > 编程语言 >vue+java AES 加密 解密

vue+java AES 加密 解密

时间:2022-10-12 20:47:26浏览次数:36  
标签:AES vue java String iv key return CryptoJS data

后端:

导入aes依赖

  <!-- aes加密工具 -->
  <dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
  </dependency>

创建AES工具类

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil {

    //key为16位
    private static String KEY = "1234567890123456";

    private static String IV = "1234567890123456";


    /**
     * 加密方法
     *
     * @param data 要加密的数据
     * @param key  加密key
     * @param iv   加密iv
     * @return 加密的结果
     * @throws Exception
     */
    public static String encrypt(String data, String key, String iv) throws Exception {
        try {

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding
            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(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 desEncrypt(String data, String key, String iv) throws Exception {
        try {
            byte[] encrypted1 = new Base64().decode(data);

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            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 desEncrypt(String data) throws Exception {
        return desEncrypt(data, KEY, IV);
    }


    /**
     * 测试
     */
    public static void main(String args[]) throws Exception {

        String test1 = "123456";
        String test = new String(test1.getBytes(), "UTF-8");
        String data = null;
        String key = KEY;
        String iv = IV;
        // /g2wzfqvMOeazgtsUVbq1kmJawROa6mcRAzwG1/GeJ4=
        data = encrypt(test, key, iv);
        System.out.println("数据:" + test);
        System.out.println("加密:" + data);
        String jiemi = desEncrypt("OnJ4xI17sBAJ1KcZBhOyQQ==", key, iv).trim();
        System.out.println("解密:" + jiemi);


    }
}

vue前端

引入 crypto-js

npm install -S crypto-js

新建全局工具类

import CryptoJS from 'crypto-js/crypto-js'
 
// 默认的 KEY 与 iv 如果没有给
const KEY = CryptoJS.enc.Utf8.parse("1234567890123456");
const IV = CryptoJS.enc.Utf8.parse('1234567890123456');
 
/**
 * 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.ZeroPadding
  });
  // 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.ZeroPadding
  });
 
  var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}

秘钥和key和加密方式,填充方式要一致。

标签:AES,vue,java,String,iv,key,return,CryptoJS,data
From: https://www.cnblogs.com/july4/p/16785879.html

相关文章

  • java反序列化漏洞及其检测
    1java反序列化简介java反序列化是近些年安全业界研究的重点领域之一,在ApacheCommonsCollections、JBoss、WebLogic等常见容器、库中均发现有该类漏洞,而且该类型漏洞容......
  • Java基础语法 数组的默认初始化值
    默认初始化值packagecom.ljg.java;/**⑤数组元素的默认初始化值* >数组元素是整型:0* >数组元素是浮点型:0.0* >数组元素是char型:0或'\u0000',而非'0'......
  • json操作 - 对象和json字符串 互转 JavaScript
    json操作-对象和json字符串互转JavaScript?12345678910111213141516171819<script>    //json数据转换    vardata={        name:'小明',......
  • Java图形化学生管理(一)
    JPanel和JFrame概述:AWT抽象窗口工具包,与本地图形界面进行交互的接口;Swing类相当与AWT类的扩展,Swing更加好用;1Swing中的容器:JPanel容器;中层容器;面板;不可独立JFrame......
  • Java的基本数据类型
    Java的基本数据类型类型的转换类型转换主要分为强制类型转换以及自动转换数据类型的精密度由高到低必须使用强制类型转换精密度排序如下(由低到高)xxxxxxxxxx......
  • Vue10货物增删改查
    序实现简单的增删改查案例实现效果源码<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title></title> <style> th{ background-color:......
  • vue11 组件初识
    序组件(component)是vue.js最强大的功能之一。组件的作用就是封装可重用的代码,通常一个组件就是一个功能体,便于在多个地方都能够调用这个功能体。每个组件都是Vue的实例对......
  • webpack5 + vue3 打包问题
    1,打包后本地访问空白或者404问题解决办法:  2, 打包CSS图片路径不正确问题在生产模式下,使用的MiniCssExtractPlugin.loader代替style-loader,但图片、字体等资源......
  • docker-compose 启动 java 容器时报错 library initialization failed - unable to al
    问题:docker-compose启动java容器时报错libraryinitializationfailed-unabletoallocatefiledescriptortable-outofmemoryPickedupJAVA_TOOL_OPTIONS:......
  • Vue项目添加水印
    1.utils文件夹下创建canvas画布水印文件utils/watermark.jsletwatermark={}letsetWatermark=(str)=>{letid='1.23452384164.123412416';if(docume......