首页 > 其他分享 >AES加密 前后端解决方案

AES加密 前后端解决方案

时间:2024-05-08 09:33:05浏览次数:21  
标签:AES 加密 String 解决方案 decrypt bytes let static byte

1、参考

前后端AES加解密,java使用CipherOutputStream加密输出时,前端分段解密方案-CSDN博客

使用crypto-js对文件上传下载进行加密处理_cryptojs如何加密文件流-CSDN博客

AES解密报错,Input length must be multiple of 16 when decrypting with padded cipher-CSDN博客

2、html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <title>AES文件加密 前端js后端Java解决方案</title>
</head>
<h1>AES</h1>
<div>
    <input type="file">
</div>

<body></body>
<script src="../script/jq/jquery-2.1.1.min.js"></script>
<script src="./crypto-js-4.2.0/crypto-js.js"></script>
<script>
    $(function () {
        addEventListener();
    });

    function addEventListener() {
        let input = document.querySelector('input');
        input.addEventListener('change', function (e) {
            let file = e.target.files[0];
            let reader = new FileReader()
            reader.readAsArrayBuffer(file);  //readAsText(file,encoding)
            reader.onload = async (e) => {
                let bytes01 = e.target.result;
                console.log("====bytes01", bytes01);
                let dataStr = encrypt_bytes(bytes01);
                save(dataStr, file);
            }
        })
    }

    function encrypt_bytes(bytes) {
        let keyHex = CryptoJS.enc.Utf8.parse("123456789_123456");
        let bytes02 = CryptoJS.lib.WordArray.create(bytes);
        let encrypted = CryptoJS.AES.encrypt(bytes02, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        console.log("====encrypted", encrypted);
        let dataStr = encrypted.toString();  //base64编码字符串
        console.log("====dataStr", dataStr);
        return dataStr;
    }

    function save(dataStr, file) {
        let blob2 = new Blob([dataStr], { type: file.type });
        // 创建一个URL对象
        let url = URL.createObjectURL(blob2);
        // 创建一个a标签并设置下载属性
        let a = document.createElement("a");
        a.href = url;
        a.download = "hello.txt";
        // 模拟点击a标签来下载文件
        a.click();
        // 释放URL对象
        URL.revokeObjectURL(url);
    }
</script>

</html>

3、java

public class Test05_Cipher {
    private static String path = "C:\\Users\\xxx\\Downloads\\hello (39).txt";
    private static String path2 = "C:\\Users\\xxx\\Downloads\\hello (101).txt";

    public static void main(String[] args) throws Exception {
        byte[] bytes01 = FileUtil.readBytes(path);
        byte[] decodedBytes = Base64.getDecoder().decode(bytes01);
        byte[] decrypt = AesUtil.decrypt(decodedBytes);
        String a11 = new String(decrypt, StandardCharsets.UTF_8);
        System.out.println(a11);
    }
}

AesUtil

import org.apache.shiro.codec.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class AesUtil {
    private static final String secret_key = "123456789_123456";
    private static final String cipher_algorithm = "AES/ECB/PKCS5Padding";

    public static void main(String args[]) throws Exception {
        {
            String a1 = "Cipher在使用时需以参数方式指定transformation";
            byte[] encrypt = encrypt(a1.getBytes(StandardCharsets.UTF_8));
            byte[] decrypt = decrypt(encrypt);
            System.out.printf("===== \n\t%s \n\t%s%n", a1, new String(decrypt));
        }
        {
            String b2 = "transformation的格式为algorithm/mode/padding";
            String encrypt = encryptToBase64(b2);
            String decrypt = decryptByBase64(encrypt);
            System.out.printf("===== \n\t%s \n\t%s%n", b2, decrypt);
        }
    }

    public static String encryptToBase64(String data) {
        try {
            byte[] bytes = encrypt(data.getBytes(StandardCharsets.UTF_8));
            return java.util.Base64.getEncoder().encodeToString(bytes);
        } catch (Exception e) {
            return data;
        }
    }

    public static String decryptByBase64(String base64) {
        try {
            byte[] decode_bytes = java.util.Base64.getDecoder().decode(base64);
            byte[] decrypt_bytes = decrypt(decode_bytes);
            return new String(decrypt_bytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            return base64;
        }
    }

    public static byte[] encrypt(byte[] bytes) throws Exception {
        return doFinal(bytes, Cipher.ENCRYPT_MODE);
    }

    public static byte[] decrypt(byte[] bytes) throws Exception {
        return doFinal(bytes, Cipher.DECRYPT_MODE);
    }

    public static byte[] doFinal(byte[] bytes, int decryptMode) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(secret_key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance(cipher_algorithm);
        cipher.init(decryptMode, secretKey);
        return cipher.doFinal(bytes);
    }
}

标签:AES,加密,String,解决方案,decrypt,bytes,let,static,byte
From: https://www.cnblogs.com/kikyoqiang/p/18178982

相关文章

  • AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处
    本篇为「AI数据观」系列文章第二弹,在这里,我们将进一步探讨AI行业的数据价值。以RAG的智能工单应用场景为例,共同探索如何使用TapdataCloud+MongoDBAtlas实现具备实时更新能力的向量数据库,为企业工单处理的智能化和自动化需求,提供准实时的新鲜数据。完整分布教程指引,详见......
  • 利用神经网络对脑电图(EEG)降噪------开源的、低成本、低功耗微处理器神经网络模型解
    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能这个示例展示了如何使用EEGdenoiseNet基准数据集[1]和深度学习回归去除脑电图(EEG)信号中的眼电图(EOG)噪声。EEGdenoiseNet数据集包含4514个干净的EEG片段和3400个眼部伪迹片段,这些片段可以用来合成带有......
  • 加密技术在保护企业数据中的应用
    加密技术是企业数据保护的核心,对于维护信息安全至关重要。透明加密技术使文件加密后不改变用户对文件的使用习惯,内部文件打开自动解密,存储自动加密,一旦离开使用环境,加密文件将无法正常读取,从而保护文件内容。华企盾DSC数据安全防泄密系统在这方面提供了强大的支持,以下是加密技术在......
  • 加密压缩文件zip&tar
    加密一些机密的文件使用zip加密加密过程#zip-repackageTest.zippackageTest#或者写为明文密码zip-rPyourpasswordpackageTest.zippackageTestEnterpassword:Verifypassword:adding:packageTest/(stored0%)adding:packageTest/a.txt(stored0%)add......
  • [转]openEuler 22.03 (LTS-SP1)安装最新版Docker(踩坑及解决方案)
    原文地址:openEuler22.03(LTS-SP1)安装最新版Docker(踩坑及解决方案)_openeulerdocker-CSDN博客openEuler22.03LTS-SP1要是直接yuminstalldocker,默认安装docker是18.09.0,这个版本Docker有个bug,所以还是安装个最新版Docker。1、先增加docker官方仓库[[email protected]......
  • 非对称加密中,加解密和签名
    在非对称加密中,加解密使用的密钥取决于具体的用途:加密:通常情况下,当想要确保数据的机密性,即希望只有特定接收方能够读取信息时,发送方会使用接收方的公钥对数据进行加密。这样一来,只有拥有对应私钥的接收方才能够解密并查看原始信息。解密:对应地,接收方收到加密后的数据后,......
  • sd-wan各厂家解决方案
    锐捷华为华三Fortinet......
  • https加密机制
    参考:https://www.cnblogs.com/sxiszero/p/11133747.htmlhttps://www.cnblogs.com/technology178/p/14094375.html对称加密:只用一个秘钥的加解密,如果秘钥进行了泄漏,导致数据不安全非对称加密:非对称加密算法需要一组密钥对,分别是公钥和私钥,这两个密钥是成对出现的。公钥加密的内......
  • RestTemplate返回结果乱码的两种解决方案
    以下代码调用某接口时出现乱码:HttpHeadershttpHeaders=newHttpHeaders();httpHeaders.add("Content-Type","application/json;charset=utf-8");org.springframework.http.HttpEntity<String>httpEntity=neworg.springframework.http.HttpEntity<......
  • 电子合同一站式解决方案 | 京东云技术团队
    一:平台定位和优势(为什么建)1.1、平台定位由京东科技业务中台主导发起,联合法律部、安全部共建,旨在为业务提供电子合同管理的中台化能力,当前已形成一套成熟的“全线上、全生命周期电子合同管理系统”,可提供包括合同模板创建、模板预览、合同生成、合同预览、合同签署、合同记录查询......