我正在尝试使用以下方法使用 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);
}
AES 有一个块大小:16 字节,因此将块大小设置为另一个值是错误的。但是您没有设置块大小,只是创建了一个(在本例中)1024 字节的缓冲区。
大多数实现都接受一个数组,并将在内部一次处理一个块的输入。但是输入必须是块大小的精确倍数,这是通过填充完成的,通常是PKCS#7 padding,并且通过一个选项通过添加加密和删除解密来自动处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句