Java 压缩AES中的某些密文块

Java 压缩AES中的某些密文块,java,encryption,aes,Java,Encryption,Aes,我需要解密一个AES密文,我有它的密钥。问题在于,在Java中解密时,会发生错误: javax.crypto.BadPaddingException: Given final block not properly padded 我认为这是数据库中数据持久化的问题,并且数据的某些部分已损坏(因为到目前为止还并没有问题,所以它不可能是关键)。密文的长度是16的倍数 两个问题: 如果我删除最后一个16字节的块,是否可以解密数据 你还有其他建议吗 如果可以保证消息长度始终是AES块大小(16字节)的倍

我需要解密一个AES密文,我有它的密钥。问题在于,在Java中解密时,会发生错误:

javax.crypto.BadPaddingException: Given final block not properly padded
我认为这是数据库中数据持久化的问题,并且数据的某些部分已损坏(因为到目前为止还并没有问题,所以它不可能是关键)。密文的长度是16的倍数

两个问题:

  • 如果我删除最后一个16字节的块,是否可以解密数据
  • 你还有其他建议吗

  • 如果可以保证消息长度始终是AES块大小(16字节)的倍数,则可以在加密时使用
    NOPADDING
    为padding spec省略填充。如果在不需要填充的模式下使用AES(即
    CTR
    模式),也可以省略填充

    此外,您也可以尝试使用
    NOPADDING
    对填充消息进行解密,但您必须在某个时候处理明文中的填充


    总的来说,你最好试着弄清楚为什么你的消息没有正确解密,而不是尝试解决办法。处理加密时的变通方法通常不是一个好主意。

    错误的填充可能是很多事情,包括在解密过程中使用错误的密钥、IV或填充规范。演示此问题的示例将帮助我们确定您的流程中的错误。@Dev谢谢。我将尝试进行更深入的调试,并最终提供一些更新。关于第一个问题有什么想法吗?我使用的是
    Cipher.getInstance(“AES”)
    ,它似乎与“AES/ECB/PKCS5P”相同。当切换到“AES/ECB/NoPadding”时,我成功地解密了密文,它似乎只是原始明文的一部分。问题很可能来自于在多个线程中使用同一个密码实例。谢谢你的建议,德夫。安德烈很高兴我能帮上忙。请注意,如果使用同一密钥加密超过16个字节(1个块),则ECB模式是不安全的,因此,如果出于真正的安全目的使用此密码配置,我建议您重新访问您的实现。感谢您的提示,最初我认为这是另一种默认模式。我将寻找解决方案,以便与现有数据保持兼容。