我创建了一个测试(非真实)加密函数,它接受一个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一起使用。
答案 0 :(得分:3)
立即浮现在脑海中:
<强>更新强>
即使使用EAS和16字节约束,您也可以在内存中进行加密(对于大文件,使用大缓冲区而不是加密内存中的整个文件)。
您不应该使用这样的两个文件团队 - 您最终可能会编写稍后将要阅读的文件部分。
关于缓冲区 - 您可以从磁盘读取大块,然后在写回大块加密数据之前一次在内存中操作16个字节。
答案 1 :(得分:2)
不要检查while块中的文件长度(即myfileStream.Length),因为这会导致系统调用以检查每次迭代的文件长度。而是在while循环之前将文件长度放在变量中,而是使用变量。
虽然更大的缓冲区会有所帮助,但请记住,某些缓冲已经由以下方式处理:
在while块中重复读取文件长度可能是主要问题。