Многопоточность с AES-256 в C # - PullRequest
2 голосов
/ 14 октября 2019

Итак, я создал метод для шифрования файла. Однако большие файлы занимают довольно много времени, и я знаю, что время можно значительно сократить, если использовать больше потоков. У меня очень мало опыта по многопоточности. Я использую AESManaged и .NET 4.7.2 с приложением Windows Forms. Любая помощь будет принята с благодарностью, спасибо.

РЕДАКТИРОВАТЬ: я забыл добавить метод, я прошу прощения.

private void AES_Encrypt(string inputFile, string password)
{
    try
    {
        byte[] salt = GenerateRandomSalt();

        if (!deleteAfter.Checked)
        {
            FileStream fsCrypt = new FileStream(inputFile + ".encrypted", FileMode.Create);

            byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);

            AesManaged AES = new AesManaged();
            AES.KeySize = 256;
            AES.BlockSize = 128;


            var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);



            fsCrypt.Write(salt, 0, salt.Length);

            CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write);

            FileStream fsIn = new FileStream(inputFile, FileMode.Open);

            byte[] buffer = new byte[1048576];
            int read;
            long bufferLength = 0;
            long fileLength = new FileInfo(inputFile).Length;
            float bufferFloat = 0;
            float fileFloat = 0;
            float finalFloat = 0;

            try
            {
                while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                {
                    Application.DoEvents();
                    cs.Write(buffer, 0, read);
                    bufferLength += read;
                    bufferFloat = (float)bufferLength;
                    fileFloat = (float)fileLength;
                    finalFloat = (bufferFloat / fileFloat) * 100;
                    int finalInt = (int)finalFloat;
                    percentage.Value = finalInt;
                    percentageText.Text = finalFloat.ToString() + "%";
                    double kBytes = (double)bufferLength / 1000;
                    double mBytes = (double)bufferLength / 1000000;
                    double gBytes = (double)bufferLength / 1000000000;
                    bytesProcessed.Text = bufferLength.ToString() + " bytes, or " + kBytes.ToString() + " kilobytes, or " + mBytes.ToString() + " megabytyes, or " + gBytes.ToString() + " gigabytes.";
                }

                fsIn.Close();

            }
            catch (Exception ex)
            {
                output.Items.Add("Error: " + ex.Message);
            }
            finally
            {
                cs.Close();
                fsCrypt.Close();
                output.Items.Add("Successfully encrypted file: " + inputFile);
                percentage.Value = 0;
                percentageText.Text = "";
                bytesProcessed.Text = "";
            }
        }
        else
        {
            FileStream fsCrypt = new FileStream(inputFile + ".encrypted", FileMode.Create);

            byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);

            AesManaged AES = new AesManaged();
            AES.KeySize = 256;
            AES.BlockSize = 128;


            var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);



            fsCrypt.Write(salt, 0, salt.Length);

            CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write);

            FileStream fsIn = new FileStream(inputFile, FileMode.Open);

            byte[] buffer = new byte[1048576];
            int read;
            long bufferLength = 0;
            long fileLength = new FileInfo(inputFile).Length;
            float bufferFloat = 0;
            float fileFloat = 0;
            float finalFloat = 0;

            try
            {
                while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                {
                    Application.DoEvents();
                    cs.Write(buffer, 0, read);
                    bufferLength += read;
                    bufferFloat = (float)bufferLength;
                    fileFloat = (float)fileLength;
                    finalFloat = (bufferFloat / fileFloat) * 100;
                    int finalInt = (int)finalFloat;
                    percentage.Value = finalInt;
                    percentageText.Text = finalFloat.ToString() + "%";
                    double kBytes = (double)bufferLength / 1000;
                    double mBytes = (double)bufferLength / 1000000;
                    double gBytes = (double)bufferLength / 1000000000;
                    bytesProcessed.Text = bufferLength.ToString() + " bytes, or " + kBytes.ToString() + " kilobytes, or " + mBytes.ToString() + " megabytyes, or " + gBytes.ToString() + " gigabytes.";
                }

                fsIn.Close();

            }
            catch (Exception ex)
            {
                output.Items.Add("Error: " + ex.Message);
            }
            finally
            {
                cs.Close();
                fsCrypt.Close();
                File.Delete(inputFile);
                output.Items.Add("Successfully encrypted file: " + inputFile);
                percentage.Value = 0;
                percentageText.Text = "";
                bytesProcessed.Text = "";
            }
        }

    }
    catch (Exception e)
    {
        output.Items.Add(e.Message);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...