我正在尝试使用以下方法来使用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);
}
答案 0 :(得分:0)
AES有一个块大小:16字节,因此将块大小设置为另一个值是一个错误。但是你没有设置块大小,只是创建(在这种情况下)1024字节的缓冲区。
大多数实现都接受一个数组,并且会一次在内部处理输入块。但是输入必须是块大小的精确倍数,并且通过填充(通常为PKCS#7 padding来完成),并且通过选项自动处理,通过添加加密和删除解密。