qq_37916181 2024-11-09 17:11 采纳率: 0%
浏览 19
问题最晚将于11月17日00:00点结题

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

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

  • 写回答

22条回答 默认 最新

  • 阿里嘎多学长 2024-11-09 17:14
    关注

    阿里嘎多学长整理、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

    评论

报告相同问题?

问题事件

  • 赞助了问题酬金15元 11月9日
  • 创建了问题 11月9日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。