Шифрование файлов с использованием алгоритма шифрования RC4 в C#
У меня вопрос, как мне зашифровать и расшифровать файл в C#, используя алгоритм шифрования RC4?
Это не дубликат этих вопросов:
Однако я признаю, что на первый взгляд этот вопрос будет выглядеть как дубликат этого вопроса, однако ему около 7 месяцев, и до сих пор нет ответа с рабочим кодом, который решает вопрос напрямую.
Я, однако, ссылался на приведенные ниже ссылки, но ни одна из них не отвечает на вопрос полностью или вообще не отвечает.
http://www.codeproject.com/Articles/5719/Simple-encrypting-and-decrypting-data-in-C
http://www.codeproject.com/Articles/5068/RC-Encryption-Algorithm-C-Version
Я знаю, что встроенная библиотека System.Security.Cryptography в Visual Studio 2013 поддерживает RC2, но сейчас я хочу сосредоточиться на RC4, как часть исследования. Я знаю, что это слабый да, но я все еще использую это. Важные данные не будут использовать это шифрование.
Предпочтительно с примером кода, который принимает поток в качестве входных данных. Я вызвал большое замешательство, поскольку я не описал свои проблемы должным образом. Я выбираю потоковый ввод из-за опасений, что любой другой тип ввода может привести к снижению скорости обработки больших файлов.
Технические характеристики: NET Framework 4.5, C#, WinForms.
1 ответ
Отказ от ответственности: хотя этот код работает, он может быть неправильно реализован и / или безопасен.
Вот пример шифрования / дешифрования файлов с использованием RC4Engine BouncyCastle:
// You encryption/decryption key as a bytes array
var key = Encoding.UTF8.GetBytes("secretpassword");
var cipher = new RC4Engine();
var keyParam = new KeyParameter(key);
// for decrypting the file just switch the first param here to false
cipher.Init(true, keyParam);
using (var inputFile = new FileStream(@"C:\path\to\your\input.file", FileMode.Open, FileAccess.Read))
using (var outputFile = new FileStream(@"C:\path\to\your\output.file", FileMode.OpenOrCreate, FileAccess.Write))
{
// processing the file 4KB at a time.
byte[] buffer = new byte[1024 * 4];
long totalBytesRead = 0;
long totalBytesToRead = inputFile.Length;
while (totalBytesToRead > 0)
{
// make sure that your method is marked as async
int read = await inputFile.ReadAsync(buffer, 0, buffer.Length);
// break the loop if we didn't read anything (EOF)
if (read == 0)
{
break;
}
totalBytesRead += read;
totalBytesToRead -= read;
byte[] outBuffer = new byte[1024 * 4];
cipher.ProcessBytes(buffer, 0, read, outBuffer,0);
await outputFile.WriteAsync(outBuffer,0,read);
}
}
Полученный файл был протестирован с использованием этого веб-сайта, и, похоже, он работает как положено.