2

我的问题是,如何使用 RC4 加密算法在 C# 中加密和解密文件?

这不是这些问题的重复:

但是我承认,乍一看,这个问题看起来像是这个问题的重复,但是,它大约有 7 个月大了,并且仍然没有直接解决问题的工作代码的答案。

但是,我参考了以下链接,但它们都没有完全或实际上根本没有回答这个问题。

我确实知道 Visual Studio 2013 中的内置 System.Security.Cryptography 库支持 RC2,但我现在要关注的是 RC4,作为研究的一部分。我知道它很弱,是的,但我仍在使用它。没有重要数据将使用此加密。

最好有一个代码示例,它接受一个流作为输入。我造成了很大的混乱,因为我没有正确描述我的担忧。我选择流输入,因为担心任何其他类型的输入都可能导致处理大文件的速度下降。

规格:NET Framework 4.5、C#、WinForms。

4

1 回答 1

1

免责声明:虽然此代码有效,但它可能无法正确实施和/或安全。

这是使用BouncyCastle的 RC4Engine进行文件加密/解密的示例:

// 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);
    }
}

使用此网站对生成的文件进行了测试,它似乎按预期工作。

于 2015-08-01T21:06:03.020 回答