gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:40:52 24 4
gpt4 key购买 nike

我目前正在研究嵌入在 .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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com