Зашифровать \ расшифровать часть большого файла с помощью salsa20 - PullRequest
0 голосов
/ 21 февраля 2019

У меня домашнее задание от преподавателя университета.Я должен написать код, который будет шифровать \ дешифровать небольшую часть большого файла (около 10 ГБ).Я использую алгоритм Salsa20.Главное не загружать оперативку.По его словам, я должен прочитать, например, 100 строк, затем зашифровать \ расшифровать его, записать в файл и обратно.

Я создаю список

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());

Зашифруйте эту строку

string encrypted;
using (var salsa = new Salsa20.Salsa20())
using (var mstream_out = new MemoryStream())
{
  salsa.Key = key;
  salsa.IV = iv;
  using (var cstream = new CryptoStream(mstream_out, 
  salsa.CreateEncryptor(), CryptoStreamMode.Write))
  {
    var bytes = Encoding.UTF8.GetBytes(words);
    cstream.Write(bytes, 0, bytes.Length);
  }
  encrypted = Encoding.UTF8.GetString(mstream_out.ToArray());
}

Затем мне нужно написать 100 строкзашифрованная строка, но я не знаю, как это сделать!Есть какое-нибудь решение?

1 Ответ

0 голосов
/ 22 февраля 2019

ОК, вот что вы можете сделать.

Примите имя файла, номер начальной строки и номер конечной строки.

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

Как только вы прочитаете строку, находящуюся в диапазоне, вы можете зашифровать ее ключом и IV.Возможно, вам потребуется закодировать его в байтовый массив, например, сначала с использованием UTF-8, поскольку современные шифры, такие как Salsa, работают с байтами, а не с текстом.

Вы можете использовать номер строки, возможно, в качестве nonce / IV для вашегопотоковый шифр, если вы не ожидаете изменения количества строк.В противном случае вы можете добавить к зашифрованному тексту большой фиксированный размер случайного одноразового номера.

Зашифрованный текст - возможно, включая одноразовый номер - может быть закодирован как base64 без окончания строки.Затем вы записываете строку base 64 в другой файл.

Продолжайте шифровать строки, пока не найдете конечный индекс.Вам решать, будет ли ваша конечная строка включительной или исключительной.

Теперь прочитайте оставшиеся строки и запишите их в другой файл.

Не забудьте завершить шифрование и закрытьфайл.Возможно, вы захотите уничтожить исходный входной файл.


Шифрование байтов может быть проще, поскольку вы можете записать в исходный файл.Однако написание зашифрованных строк, вероятно, всегда расширит зашифрованный текст по сравнению с открытым текстом.Поэтому вам нужно скопировать файл, так как он должен расти из середины.


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

Конечно, если ваш файл 4 ГиБ - это всего лишь одна строка, вы все равно используете слишком много памяти,В этом случае вам нужно выполнить потоковую передачу всего , анализировать текст из файлов, помещать его в символьный буфер, декодировать его, шифровать, снова кодировать в base 64 и записывать в файл.Конечно, выполнимо, но сложно, если вы никогда не делали таких вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...