我目前正在研究嵌入在 .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 对象的实例中?
我在 Internet 上进行了很长时间的查看,以寻找执行此操作的方法,而我最接近的方法是将 decryptReader 的内容复制到另一个 StreamReader 对象中,而不是解密为字符串,但似乎您无法复制的内容一个 StreamReader 到另一个 StreamReader - 如果我错了,请纠正我。
我希望尽可能少地更改现有的(我没有在这里分享的)代码库,因为这可能会导致错误出现。我也很乐意在不将文件写回磁盘的情况下执行此操作(显然,我们加密它们是有原因的)。
提前谢谢你,如果我不够清楚或有点模糊,对不起。如果您需要帮助我,我可以添加更多信息。
杰米