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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javax.crypto.BadPaddingException:给定最终块没有正确填充Exception相关的知识,希望对你有一定的参考价值。

我试图在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);
        }
答案

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

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

以上是关于javax.crypto.BadPaddingException:给定最终块没有正确填充Exception的主要内容,如果未能解决你的问题,请参考以下文章