簡體   English   中英

使用StreamReader訪問解密的Rijndael加密文件而無需寫入磁盤

[英]Accessing a decrypted Rijndael encrypted file with a StreamReader without writing to disk

我目前正致力於加密/解密嵌入在.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方法將腳本的一行讀入字符串,然后解析它。 它依次查看每一行,並在找到腳本時執行我們在腳本中定義的每個操作。

由於out 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解密文件,但是可以將輸出作為/ read讀入StreamReader對象的實例?

我已經對互聯網進行了長時間的研究以了解如何做到這一點,我最接近的是將decryptReader的內容復制到另一個StreamReader對象而不是解密為字符串,但似乎你無法復制內容一個StreamReader到另一個StreamReader - 如果我錯了,請糾正我。

我希望盡可能少地改變現有的(我在這里沒有分享的)代碼庫,因為這可能會導致錯誤。 我也喜歡這樣做而不將文件寫回磁盤(顯然我們加密它們是有原因的)。

提前謝謝你,如果我不夠清楚或有點含糊,請對不起。 如果您需要它,我可以添加更多信息。

傑米

我已經對互聯網進行了長時間的研究以了解如何做到這一點,我最接近的是將decryptReader的內容復制到另一個StreamReader對象而不是解密為字符串,但似乎你無法復制內容一個StreamReader到另一個StreamReader - 如果我錯了,請糾正我。

你只是略微正確。 雖然您無法從一個StreamReader復制到另一個StreamReader ,但您可以從一個StreamReader讀取並寫入由MemoryStream支持的StreamWriter 然后,您可以將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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM