我用Java密码和AES实现加密/解密。除了在对dofinal()的调用中有5个额外的字节外,其他一切都工作正常。所以,我最后得到了一个正确解码的字符串,附加了5个额外的字节。
我认为原因是整个16字节的块都被写入了。我看到3个16字节的块被写入,包括最后一个。输入加密文件为64字节。未加密的文本应为43个字节。
dofinal的文档表明它可以返回写入输出缓冲区的字节数。但是,它是0,16,16,16。我已经尝试过各种形式的数据处理和更新,并且在行为上没有任何变化。
写一个完整的块是有道理的,因为这就是大多数算法的工作原理。但是,如果它不告诉我输出数据的大小,我该如何防止多余的数据呢?
我应该使用另一种算法吗?AES256是一个要求,但我想知道不同的块类型或填充类型是否允许它写入正确的字节数。
有什么指导吗?
剪短(部分)简洁:
decryptCipher = Cipher.getInstance("AES");
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey);
解密例程的业务部分。
long bytesToRead = inputFile.length();
while ((inLen = in.read(buffer)) > 0) {
int bytesOut = 0;
byte[] cryptBytes = null;
int outLen = cipher.getOutputSize(inLen);
cryptBytes = new byte[outLen];
if (bytesToRead <= buffer.length) {
try {
bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0);
} catch (ShortBufferException e) {
e.printStackTrace();
}
} else
try {
bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0);
} catch (ShortBufferException e) {
e.printStackTrace();
}
out.write(cryptBytes, 0, bytesOut);
bytesToRead -= inLen;
}
try {
out.flush();
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}