c# - 使用 StreamReader 访问解密的 Rijndael 加密文件而不写入磁盘

标签 c# .net dll embedded-resource rijndaelmanaged

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

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

提前谢谢你,如果我不够清楚或有点含糊,我深表歉意。如果您需要帮助我,我可以添加更多信息。

杰米

最佳答案

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

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

此外,您可能应该通过将 RijndaelManaged 实例放在 using block 中来处理它:

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

更新

你可以像这样得到加密文件,CryptoStream 的构造函数仍然会很高兴:

Stream fileToDecrypt= _assembly.GetManifestResourceStream(File);
...
CryptoStream cs = new CryptoStream(fileToDecrypt, rijndaelCryptography.CreateDecryptor(key, iv), CryptoStreamMode.Read);

关于c# - 使用 StreamReader 访问解密的 Rijndael 加密文件而不写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8822239/

相关文章:

c# - 尝试写入 C# 的现有 XML 文件

.net - 如何在运行的 "Internet Explorer_Server"实例中控制光学变焦?

c - 尝试在 Visual Studio 中制作 Java Native Access 将接受的 "Hello Word"dll

c++ - 以编程方式自定义 DLL 搜索目录

c# - P/在 C# 中从 C++ dll 调用 DLL 函数

c# - 如何删除正则表达式中的特定 url 参数?

c# - 如何将字符串格式化为日期时间?

c# - 添加绑定(bind)到IIS而不回收应用程序

c# - 使用 Debug模式而不是 Release模式将应用程序部署到生产环境?

c# - Dispose,什么时候调用?