在 JS 中加密并在 Java 中解密 - 错误

Encrypting in JS and decrypting in Java - errors

我有一个用例,我需要在 JS 中加密并在 Java 中解密。我尝试了两种方法:

  1. 基于this library in github

对于这种情况,我得到一个 javax.crypto.BadPaddingException:给定的最终块未正确填充错误。

  1. 参考各种来源编写的代码。 对于加密:

        var salt = CryptoJS.lib.WordArray.random(16);
        var salt_hex = CryptoJS.enc.Hex.stringify(salt);
        var iv = CryptoJS.lib.WordArray.random(16);
        var iv_hex = CryptoJS.enc.Hex.stringify(iv);
        var key = CryptoJS.PBKDF2(secret, salt, {
            keySize : 256 / 32,
            iterations : 1
        });
    
        var encrypted = CryptoJS.AES.encrypt(value, key, { iv : iv });
    

    我将 'salt'、'iv' 和 'encrypted' 传递给 JS 代码。这里我用

    解密
    SecretKey key = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
    plaintext = new String(cipher.doFinal(msg), "UTF-8"); 
    

在这种情况下,我得到 java.security.InvalidKeyException:在这种情况下密钥大小非法。

我的设置是:

  1. JS端写在一个AngularJS服务
  2. 服务器 java 代码是通过 MobileFirst Server 中的适配器调用的

关于我哪里出错的任何指示。

你提供的代码好像没有问题:

  • 检查 PBKDF2 是否在两端生成相同的密钥。
  • 检查您是否正确地将十六进制解码为字节,反之亦然(在需要的地方)。
  • 检查您是否安装了 AES-256 的无限强度策略(当前 v7 and v8)。由于美国军方出口限制,使用 JCE 时默认情况下不启用 AES-256。

感谢Artjom B,感谢您的回答。我已经执行了您提到的所有步骤,但没有任何运气。

选项 2 中的代码现在可以正常工作。它起作用的一个可能原因是机器重启。否则想不出任何其他可能影响它的变化。