【问题标题】:Apache Commons Crypto - Getting IllegalBlockSizeExceptionApache Commons Crypto - 获取 IllegalBlockSizeException
【发布时间】:2017-03-31 15:27:48
【问题描述】:

我正在尝试使用以下方法来处理使用 Apache Commons Crypto 的 AES 数据的加密和解密。加密工作正常。但是当我尝试解密刚刚加密的数据时,我得到了这个块大小错误,我不完全理解,因为我将块大小设置为 1024,当然是 16 的倍数。

javax.crypto.IllegalBlockSizeException: Input length (with padding) not multiple of 16 bytes  

这是我的代码:

        final int bufferSize = 1024;
    try {
      this.cryptoCipher.init(cipherMode, this.secretKeySpec, this.ivParameterSpec);
        ByteBuffer inBuffer = ByteBuffer.allocateDirect(bufferSize);
        ByteBuffer outBuffer = ByteBuffer.allocateDirect(bufferSize);
        inBuffer.put(getUTF8Bytes(dataToBeEncrypted));
        inBuffer.flip();
        int updateBytes = this.cryptoCipher.update(inBuffer, outBuffer);
        int finalBytes = this.cryptoCipher.doFinal(inBuffer, outBuffer);   <<<< EXCEPTION HAPPENS HERE!!!
        byte[] encoded = new byte[updateBytes + finalBytes];
        outBuffer.flip();
        outBuffer.duplicate().get(encoded);
        encryptedDecryptedData = DatatypeConverter.printBase64Binary(encoded);
    } catch (Exception exc) {
        LOGGER.logp(Level.SEVERE, MODULE_NAME, methodName, "encountered exception: {0}", exc);
    }

【问题讨论】:

    标签: apache encryption aes


    【解决方案1】:

    AES 有一个块大小:16 字节,因此将块大小设置为另一个值是错误的。但是您没有设置块大小,只是创建一个(在这种情况下)1024 字节的缓冲区。

    大多数实现都接受一个数组,并在内部一次处理一个块的输入。但是输入必须是块大小的精确倍数,并且通过填充来完成,通常是PKCS#7 padding,并通过一个选项通过添加加密和删除解密来自动处理。

    【讨论】:

    • 谢谢,扎夫。我使用 'AES/CBC/PKCS5Padding' 作为转换值。我在其他地方看到这应该自动转换为 PKCS7 inyernally。但是,我只是尝试将其更改为“AES/CBC/PKCS7Padding”,现在我收到一个错误:Caused by: javax.crypto.NoSuchPaddingException: Padding: PKCS7Padding not implemented 我使用的是 IBM Java 7.1。
    • 使用AES/CBC/PKCS5Padding,PKCS#5 填充是 PKCS#7 的子集,但在所有实现中,它也支持 PKCS#7。由于许多库早于 AES,它们继续使用相同的填充常量。
    • 好的,谢谢。问题是,这就是我一直在使用的,这给了我我的错误。所以我在这一点上有点迷失了。请在下面查看我的“答案”(因为无论出于何种原因,cmets 永远不会为我正确格式化)。
    • 我发现了我的问题。我对传出的加密值进行了 Base64 编码,但没有对传入的数据进行解码。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多