Итак, я создал метод для шифрования файла. Однако большие файлы занимают довольно много времени, и я знаю, что время можно значительно сократить, если использовать больше потоков. У меня очень мало опыта по многопоточности. Я использую 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);
}
}