javax.crypto.BadPaddingException:给定最终块没有正确填充Exception

时间:2017-12-15 14:23:02

标签: javascript java encryption cryptography aes

我尝试在javascript中加密JSON,如下所示,它是加密的。 在下面" obj"是我的JSON数据,我不知道为什么" ency_key",我从谷歌的一些地方跟着这个,他们就像那样传递了String。

var obj1 = CryptoJS.AES.encrypt(obj,'ency_key').toString();
$.ajax({
    url: "web/enyDcyData", 
    "type": "POST",
    async:true,
    data:{   
        json:obj1,
    }

但是我无法解密java中的数据,我在java中尝试过如下所示。我得到 javax.crypto.BadPaddingException:在" doFinal(base64Decode(ency_data));" 时给出最后一个块没有正确填充异常 我做错了,请帮我解决这个问题。

public static String decrypt(String ency_data)
        SecretKeyFactory keyFac = SecretKeyFactory.getInstance(one);
        SecretKey seckey = keyFac.generateSecret(new PBEKeySpec(two));
        Cipher cipher = Cipher.getInstance(one);
        pbeCipher.init(Cipher.DECRYPT_MODE, seckey , new PBEParameterSpec(SALT, 20));
        byte[] res = cipher.doFinal(base64Decode(ency_data));
        String decryptedValue = new String(res,"UTF-8");
    }   

        private static byte[] base64Decode(String ency_data) throws IOException {
           return new BASE64Decoder().decodeBuffer(ency_data);
        }

1 个答案:

答案 0 :(得分:1)

您使用的密钥派生功能是不同的。 CryptoJS(版本3)使用OpenSSL兼容密钥派生函数,而您使用PBKDF1(或可能是2,您的算法不包括在内)。您可能需要查找EVP_BytesToKey的实施,例如here。或者,您当然可以寻找整个OpenSSL兼容层。

如果密钥或数据不同,那么您应该期望CBC / ECB模式的填充错误;如果数据大小是块大小的倍数(并且在实例化/初始化期间已接受密钥/算法),则它是唯一可以抛出的错误。