Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用StreamReader访问解密的Rijndael加密文件而不写入磁盘_C#_.net_Dll_Embedded Resource_Rijndaelmanaged - Fatal编程技术网

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

C# 使用StreamReader访问解密的Rijndael加密文件而不写入磁盘,c#,.net,dll,embedded-resource,rijndaelmanaged,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文件中的纯文本文件进行加密/解密。纯文本文件是脚本,在需要时进行解析

此时,以下是加载(纯文本)脚本文件的方式:

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);
这意味着解密是一个运行几个命令并获得解密文件的问题。。。除此之外,由于代码其余部分的设计(加密似乎是“一旦我们让系统按照给定的标准运行”),文件需要作为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-如果我错了,请纠正我

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

先谢谢你,如果我说得不够清楚或有点含糊,我很抱歉。如果您需要帮助,我可以添加更多信息

杰米

我已经在互联网上花了很长时间寻找实现这一点的方法,最近的一次尝试是将decryptReader的内容复制到另一个StreamReader对象中,而不是将其解密为字符串,但似乎无法将一个StreamReader的内容复制到另一个StreamReader-如果我错了,请纠正我

你只是稍微对了一点。虽然您不能从一个
StreamReader
复制到另一个
StreamReader
中,但您可以从一个
StreamReader
中读取数据,然后写入一个
StreamWriter
,例如,由
MemoryStream
支持。然后,您可以将
StreamReader
环绕
StreamWriter
写入的
MemoryStream
中的数据


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

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

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);

使用块将所有
IDisposable
对象(
FileStream
RijndaelManaged
CryptoStream
StreamReader
)包装在
中,并丢失对
Close()
的调用。仅供参考,为了解密数据,您必须存储密钥,该密钥可以轻松捕获。此外,为了使用该脚本,必须对其进行解密,这也很容易被捕获。如果您的应用程序正在另一台计算机上运行,则您将无法再控制您的应用程序。像“Process Explorer”这样简单的东西可以绕过您的“drm”。@Bengie是的,我知道。我们认为,任何人如果真的非常想知道脚本文件中有什么内容,他们手头的时间可能太多了。考虑到随软件发布的用户指南将有一个脚本构建部分(最终用户将能够加载他们自己的未加密脚本)。@JesseC.Slicer谢谢提醒我。在代码正确运行后,我将对每个IDisPobles使用块进行包装。现在我们已经将解密后的脚本读入StreamReader,我发现读取脚本文件时出错。我们已经设法弄清楚,使用FileStream会导致代码显式地查找与dll位于同一目录中的文件,而不是嵌入dll中的文件。问题是CryptoStream需要一个文件流来加密数据。你知道解决这个问题的方法吗?@JamieTaylor CryptoStream构造函数只需要一个Stream实例-你可以使用Assembly.GetManifestResourceStream(resourceName)来获取嵌入的资源(你的文件)。另一个编写此代码的人说:“What.a.Dude!”这是他说的谢谢,你帮了大忙。谢谢你,先生。
Stream fileToDecrypt= _assembly.GetManifestResourceStream(File);
...
CryptoStream cs = new CryptoStream(fileToDecrypt, rijndaelCryptography.CreateDecryptor(key, iv), CryptoStreamMode.Read);