代码之家  ›  专栏  ›  技术社区  ›  Ranhiru Jude Cooray

请就C文件加密的性能提出建议

  •  0
  • Ranhiru Jude Cooray  · 技术社区  · 14 年前

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

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

    现在我想在一个文件上尝试这个测试加密过程。但我希望能够读写同一个文件。

    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秒(在WinMo6 Pro仿真器中使用秒表进行测试)。

    我做错什么了?当同时读写同一个文件时,我能做些什么来提高性能?请告知。提前很多时间:)


    通过使用2个FileStream对象指向同一个文件,我大大减少了所用的时间(从24秒减少到6秒) FileShare.ReadWrite 财产。

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

    再次更新

    虽然我使用了一个伪加密算法,但我希望将AES与CBC+CTS结合使用。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Oded    14 年前

    1. 使用更大的缓冲区-为什么只有16字节?

    更新

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

    您不应该使用这样的两个文件组—您可能会编写稍后将要阅读的部分文件。

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

        2
  •  2
  •   Tim Lloyd    14 年前

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

    虽然较大的缓冲区会有所帮助,但请记住,一些缓冲区已经由以下人员处理:

    1. 流类本身。
    2. 操作系统磁盘缓存。
    3. 驱动器缓冲区。

    在while块中重复读取文件长度可能是主要问题。