热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue.jsjava前后台aes对称加密解密CBC模式

JAVA端封装packagecom.zdgk.application.thirdparty.pay.compont;importorg.apache.commons.codec.

JAVA端封装

package com.zdgk.application.thirdparty.pay.compont;import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.net.util.Base64;
import org.springframework.core.env.Environment;
import org.springframework.util.Base64Utils;import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;/*** @description AES加密解密类* create by hss on 2017/10/16*/
public class AesUtil {private final int keySize = 128;private final int iterationCount = 147;private final Cipher cipher;private static String status = null;private static String passphase = null;public static String salt = null;public AesUtil() {try {cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {throw fail(e);}}public String encrypt(String salt, String iv, String passphrase, String plaintext) {try {SecretKey key = generateKey(salt, passphrase);byte[] encrypted = doFinal(Cipher.ENCRYPT_MODE, key, iv, plaintext.getBytes("UTF-8"));return base64(encrypted);} catch (UnsupportedEncodingException e) {throw fail(e);}}public String decrypt(String salt, String iv, String passphrase, String ciphertext) {try {SecretKey key = generateKey(salt, passphrase);byte[] text=base64(ciphertext);byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, iv, text);return new String(decrypted, "UTF-8");} catch (UnsupportedEncodingException e) {throw fail(e);}}private byte[] doFinal(int encryptMode, SecretKey key, String iv, byte[] bytes) {try {cipher.init(encryptMode, key, new IvParameterSpec(hex(iv)));return cipher.doFinal(bytes);} catch (InvalidKeyException| InvalidAlgorithmParameterException| IllegalBlockSizeException| BadPaddingException e) {throw fail(e);}}private SecretKey generateKey(String salt, String passphrase) {try {SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), hex(salt), iterationCount, keySize);SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");return key;} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {throw fail(e);}}public static String random(int length) {byte[] salt = new byte[length];new SecureRandom().nextBytes(salt);return hex(salt);}public static String base64(byte[] bytes) {try {return Base64.encodeBase64String(bytes);} catch (Exception e) {e.printStackTrace();}return null;}public static byte[] base64(String str) {try {String str1=str.replaceAll(" ","");return Base64.decodeBase64(str1);} catch (Exception e) {e.printStackTrace();}return null;}public static String hex(byte[] bytes) {return new String(Hex.encodeHex(bytes));}public static byte[] hex(String str) {try {return Hex.decodeHex(str.toCharArray());} catch (DecoderException e) {throw new IllegalStateException(e);}}private IllegalStateException fail(Exception e) {return new IllegalStateException(e);}/*** @description 进行加密的方法* @param originText* @param iv* @return String 加密后的结果*/public static String en(String originText,String iv) {if ("0".equals(status)) {return originText;}try {return new AesUtil().encrypt(salt,iv,passphase,originText);}catch (Exception e) {return "";}}/*** @description 进行解密的方法* @param aesText* @param iv* @return String 解密后的结果*/public static String de(String aesText,String iv) {if ("0".equals(status)) {return aesText;}try {return new AesUtil().decrypt(salt,iv,passphase,aesText);}catch (Exception e) {e.printStackTrace();return "";}}public static void main(String[] args) throws Exception {String IV = "随机的IV"; //tygString SALT = "随机SALT";String PLAIN_TEXT = "你是谁?";//String PASSPHRASE = "";String PASSPHRASE = "铭文的KEY";AesUtil util = new AesUtil();String encrypt = util.encrypt(SALT, IV, PASSPHRASE, PLAIN_TEXT);System.out.println(encrypt);System.out.println(Base64Utils.encode(encrypt.getBytes()));String decrypt = util.decrypt(SALT, IV, PASSPHRASE, encrypt);System.out.println(decrypt);
// String data = util.encrypt(SALT,"40e6caa88cc44193b4be8030029f85bf",PASSPHRASE,PLAIN_TEXT);
// System.out.println(data);
// String str = URLDecoder.decode("O5zrbt4B2Y%2BN0LAfM%2F%2BpYlzFJqtALTavfkBTzZaygiSwl1tkCDUTNqylkS0986exmPl8e%2BJEEdUESiGtO4ScYQ%3D%3D", System.getProperty("encoding", "UTF-8"));
// System.out.println(str);
// System.out.println(util.decrypt(SALT,"40e6caa88cc44193b4be8030029f85bf",PASSPHRASE,"O5zrbt4B2Y+N0LAfM/+pYlzFJqtALTavfkBTzZaygiSwl1tkCDUTNqylkS0986exmPl8e+JEEdUESiGtO4ScYQ=="));}
}

VUE

安装依赖crypto-js

npm install crypto-js --save

import CryptoJS from 'crypto-js'let keySizes,iterationCounts;
let AesUtil = function (keySize, iterationCount) {keySizes = keySize / 32;iterationCounts = iterationCount;
};
const that = new AesUtil(128, 147);
AesUtil.prototype.generateKey = function (salt, passPhrase) {let key = CryptoJS.PBKDF2(passPhrase,CryptoJS.enc.Hex.parse(salt),{ keySize: keySizes, iterations: iterationCounts });return key;
}AesUtil.prototype.encrypt = function (salt, iv, passPhrase, plainText) {let key = that.generateKey(salt, passPhrase);let encrypted = CryptoJS.AES.encrypt(plainText,key,{ iv: CryptoJS.enc.Hex.parse(iv) });return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}AesUtil.prototype.decrypt = function (salt, iv, passPhrase, cipherText) {let key = that.generateKey(salt, passPhrase);let cipherParams = CryptoJS.lib.CipherParams.create({ciphertext: CryptoJS.enc.Base64.parse(cipherText)});let decrypted = CryptoJS.AES.decrypt(cipherParams,key,{ iv: CryptoJS.enc.Hex.parse(iv) });return decrypted.toString(CryptoJS.enc.Utf8);
}
//let aes = new AesUtil(128,147);
// let decrypted = aes.decrypt("这里是SALT","这里是IV","这里是明文的固定KEY","要解密字符串");
// console.log(decrypted);
// let encrypted = aes.encrypt("这里是SALT","这里是IV","这里是明文的固定KEY","要加密字符串");
// console.log(encrypted);
export default {encrypt:that.encrypt,decrypt:that.decrypt,
}

导出来的对象里面encrypt和decrypt就是加密和解密函数

参考资料:点击跳转


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 标题: ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
ynyx六五
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有