c#encryption / progress bar - 提高加密速度

时间:2014-07-24 16:58:50

标签: c# encryption

所以我创建了一个加密和解密GUI,允许我将文件加密或解密为新文件。在我的GUI中,我有一个进度条,告诉我在该过程结束前多久。当我加密一个相对较小的文件时,它会相对快速地加密它。但是,当我尝试加密100 MB文件时,速度非常慢!我认为问题出在我的encryptBG_DoWork方法中,我有for循环;我认为这是我编码的方式。问题是,我可以更快地运行该过程,还是这是运行进度条和加密方法的正确方法?

private void btnEncrypt_Click(object sender, EventArgs e)
    {
        statusLabel1.Text = "Encrypting...";
        encryptBG.RunWorkerAsync();
    }

private void encryptBG_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i=0; i<=100; i++)
        {
            encryptBG.ReportProgress(i);
            if (Rijndael.Checked == true)
            {
                ed.EncryptFile(filePath.Text, Destination.Text, "1");
            }
            else if (TripleDES.Checked == true)
            {
                ed.EncryptFile(filePath.Text, Destination.Text, "2");
            }              
        }
    }

private void encryptBG_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
        statusLabel2.Text = "(" + e.ProgressPercentage.ToString() + "%)";
    }

private void encryptBG_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar.Value = 0;
        statusLabel2.Text = "";
        statusLabel1.Text = "Encryption Completed!";
    }

我的加密和解密方法在这里的另一个项目中。

public void EncryptFile(string sInputFile, string sOutputFile, string alg)
    {
        try
        {
            PasswordDeriveBytes pdb = new PasswordDeriveBytes(skey, IV);
            FileStream fsCrypt = new FileStream(sOutputFile, FileMode.Create);
            FileStream fsIn = new FileStream(sInputFile, FileMode.Open);
            int data;

            if (alg == "1")
            {
                RijndaelManaged rdProvider = new RijndaelManaged();
                CryptoStream cs1 = new CryptoStream(fsCrypt,
                                                    rdProvider.CreateEncryptor(pdb.GetBytes(32), pdb.GetBytes(16)),
                                                    CryptoStreamMode.Write);
                while ((data = fsIn.ReadByte()) != -1)
                    cs1.WriteByte((byte)data);
                cs1.Close();
            }
            else if (alg == "2")
            {
                TripleDESCryptoServiceProvider tdProvider = new TripleDESCryptoServiceProvider();
                CryptoStream cs2 = new CryptoStream(fsCrypt,
                                                    tdProvider.CreateEncryptor(pdb.GetBytes(24), pdb.GetBytes(8)),
                                                    CryptoStreamMode.Write);
                while ((data = fsIn.ReadByte()) != -1)
                    cs2.WriteByte((byte)data);
                cs2.Close();
            }

            fsIn.Close();
            fsCrypt.Close();

        }
        catch
        {
        }
    }

1 个答案:

答案 0 :(得分:1)

  

问题是,我可以更快地运行流程,还是这样   正确的方法来运行进度条和我的加密方法?

您对BackgroundWorker.ReportProgress()和ProgressBar的使用对于您正在进行的操作是正确的,即对同一文件进行100次加密并报告每次迭代的进度。

如果您的目标是仅使用加密文件并使用进度条报告进度,则需要更精细的算法来加密文件。例如,将文件吐出到固定大小的块中。使用循环加密每个块并将进度报告为TotalBlocksEncrypted/TotalBlocks