请就C#文件加密的性能提供建议
我创建了一个测试(非真实)加密函数,它接受一个字节[],并用0xff替换所有字节并返回请就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; } 专
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个字节。立即想到以下几点:
关于缓冲区-您可以从磁盘读取大块数据,然后在写回大块加密数据之前在内存中一次操作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