加密会破坏BMP文件,但不会损坏jpeg文件

时间:2014-09-07 14:18:47

标签: c# .net file filestream

出于某些奇怪的原因,我的解密代码会切断最后几位:

enter image description here

为什么会这样?我忘记了一些代码,还是我犯了一些天真的错误?

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);
        }
    }
}

2 个答案:

答案 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是否保证该行为。