请告知C#文件加密的性能

时间:2010-07-08 07:37:25

标签: c# performance encryption windows-mobile filestream

我创建了一个测试(非真实)加密函数,它接受一个byte []并用0xff替换所有字节并返回

private byte[] encrypt(byte[] input)
        {


            for (int i = 0; i < input.Length; i++)
            {
                input[i] = 0xff;
            }

            return input;



        }

现在我想在文件上尝试这个测试加密程序。但我希望能够读取和写入SAME文件。

这是我到目前为止所做的事情

using (FileStream myfileStream = new FileStream(openFile, FileMode.Open,FileAccess.ReadWrite))

    {   

    byte[] buffer = new byte[16]; 



        while (myfileStream.Position < myfileStream.Length)
        {

          myfileStream.Read(buffer, 0, 16);

          buffer = encrypt(buffer);

          myfileStream.Position -= 16;

          myfileStream.Write(buffer, 0, 16);

         }

         myfileStream.Close();            

    }

这很好但我知道我做得不对。这似乎有非常严重的性能问题,1 MB文件需要24秒。 (在WinMo 6 Pro仿真器中使用StopWatch进行测试)。

我在这里做错了什么?在同时读取和写入同一文件时,我该怎么做才能提高性能?请指教。 Thanx提前很多:))


更新:

通过使用指向具有FileShare.ReadWrite属性的同一文件的2个FileStream对象,我将显着花费的时间(从24秒减少到6秒)缩短了。

这样做安全吗?这可以吗?

再次更新

虽然我使用了假加密算法,但我希望将AES与CBC + CTS一起使用。

2 个答案:

答案 0 :(得分:3)

立即浮现在脑海中:

  1. 使用更大的缓冲区 - 为什么只有16个字节?
  2. 不要写入同一个文件 - 您可以在加密后删除/重命名。
  3. <强>更新

    即使使用EAS和16字节约束,您也可以在内存中进行加密(对于大文件,使用大缓冲区而不是加密内存中的整个文件)。

    您不应该使用这样的两个文件团队 - 您最终可能会编写稍后将要阅读的文件部分。

    关于缓冲区 - 您可以从磁盘读取大块,然后在写回大块加密数据之前一次在内存中操作16个字节。

答案 1 :(得分:2)

不要检查while块中的文件长度(即myfileStream.Length),因为这会导致系统调用以检查每次迭代的文件长度。而是在while循环之前将文件长度放在变量中,而是使用变量。

虽然更大的缓冲区会有所帮助,但请记住,某些缓冲已经由以下方式处理:

  1. 流类本身。
  2. 操作系统磁盘缓存。
  3. 驱动器缓冲区。
  4. 在while块中重复读取文件长度可能是主要问题。