其他分享
首页 > 其他分享> > CodeGo.net>在不写入磁盘的情况下,使用StreamReader访问解密的Rijndael加密文件

CodeGo.net>在不写入磁盘的情况下,使用StreamReader访问解密的Rijndael加密文件

作者:互联网

我目前正在对嵌入在.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上浏览了很长时间,以了解执行此操作的方法,而我最近来的是将DeleteReader的内容复制到另一个StreamReader对象中,而不是解密为字符串,但是似乎无法复制其中的内容.一个StreamReader到另一个StreamReader-如果我错了,请纠正我.

我希望尽可能少地更改现有(我在这里没有分享的)代码库,因为这可能会引起错误.我也很乐意在不将文件写回到磁盘的情况下这样做(显然,这是我们对其进行加密的原因).

在此先感谢您,如果我不清楚或不清楚的话,我们深表歉意.如果您需要帮助,我可以添加更多信息.

杰米

解决方法:

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

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

标签:rijndaelmanaged,dll,embedded-resource,c,net
来源: https://codeday.me/bug/20191101/1986552.html