Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请就C#文件加密的性能提供建议_C#_Performance_Encryption_Windows Mobile_Filestream - Fatal编程技术网

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

请就C#文件加密的性能提供建议,c#,performance,encryption,windows-mobile,filestream,C#,Performance,Encryption,Windows Mobile,Filestream,我创建了一个测试(非真实)加密函数,它接受一个字节[],并用0xff替换所有字节并返回 private byte[] encrypt(byte[] input) { for (int i = 0; i < input.Length; i++) { input[i] = 0xff; } return input; } 专

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

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


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

            return input;



        }
专用字节[]加密(字节[]输入)
{
for(int i=0;i
现在我想在一个文件上尝试这个测试加密过程。但是我希望能够读写同一个文件

这就是我到目前为止所做的

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

    }
使用(FileStream myfileStream=newfilestream(openFile,FileMode.Open,FileAccess.ReadWrite))
{   
字节[]缓冲区=新字节[16];
while(myfileStream.Position
这很好,但我知道我做得不对。这似乎有非常严重的性能问题,1 MB文件需要24秒。(在WinMo 6 Pro仿真器中使用秒表进行测试)

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


更新:

通过使用2个FileStream对象,使用
FileShare.ReadWrite
属性指向同一文件,我显著减少了所需时间(从24秒减少到6秒)

这样做安全吗?这样行吗

再次更新


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

我马上想到两件事:

  • 使用更大的缓冲区-为什么只有16个字节
  • 不要写入同一文件-加密后可以删除/重命名
  • 更新

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

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


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

    立即想到以下几点:

  • 使用更大的缓冲区-为什么只有16个字节
  • 不要写入同一文件-加密后可以删除/重命名
  • 更新

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

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


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

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

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

  • 流类本身
  • 操作系统磁盘缓存
  • 驱动器缓冲区

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

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

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

  • 流类本身
  • 操作系统磁盘缓存
  • 驱动器缓冲区

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

    首先,您可以大幅度增加缓冲区大小。从硬盘读取和写入大块数据要快得多。指向同一文件的两个文件流应该可以。该文件是在典型的WinCE RAM文件系统中,还是在其他介质(SD卡、网络、ActiveSync等)中?该文件可能在SD卡或其本身的设备中。首先,您可以大幅度增加缓冲区大小。从硬盘读取和写入大块数据要快得多。指向同一文件的两个文件流应该可以。该文件是在典型的WinCE RAM文件系统中,还是在其他介质(SD卡、网络、ActiveSync等)中?该文件可能在SD卡或其本身的设备中:)事实上,一个小的缓冲区意味着要从物理驱动器读取更多的操作系统调用,因此会对性能造成重大影响!我使用了16个字节,因为AES-128一次使用16个字节。如果我读取超过16个字节并在内存中执行AES加密并将其写回会更好吗?@Ranhiru:我可以发誓AES-128的
    系统安全性加密类允许您将
    流作为输入。。。这是显而易见的解决办法。@Noldorin:是的。但由于一些不幸的原因,我无法使用System.Security.Cryptography命名空间。我知道这很糟糕,但是AES算法是我写的。我明白了。我很好奇,内置类有什么问题?事实上,一个小的缓冲区意味着要从物理驱动器读取更多的操作系统调用,因此性能会受到很大的影响!我使用了16个字节,因为AES-128一次使用16个字节。如果我读取超过16个字节,在内存中执行AES加密并将其写回会更好吗?@Ranhiru:我可以发誓
    System.Security.Cryptograph