如何使用CryptoJS配合Java进行AES加密和解密

注意

1. PKCS5PaddingPKCS7Padding是一样的

2. 加密时使用的key和iv要转换成base64格式

 

一、前端

1.函数

复制代码
    function encrypt (msg, key, iv) {
        return  CryptoJS.AES.encrypt(msg,  key, {
            iv: iv,
            padding: CryptoJS.pad.Pkcs7,
            mode: CryptoJS.mode.CBC
        });
    }


    function decrypt (cipherText, key, iv) {
        return  CryptoJS.AES.decrypt({ ciphertext: cipherText }, key, {
            iv: iv,
            padding: CryptoJS.pad.Pkcs7,
            mode: CryptoJS.mode.CBC

        });
    }
复制代码

 

2. 示例

复制代码
            var key =    CryptoJS.enc.Base64.parse('ZGIyMTM5NTYxYzlmZTA2OA==');
            var iv =    CryptoJS.enc.Base64.parse('ZGIyMTM5NTYxYzlmZTA2OA==');

            var encrypted = encrypt('Hello World', key, iv);
            var cipherText = encrypted.ciphertext.toString();
            //java 使用 34439a96e68b129093105b67de81c0fc
            console.log(cipherText);

            // 拿到字符串类型的密文需要先将其用Hex方法parse一下
            var cipherTextHexStr = CryptoJS.enc.Hex.parse(cipherText);

            // 将密文转为Base64的字符串
            // 只有Base64类型的字符串密文才能对其进行解密
            var cipherTextBase64Str = CryptoJS.enc.Base64.stringify(cipherTextHexStr);

            //下面三种解密都可以
            var decrypted = CryptoJS.AES.decrypt(cipherTextBase64Str, key, {
                iv: iv,
                padding: CryptoJS.pad.Pkcs7,
                mode: CryptoJS.mode.CBC
            });

            decrypted = decrypt(CryptoJS.enc.Base64.parse(cipherTextBase64Str), key, iv);
            decrypted = decrypt(cipherTextHexStr, key, iv);

            console.log(decrypted.toString(CryptoJS.enc.Utf8));
            
复制代码

 

 

二、后端

1.函数

复制代码
    public static byte[] AES_CBC_Decrypt(byte[] data, byte[] key, byte[] iv) throws Exception{
        Cipher cipher = getCipher(Cipher.DECRYPT_MODE, key, iv);
        return cipher.doFinal(data);
    }

    private static Cipher getCipher(int mode, byte[] key, byte[] iv) throws Exception{
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//因为AES的加密块大小是128bit(16byte), 所以key是128、192、256bit无关 //System.out.println("cipher.getBlockSize(): " + cipher.getBlockSize());
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); cipher.init(mode, secretKeySpec, new IvParameterSpec(iv)); return cipher; }
复制代码

 

2.示例

复制代码
        //传给crypto的key、iv要使用base64格式
        //ZGIyMTM5NTYxYzlmZTA2OA==
        byte[] bytes = "db2139561c9fe068".getBytes();
        String base64Str = Base64.encodeBase64String(bytes);
        System.out.println(base64Str);

        String crypto = "34439a96e68b129093105b67de81c0fc";
        data = Hex.decodeHex(crypto.toCharArray());
        s = AES_CBC_Decrypt(data, bytes, bytes);
        System.out.println(new String(s));
复制代码

 

posted @   等风来。。  Views(24549)  Comments(0Edit  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
------------------------------------------------------------------------------------------------------------ --------------- 欢迎联系 x.guan.ling@gmail.com--------------- ------------------------------------------------------------------------------------------------------------
点击右上角即可分享
微信分享提示