В настоящее время я работаю над шифрованием/дешифрованием простых текстовых файлов, встроенных в файл .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 - поправьте меня, если я ошибаюсь.
Я бы хотел изменить как можно меньше существующей (которой я не поделился здесь) кодовой базы, поскольку это может привести к возникновению ошибок. Я также хотел бы сделать это, не записывая файл обратно на диск (очевидно, есть причина, по которой мы их шифруем).
Заранее спасибо, и извините, если я выразился недостаточно ясно или немного расплывчато. Я могу добавить больше информации, если вам это нужно, чтобы помочь мне.
Джейми
IDisposable
(FileStream
,RijndaelManaged
,CryptoStream
иStreamReader
) в блокиusing
и исключите вызовыClose()
. - person Jesse C. Slicer   schedule 11.01.2012