Доступ к расшифрованному зашифрованному файлу Rijndael с StreamReader без записи на диск - PullRequest
3 голосов
/ 11 января 2012

В настоящее время я работаю над шифрованием / дешифрованием простых текстовых файлов, которые встроены в DLL-файл.Простые текстовые файлы являются сценариями и анализируются по мере необходимости.

В настоящий момент загружаются файлы сценариев (в виде простого текста):

string RunLocation = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Assembly _assembly = Assembly.LoadFrom(RunLocation + "\\<name of dll>.dll");
s = new StreamReader(_assembly.GetManifestResourceStream(File));
RunScript(s);

Метод RunScript считывает одну строку сценария в строку, а затем анализирует ее.Он просматривает каждую строку по очереди и выполняет каждое из действий, которые мы определяем в скрипте, по мере их обнаружения.

Поскольку файлы dll не шифруются, мы решили зашифровать каждое из них.файлов сценариев, прежде чем они будут встроены в DLL.Мы выбрали алгоритм Rijndael из-за легкости его реализации в C # /. NET.

В настоящее время шифрование выполняется следующим образом:

FileStream fileStreamForEncryption = new FileStream (inputFileToBeEncrypted, FileMode.Create);
RijndaelManaged rijndaelCryptography = new RijndaelManaged();
CryptoStream encryptionStream = new CryptoStream(fileStreamForEncryption, rijndaelCryptography .CreateEncryptor(key, iv), CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
  cs.WriteByte((byte)data);
fsIn.Close();
cs.Close();
fileStreamForEncryption .Close()

Это означает, что дешифрование является вопросомвыполнения нескольких команд и получения расшифрованного файла ... за исключением того, что из-за дизайна остальной части кода (шифрование, по-видимому, было «когда мы установили систему, работающую по заданному стандарту»),Файл должен быть возвращен как объект StreamReader.На данный момент, вот как я расшифровываю запрошенный файл:

string decodedFile = null;
FileStream fileToDecrypt= new FileStream(_assembly.GetManifestResourceStream(File).ToString(), FileMode.Open);
/* I know that the above line is overly complicated, it's because our files are read into StreamReader objects (as I've explained above) */
RijndaelManaged rijndaelCryptography = new RijndaelManaged();
try
{
  CryptoStream cs = new CryptoStream(fileToDecrypt, rijndaelCryptography .CreateDecryptor(key, iv), CryptoStreamMode.Read);
  using (StreamReader decryptReader = new StreamReader(cs))
  {
    decodedFile = decryptReader.ReadToEnd();
  }
catch (Exception e)
{
MessageBox.Show(e.Message);
}

Кто-нибудь знает, как я могу расшифровать файл, используя Rijndael, но сделать вывод доступным как / чтение в экземпляробъект StreamReader?

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

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

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

Джейми

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Вы можете просто преобразовать содержимое вашего декодированного файла в байтовый массив и представить его в виде потока:

var stream = new System.IO.MemoryStream(System.Text.Encoding.Unicode.GetBytes(decodedFile));
var streamReader = new StreamReader(stream);

Кроме того, вы, вероятно, должны избавиться от своего RijndaelManaged экземпляра, поместив его в блок using:

using (RijndaelManaged rijndaelCryptography = new RijndaelManaged())
{
    ...
}

Обновление

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

Stream fileToDecrypt= _assembly.GetManifestResourceStream(File);
...
CryptoStream cs = new CryptoStream(fileToDecrypt, rijndaelCryptography.CreateDecryptor(key, iv), CryptoStreamMode.Read);
2 голосов
/ 11 января 2012

Я долго осматривался в Интернете, чтобы найти способы сделать это, и самым близким, что я получил, было копирование содержимого decryptReader в другой объект StreamReader вместо расшифровки в строку, но кажется, чтоНе копируйте содержимое одного StreamReader в другой StreamReader - исправьте меня, если я ошибаюсь.

Вы только слегка правы.Хотя вы не можете копировать с одного StreamReader на другой, вы можете читать с одного StreamReader и записывать в StreamWriter, например, с поддержкой MemoryStream.Затем вы можете обернуть StreamReader вокруг данных в MemoryStream, которые были записаны StreamWriter.

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

...