3

我目前正在研究嵌入在 .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 - 如果我错了,请纠正我。

我希望尽可能少地更改现有的(我没有在这里分享的)代码库,因为这可能会导致错误出现。我也很乐意在不将文件写回磁盘的情况下执行此操作(显然,我们加密它们是有原因的)。

提前谢谢你,如果我不够清楚或有点模糊,对不起。如果您需要帮助我,我可以添加更多信息。

杰米

4

2 回答 2

2

我在 Internet 上进行了很长时间的查看,以寻找执行此操作的方法,而我最接近的方法是将 decryptReader 的内容复制到另一个 StreamReader 对象中,而不是解密为字符串,但似乎您无法复制的内容一个 StreamReader 到另一个 StreamReader - 如果我错了,请纠正我。

你只是稍微正确。虽然您不能从一个复制StreamReader到另一个,但您可以从一个读取StreamReader并写入一个StreamWriterMemoryStream. 然后,您可以将a 写入StreamReader的数据包装在.MemoryStreamStreamWriter

所以你想做的事情是很有可能的。事实上,我看到你的设置最大的问题是处理解密密钥。

于 2012-01-11T15:56:19.133 回答
2

您可以简单地将解码的文件内容转换为字节数组并将其公开为流:

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);
于 2012-01-11T15:58:27.227 回答