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

前端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日