-2

Advanced Encryption Standard Algorithm を使用してファイル暗号化アプリケーションを作成していますが、特に大量のデータを暗号化するときにアプリケーションが非常に遅いことがわかりました。80MBのファイルサイズ、30分。すでに過去のものでしたが、私のアプリケーションはまだ 80 MB のサイズのファイルの暗号化を完了していません。

暗号化アルゴリズムで 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);

    }
4

2 に答える 2

2

「自分のコードに自信を持っている」ことはすべて非常にうまくいっていますが、すべての優れたプログラマーは測定しています。

これは簡単です。次のようにします。

using System.Diagnostics;

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

次に、VS の出力ウィンドウを見てください (View->Output)。

メソッドのさまざまな部分をこれら 2 行でラップすることにより、遅いビットを特定できます。

私の疑いは、80MB バイトごとにコピーするループ上にあります。ここで試してみてArray.Resizeください。

于 2012-06-14T17:18:40.047 に答える
0

ウェストンが提案したように、何が遅いのかを特定するためにコードを測定してください。とは言っても、速度を落としているのはおそらくループのファイル暗号化です。もしそうなら、1 つ以上の CPU を使用することでプロセスを確実に高速化できます。C# で並列構造を調べます: "Parallel.For"。

簡単な例を次に示します: http://www.dotnetcurry.com/ShowArticle.aspx?ID=608

于 2012-06-15T10:23:03.227 に答える