[英]Pass reg file to regedit without writing it to disk (to avoid writing decrypted data to disk)
[英]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.