使用salsa20加密/解密大文件的一部分

时间:2019-02-21 09:58:07

标签: c# file encryption ram

我有大学老师的作业。我必须编写代码来加密/解密大文件的一小部分(大约10GB)。我使用算法Salsa20。 最主要的是不加载RAM。正如他所说,我应该阅读例如100行,然后对其进行加密,解密,写入文件并返回。

我创建列表

id

读取行(因为读取所有字节会加载大量RAM)

List<string> dict = new List<string>();

尝试从

创建一行
using (StreamReader sReader = new StreamReader(filePath))
{
  while (dict.Count < 100)
  {
    dict.Add(sReader.ReadLine());
  }
}

加密此行

string words = string.Join("", dict.ToArray());

然后我需要写100行加密字符串,但是我不知道该怎么做!有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

好的,这就是您可以做的。

接受文件名,起始行号和结束行号。

读取行,如果它们小于起始行号或大于结束行号,只需将它们写入另一个文件中。

一旦您读到范围内的一行,就可以使用密钥和IV对其进行加密。您可能需要将其编码为字节数组,例如首先使用UTF-8,因为诸如Salsa之类的现代密码是按字节而不是文本操作的。

如果您不希望更改行数,则可以将行号用作流密码的随机数/ IV。否则,您可以为密文加上一个固定大小的随机随机数。

密文-可能包括随机数-可以被编码为base64而没有行尾。然后,将base 64行写入另一个文件。

继续加密行,直到找到结束索引。结束线是包含性还是排他性取决于您自己。

现在读取剩余的行,并将它们写入另一个文件。

别忘了完成加密并关闭文件。您可能要破坏源输入文件。


加密字节可能会更容易,因为您可以写入原始文件。但是,与明文相比,编写加密的字符串可能总是会扩展密文。因此,您需要复制文件,因为它需要从中间扩展。


我不知道为什么要在内存中保存列表或词典。如果这是要求的一部分,那么我在其余的问题中看不到它。如果您以这种方式读入文件的所有行,那么显然您正在消耗内存。

当然,如果您的4 GiB文件只是一行,那么您仍在使用过多的内存。在这种情况下,您需要流式传输一切,从文件中解析文本,将其放入字符缓冲区,对字符进行字符解码,对其进行加密,再次将其编码为base 64并将其写入文件。当然可以,但是如果您从未做过这些事情,那就棘手了。