加速我的申请

时间:2012-06-14 16:44:20

标签: c# encryption aes

我正在使用高级加密标准算法创建文件加密应用程序,但我发现我的应用程序速度太慢,尤其是在我加密大量数据时, 恩。文件大小80MB,30分钟。已经过去但我的应用程序尚未完成加密我的文件大小为80mb。

我在加密算法中使用ECB(电子代码簿)模式

如何加速我的应用程序加密大量数据?我做了一些研究,我找到了这个,http://en.wikipedia.org/wiki/Speedup,但我不确定这是否是我的问题的答案......或者如果我使用BackgroundWorker它是否有效?顺便说一句,我在开发项目时使用Visual Studio 2008。

这是加密文件的代码..

private void cmdEncrypt_Click(object sender, EventArgs e)
{
        AESECB aes = new AESECB();
        FileInfo fInfo = new FileInfo(txtFileSource.Text);

        if (txtFileSource.Text == "")
        {
            MessageBox.Show("Please Select a File", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            return;
        }

        if (txtSecretKey.Text == "")
        {
            MessageBox.Show("Please Enter the password", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            return;
        }

        if (fInfo.Exists == false)
        {
            MessageBox.Show("File Not Found!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            return;
        }

        byte[] bytePadding = aes.filePadding(txtFileSource.Text);
        byte[] fByte = aes.getFileByte(txtFileSource.Text);
        int farrLength = (bytePadding.Length + fByte.Length);
        byte[] newFbyte = new byte[farrLength];
        byte[] encryptedFByte = new byte[farrLength];
        int counterBytePadding =0;
        byte firstByte = 0;

        for (int i = 0; i < farrLength; i++)
        {
            if (i < fByte.Length)
            {
                newFbyte[i] = fByte[i];
            }
            else
            {
                newFbyte[i] = bytePadding[counterBytePadding];
                counterBytePadding++;
            }
        }

        int plainFileBlock = newFbyte.Length / 16;

        progressBar1.Maximum = plainFileBlock-1;

        progressBar1.Visible = true;

        int counter = 0;
        int counter2 = 0;

        for (int j = 0; j < plainFileBlock; j++)
        {
            byte[] encfbyte = aes.fileEncrypt(txtSecretKey.Text, newFbyte, counter);

            for (int k = 0; k < 16; k++)
            {
                encryptedFByte[counter2] = encfbyte[k];
                counter2++;
            }

            progressBar1.Value = j;
            counter = counter + 16;

        }

        progressBar1.Visible = false;

        int bytesToRead = encryptedFByte.Length;

        string newPath = txtFileSource.Text + ".aesenc";

        using (FileStream newFile = new FileStream(newPath, FileMode.Create, FileAccess.Write))
        {
            newFile.Write(encryptedFByte, 0, bytesToRead);

        }


        MessageBox.Show("Encryption Done!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

2 个答案:

答案 0 :(得分:2)

所有优秀的程序员都会对你的代码充满信心。

这很简单,这样做:

using System.Diagnostics;

var startTime = DateTime.Now;
//some code here
Debug.WriteLine("This took {0}", DateTime.Now.Subtract(startTime));

然后在VS(View-&gt; Output)中查看输出窗口。

通过用这两行包裹方法的不同部分,您将识别出慢速位。

我怀疑是在循环中逐字节复制80MB。在这里试试Array.Resize

答案 1 :(得分:0)

正如韦斯顿所建议的那样,测量你的代码以确定什么是缓慢的。也就是说,它可能是循环的文件加密,这会减慢你的速度。如果是这样,你肯定可以通过使用超过1个CPU来加速这个过程。在C#中查找并行结构:“Parallel.For”。

这是一个简单的例子: http://www.dotnetcurry.com/ShowArticle.aspx?ID=608