首页 > 编程语言 >AES算法 前端JavaScript加密 后端Java解密

AES算法 前端JavaScript加密 后端Java解密

时间:2023-04-20 10:33:55浏览次数:51  
标签:AES uuid32 String text JavaScript vector key new Java

CryptoJS https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js

中文文档 https://cryptojs.gitbook.io/docs/

var AES = function () {
	const uuid32 = "00010203-04050607-08090A0B-0C0D0E0F".toString();
    const param = Array.from(uuid32.replaceAll("-", "").trim()).reduce(
        (prev, curr, idx) => {
            (0 === idx % 2 ? prev.key : prev.iv).unshift(curr);
            return prev;
        },
        {key: [], iv: []}
    );
    function sha1prng(key, length) {
        let hash = CryptoJS.SHA1(key);
        let result = CryptoJS.SHA1(hash).toString();
        return CryptoJS.enc.Hex.parse(result.substring(0, length));
    }
    const key = sha1prng(param.key.join(''), 32);
    const iv = CryptoJS.enc.Utf8.parse(param.iv.join(''));
    const cfg = {iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7};

    function Encrypt(text) {
        return CryptoJS.AES.encrypt(text, key, cfg).toString();
    }

    function Decrypt(text) {
        return CryptoJS.AES.decrypt(text, key, cfg).toString(CryptoJS.enc.Utf8);
    }

    return {
        Encrypt,
        Decrypt
    }
};
package xxx;

import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.*;
import java.util.Base64;

public class AESEncryptor {

    /**
     * text: 加密内容
     * uuid32: 组织唯一识别码,32位字符串
     */
    public static String encrypt(String text, String uuid32) throws Exception {
        if (null != uuid32 && 0 < uuid32.length()) {
            uuid32 = uuid32.replace("-", "").trim();
            if (uuid32.length() == 32) {
                StringBuilder key = new StringBuilder();
                StringBuilder vector = new StringBuilder();
                char[] arr = uuid32.toCharArray();
                for (int i = 0; i < arr.length; i++) {
                    if (i % 2 == 0) {
                        key.insert(0, arr[i]);
                    } else {
                        vector.insert(0, arr[i]);
                    }
                }
                return encrypt(text, key.toString(), vector.toString());
            }
        }
        throw new Exception("uuid32 format error!");
    }

    /**
     * text: (base64编码格式)
     * uuid32: 组织唯一识别码,32位字符串
     */
    public static String decrypt(String text, String uuid32) throws Exception {
        if (null != uuid32 && 0 < uuid32.length()) {
            uuid32 = uuid32.replace("-", "").trim();
            if (uuid32.length() == 32) {
                StringBuilder key = new StringBuilder();
                StringBuilder vector = new StringBuilder();
                char[] arr = uuid32.toCharArray();
                for (int i = 0; i < arr.length; i++) {
                    if (i % 2 == 0) {
                        key.insert(0, arr[i]);
                    } else {
                        vector.insert(0, arr[i]);
                    }
                }
                return decrypt(text, key.toString(), vector.toString());
            }
        }
        throw new Exception("uuid32 format error!");
    }


    /**
     * text: 加密内容
     * key: 加密的盐,16位字符串
     * vector: 加密的向量,16位字符串
     */
    public static String encrypt(String text, String key, String vector) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec iv = new IvParameterSpec(vector.getBytes("utf-8"));
        Key secretKey= initKeyForAES(key);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] content = text.getBytes("utf-8");
        byte[] encrypted = cipher.doFinal(content);
        return Base64.getEncoder().encodeToString(encrypted);
    }

    /**
     * content: 解密内容(base64编码格式)
     * key: 加密时使用的盐,16位字符串
     * vector: 加密时使用的向量,16位字符串
     */
    public static String decrypt(String text, String key, String vector) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        Key secretKey= initKeyForAES(key);
        IvParameterSpec iv = new IvParameterSpec(vector.getBytes("utf-8"));
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] content = Base64.getDecoder().decode(text);
        byte[] encrypted = cipher.doFinal(content);
        return new String(encrypted,"utf-8");
    }

    private static Key initKeyForAES(String key) throws Exception {
        if (null == key || key.length() == 0) {
            throw new Exception("key not is null");
        }
        SecretKeySpec key2 = null;
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(key.getBytes());
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, random);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            key2 = new SecretKeySpec(enCodeFormat, "AES");
        } catch (NoSuchAlgorithmException ex) {
            throw new Exception(ex.getMessage());
        }
        return key2;
    }
}

标签:AES,uuid32,String,text,JavaScript,vector,key,new,Java
From: https://www.cnblogs.com/lamia/p/17335867.html

相关文章

  • Java 8 中使用反射进行命令执行的 5 个方法
    今天在逛先知的时候看到了一篇文章:《探究使用反射进行除Runtime的命令执行方法》https://xz.aliyun.com/t/12446其中大概讲了下命令执行的其他构造方式,但最后没有给出实例,所以我这里就简单研究了一下。概述在RASP等安全产品防护严密的现在,普通的寻找Runtime.getRuntime().exec(......
  • 如何查看 java程序是否运行
    Linux系统:1、ps-ef|grepjava  2、查看日志输出的pid 3、关闭进程kill34338或kill-934338 4、启动java程序 ./start.sh  windows系统:(命令行)1、打开命令窗口(以管理员身份运行)cmd2、查找所有运行的端口netstat-ano3、查看被占用端口对应的PID......
  • Java架构师面试题
    Java架构师面试题以下是一些Java架构师面试题的示例:请谈谈你对Java多线程的理解,并介绍一下Java线程池的使用场景。请谈谈你在项目中遇到的最困难的问题是什么,以及你是如何解决的?请谈谈你对Spring框架的理解,并介绍一下Spring的核心模块和作用。请简述一下你对RESTfulAPI的认......
  • Java架构师在项目中的经验
    好的,以下是一个更详细的Java架构师在项目中的经验描述:项目名称:XXX系统项目描述:该项目是一个基于微服务架构的电商平台,涵盖了商品管理、订单管理、支付管理、会员管理等多个模块。作为Java架构师,负责系统的整体设计和开发工作。项目职责:负责制定系统的整体架构和技术方案,根据业......
  • Java架构师在项目中的经验描述示例
    以下是一个Java架构师在项目中的经验描述示例:项目名称:XXX系统项目描述:该项目是一个基于微服务架构的电商平台,涵盖了商品管理、订单管理、支付管理、会员管理等多个模块。作为Java架构师,负责系统的整体设计和开发工作。项目职责:设计并实现了整个系统的微服务架构,包括服务拆分、......
  • 资深Java架构师简历
    资深Java架构师简历以下是一个资深Java架构师的简历示例:姓名:李四联系方式:12345678901|[email protected]职业目标:资深Java架构师教育背景:本科学位,计算机科学与技术专业,清华大学,2005年毕业技能与经验:15年以上Java开发经验,熟悉Spring、MyBatis等主流框架精通数据库设计和优......
  • Java架构师简历
    以下是一个Java架构师的简历示例:姓名:张三联系方式:12345678900|[email protected]职业目标:Java架构师教育背景:本科学位,计算机科学与技术专业,清华大学,2010年毕业技能与经验:10年以上Java开发经验,熟悉Spring和Hibernate框架精通数据库设计和优化,能够使用Oracle、MySQL等主......
  • Java架构师项目经验历史最详细版本
    Java架构师项目经验历史最详细版本好的,以下是一个Java架构师在项目中的历史最详细版本的经验描述:项目名称:XXX系统项目描述:该项目是一个基于微服务架构的电商平台,涵盖了商品管理、订单管理、支付管理、会员管理等多个模块。作为Java架构师,负责系统的整体设计和开发工作。项目职......
  • JavaScript-构造表单并提交数据
     //使用form表单实现post方式文件下载downloadPost:function(url,data){varbody=document.getElementsByTagName('body')[0];varform=document.createElement('form');form.method='POST&......
  • Solon v2.2.12 发布,Java 应用开发框架
    Solon是一个高效的Java应用开发框架:更快、更小、更简单。它不是Spring、没有使用Servlet、JavaEE接口,是一个有自己接口标准的开放生态:150多个生态插件,可以满足各种场景开发大量的国产框架适配,可以为应用软件国产化提供更好支持,助力信创建设相对于SpringBoot和Sprin......