Vue与Java使用AES加密与解密

CBC模式(通过偏移值进行加密,更具安全性)

一、VUE:

1、安装

复制代码
npm install crypto-js

2、编写公用js(在common文件夹下创建一个crypto.js)

注意:key最少要有16个字符,iv最少6个字符,否则解密返回结果为空。

javascript 复制代码
import CryptoJS from 'crypto-js'

const KEY = CryptoJS.enc.Utf8.parse('0123456789123456')
const IV = CryptoJS.enc.Utf8.parse('0123456789123456')


// 加密函数
export function encryptData(data) {
    const encrypted = CryptoJS.AES.encrypt(
        data,
        KEY,
        {
            iv: IV,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    )
    return encrypted.toString()
}

// 解密函数
export function decryptData(data) {
    const decrypted = CryptoJS.AES.decrypt(
        data,
        KEY,
        {
            iv: IV,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    )
    return CryptoJS.enc.Utf8.stringify(decrypted)
}

export default {
    encryptData,
    decryptData
}

3、引入js使用

javascript 复制代码
<script>
// 引入js
import { encryptData, decryptData } from '@/common/crypto.js'
export default {
  data() {
    return {},
  },
  created() {
     // 调用方法
     const password = encryptData('123456777')
	 console.log(password, "加密");
	 console.log(decryptData(password),'解密')
  },
  methods: {
  },
};
</script>

二、Java:

1、导入

javascript 复制代码
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

2、新建工具类

javascript 复制代码
package com.nview.utils.aes;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES加密解密
 */
public class AesEncryptUtil {
    /***
     * key和iv值可以随机生成
     */
    private static String KEY = "0123456789123456";

    private static String IV = "0123456789123456";

    /***
     * 加密
     * @param  data 要加密的数据
     * @return encrypt
     */
    public static String encrypt(String data){
        return encrypt(data, KEY, IV);
    }

    /***
     * param data 需要解密的数据
     * 调用desEncrypt()方法
     */
    public static String desEncrypt(String data){
        return desEncrypt(data, KEY, IV);
    }

    /**
     * 加密方法
     * @param data  要加密的数据
     * @param key 加密key
     * @param iv 加密iv
     * @return 加密的结果

     */
    private static String encrypt(String data, String key, String iv){
        try {
            //"算法/模式/补码方式"NoPadding PkcsPadding
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            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 解密的结果
     */
    private static String desEncrypt(String data, String key, String iv){
        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);
            return new String(original).trim();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
相关推荐
mCell44 分钟前
GSAP ScrollTrigger 详解
前端·javascript·动效
gnip44 分钟前
Node.js 子进程:child_process
前端·javascript
RainbowSea3 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea3 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
excel4 小时前
为什么在 Three.js 中平面能产生“起伏效果”?
前端
excel5 小时前
Node.js 断言与测试框架示例对比
前端
天蓝色的鱼鱼6 小时前
前端开发者的组件设计之痛:为什么我的组件总是难以维护?
前端·react.js
codingandsleeping6 小时前
使用orval自动拉取swagger文档并生成ts接口
前端·javascript
考虑考虑7 小时前
Jpa使用union all
java·spring boot·后端
石金龙7 小时前
[译] Composition in CSS
前端·css