Шифрование файлов с использованием алгоритма шифрования RC4 в C#

У меня вопрос, как мне зашифровать и расшифровать файл в C#, используя алгоритм шифрования RC4?

Это не дубликат этих вопросов:

Однако я признаю, что на первый взгляд этот вопрос будет выглядеть как дубликат этого вопроса, однако ему около 7 месяцев, и до сих пор нет ответа с рабочим кодом, который решает вопрос напрямую.

Я, однако, ссылался на приведенные ниже ссылки, но ни одна из них не отвечает на вопрос полностью или вообще не отвечает.

Я знаю, что встроенная библиотека 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);
    }
}

Полученный файл был протестирован с использованием этого веб-сайта, и, похоже, он работает как положено.

Другие вопросы по тегам