【问题标题】:Encrypting files using RC4 encryption algorithm in C#在 C# 中使用 RC4 加密算法加密文件
【发布时间】:2015-08-01 19:51:15
【问题描述】:

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

这不是这些问题的重复:

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

然而,我参考了以下链接,但它们都没有完全回答这个问题,甚至根本没有回答。

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

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

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

【问题讨论】:

  • 似乎第一个(最后两个中的)链接发布了用于加密字节数组的代码。问题是如何使用 或如何适应 它来处理文件?难道你不能将整个文件加载到一个字节数组中,用 RC4 加密(使用该链接中的代码),然后将其写入一个新文件吗?或者该代码不起作用?
  • 我认为将文件更改为字节数组可能比仅使用流更有风险,因此我宁愿不冒这种风险。
  • 为什么?会涉及什么样的风险?还有,这里的问题是什么?
  • 那不就是把整个文件流读入一个字节数组,从那个链接调用代码,然后……把它写到另一个流什么的吗?
  • 我赞成,因为您显然已经对此进行了大量研究。但是,我的反馈是:尽可能保持问题简洁。最好不要就人们应该(或不应该)如何投票提出要求——在最坏的情况下,具有这种详细程度的问题可能会遭到一两次反对票,但这并不重要——它们只是独角兽点!此外,在帖子中故意重复信息没有任何价值 - 如果有人不清楚某些内容,他们可以再次阅读。

标签: c# .net winforms encryption rc4-cipher


【解决方案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);
    }
}

使用this website 测试生成的文件,它似乎按预期工作。

【讨论】:

  • 只是为了检查,有没有办法让读写不异步?或者至少有办法让另一个方法/计时器知道它何时完成,从而提醒用户?
  • 是的,有一种方法,但它们会阻塞操作,如果处理不当,这会很糟糕,尤其是当您在 UI 线程上执行此操作时(您的 UI 将停止响应)。要使它们非异步,只需删除 await 关键字,将 ReadAsyncWriteAsync 分别更改为 ReadWrite
  • 哦,所以有风险......所以我假设如果假设我也想使用库来加密文本,你的代码也可以这样做,只是我必须删除行8到31,35到36行,在"byte[] outBuffer = new byte[1024 * 4]"前面加几行,把字符串转成字节?
  • 不知何故,我调整您的代码以也能够加密文本字符串的方式似乎不太正确(您提供的加密文件的代码很好,谢谢:))。 (codeshare.io/hOmuF) 是不是数据返回方式的原因?
  • 哦...所以它不应该像rc4.online-domain-tools.com 加密文本那样远程显示?再次感谢,你帮了我很多:)
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2020-12-14
相关资源
最近更新 更多