qq_37916181 2024-11-09 17:11 采纳率: 0%
浏览 31
已结题

前端vue CryptoJS Aes CBC加密后端java解密

前端vue CryptoJS Aes CBC加密后端java解不出来而且key,iv不变 加密结果每次都不一样,求解
AES加密、AES解密 - 在线免费AES加解密 - 极捷工具在这个网站进行CBC下任意模式加密 用java解出来就行要有key,iv

  • 写回答

26条回答 默认 最新

  • 阿里嘎多学长 2024-11-09 17:14
    关注
    获得0.30元问题酬金

    阿里嘎多学长整理、AIGC生成:

    Solution

    您的问题涉及到 Front-end 使用 CryptoJS 对数据进行 AES 加密,然后在 Back-end 使用 Java 进行解密的问题。问题出现的原因是 CryptoJS 的 AES 加密使用 CBC 模式,默认值是 PKCS7 填充,而 Java 的 AES 加密使用 PKCS5 填充导致解密失败。

    解决方案是:

    1. 在前端使用 CryptoJS 设置填充方式为 PKCS5:
    const cipher = cryptojs.algo.AES.createCipher('aes-128-cbc', 'your_key', 'your_iv');
    cipher.setAutoPadding(false);
    
    1. 在后端使用 Java 的 Cipher 对象设置填充方式为 PKCS5:
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("your_key".getBytes(), "AES"), new IvParameterSpec("your_iv".getBytes()));
    

    这样,在前端和后端使用相同的密钥和초 IV 则可以实现加密和解密。

    Code

    Front-end:

    const cryptojs = require('crypto-js');
    const key = 'your_key';
    const iv = 'your_iv';
    const data = '数据';
    
    const cipher = cryptojs.algo.AES.createCipher('aes-128-cbc', key, iv);
    cipher.setAutoPadding(false);
    const encrypted = cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
    console.log(encrypted);
    

    Back-end:

    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import javax.crypto.spec.IvParameterSpec;
    import java.util.Base64;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            String key = "your_key";
            String iv = "your_iv";
            String data = "数据";
            String encrypted = Base64.getEncoder().encodeToString(crypto(data, key, iv));
            System.out.println(encrypted);
        }
    
        public static String crypto(String data, String key, String iv) throws Exception {
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"), new IvParameterSpec(iv.getBytes()));
            byte[] byteData = data.getBytes();
            byte[] encrypted = cipher.doFinal(byteData);
            return Base64.getEncoder().encodeToString(encrypted);
        }
    }
    

    Reference

    评论

报告相同问题?

问题事件

  • 系统已结题 11月17日
  • 赞助了问题酬金15元 11月9日
  • 创建了问题 11月9日

悬赏问题

  • ¥15 多尺度特征图提取和融合
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端
  • ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么