Apache Commons Crypto - 获取IllegalBlockSizeException

时间:2017-03-31 15:27:48

标签: apache encryption aes

我正在尝试使用以下方法来使用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);
    }

1 个答案:

答案 0 :(得分:0)

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

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