出于某些奇怪的原因,我的解密代码会切断最后几位:
为什么会这样?我忘记了一些代码,还是我犯了一些天真的错误?
private static int chunkSize = 1048576;
public void Decrypt(string Input, string passPhrase, string sender)
{
for (long i = 0; i < fsInput.Length; i += chunkSize)
{
byte[] chunkData = new byte[chunkSize];
int bytesRead = 0;
while ((bytesRead = fsInput.Read(chunkData, 0, chunkSize)) > 0)
{
cryptoStream.Write(chunkData, 0, bytesRead);
}
}
}
答案 0 :(得分:2)
我在解密方法
中缺少cryptoStream.FlushFinalBlock();
答案 1 :(得分:0)
你的问题在这里:
if (bytesRead != chunkSize)
{
for (int x = bytesRead - 1; x < chunkSize; x++)
{
chunkData[x] = 0;
}
}
假设您已读取5个字节,即索引0到4,然后是x=5-1=4
,因此您读取的最后一个字节将被零字节覆盖。
此外,您不会写出完整的最后一个块,只会写出第一个bytesRead
个字节:
cryptoStream.Write(chunkData, 0, bytesRead);
你的有点混乱的读取功能确保甚至不会部分读取最后一个块,因此掩盖了错误。要修复代码,请每次写出完整的块。还扔掉了文件读取逻辑。你有两个不能混合在一起的循环,内部完全足够。此外,如果fsInput.Read
读取的内容少于请求的字节,即使您还没有在文件的末尾,所有内容都会崩溃(在静默删除数据的意义上)。您应该检查API是否保证该行为。