Я новичок в шифрования и я шифрование файлов, используя следующий метод:Многопоточность шифрования в C#
private static void encryptFile(string filePath, byte[] password, byte[] salt)
{
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(password, salt, 1000);
AesManaged algorithm = new AesManaged();
byte[] rgbKey = rdb.GetBytes(algorithm.KeySize/8);
byte[] rgbIV = rdb.GetBytes(algorithm.BlockSize/8);
GCHandle keyHandle = GCHandle.Alloc(rgbKey, GCHandleType.Pinned);
GCHandle IVHandle = GCHandle.Alloc(rgbIV, GCHandleType.Pinned);
ICryptoTransform cryptoAlgorithm = algorithm.CreateEncryptor(rgbKey, rgbIV);
using (FileStream readStream = File.Open(filePath, FileMode.Open))
{
using (FileStream writeStream = new FileStream(filePath + ".enc", FileMode.Create, FileAccess.Write))
{
using (CryptoStream cryptoStream = new CryptoStream(writeStream, cryptoAlgorithm, CryptoStreamMode.Write))
{
while (readStream.Position < readStream.Length)
{
byte[] buffer = new byte[4096];
int amountRead = readStream.Read(buffer, 0, buffer.Length);
cryptoStream.Write(buffer, 0, amountRead);
}
cryptoStream.Flush();
}
}
}
UtilityMethods.destroyBytes(rgbKey);
UtilityMethods.destroyBytes(rgbIV);
keyHandle.Free();
IVHandle.Free();
}
То, что я хочу сделать, это распараллелить процесс для более быстрого шифрования. Используя один поток, это заняло более 5 минут, чтобы зашифровать файл размером ~ 3 ГБ. Я ищу, чтобы иметь возможность сделать это шифрование менее чем за 1 мин, если это возможно (менее 30 секунд будет фантастическим, но я думаю, что могу растягиваться).
Я считаю, что ответ заключается в создании нескольких потоков (хотя я не уверен), назначая каждому потоку фрагмент файла для шифрования, но я не уверен, как «разбить файл», чтобы назначить кусок для каждого потока или «поместить файл обратно вместе» после того, как каждая часть прошла через поток, которому он был назначен. Может ли кто-нибудь указать мне в правильном направлении?
Большое спасибо!
P.S. Я просмотрел это (Rijndael algorithm and CryptoStream: is it possible to encrypt/decrypt multithreaded?), но я не понимаю ответа (ECB, CBC?). Если ответ на мой вопрос лежит там, вы могли бы предоставить какой-то образец кода, чтобы заставить меня двигаться в правильном направлении?
Еще раз спасибо!
Параллельное/многопоточное шифрование возможно с ECB только потому, что в противном случае один блок зависит друг от друга.О ECB, CBC: см. [Режимы работы шифрования: ECB vs CBC] (https://adayinthelifeof.nl/2010/12/08/encryption-operating-modes-ecb-vs-cbc/) и [Перечисление CipherMode] (https : //msdn.microsoft.com/en-US/library/system.security.cryptography.ciphermode (v = vs.110) .aspx). Обратите внимание также на замечание об ECB: «Важно: этот режим не рекомендуется, поскольку он открывает дверь для нескольких подделок безопасности». –
Это проблема ввода-вывода, а не проблема с ЦП. Попробуйте использовать тот же код со входом и выходом на отдельных физических дисках или с SSD, и вы увидите лучшую производительность. –