3

私は現在、.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メソッドは、スクリプトの1行を文字列に読み取り、それを解析します。各行を順番に調べ、見つかったときにスクリプトで定義した各アクションを実行します。

とにかくアウトdllファイルは暗号化されていないため、dllに埋め込む前に各スクリプトファイルを暗号化する必要があると判断しました。C#/。NETでの実装が容易なため、Rijndaelアルゴリズムを決定しました。

現在、暗号化は次のように実行されます。

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オブジェクトのインスタンスに/として出力にアクセスできますか?

私はこれを行う方法をインターネットで長い間調べてきましたが、最も近いのは、文字列に復号化するのではなく、decryptReaderの内容を別のStreamReaderオブジェクトにコピーすることでしたが、あるStreamReaderから別のStreamReaderへ-間違っている場合は修正してください。

バグが発生する可能性があるため、既存の(ここでは共有していない)コードベースをできるだけ変更する必要があります。また、ファイルをディスクに書き戻さずにこれを実行したいと思います(明らかに、暗号化する理由があります)。

よろしくお願いします。はっきりしていなかったり、少し漠然としていたらごめんなさい。あなたが私を助けるためにそれを必要とするならば、私はより多くの情報を加えることができます。

ジェイミー

4

2 に答える 2

2

私はこれを行う方法をインターネットで長い間調べてきましたが、最も近いのは、文字列に復号化するのではなく、decryptReaderの内容を別のStreamReaderオブジェクトにコピーすることでしたが、あるStreamReaderから別のStreamReaderへ-間違っている場合は修正してください。

あなたはほんの少しだけ正しいです。あるものから別のものにコピーすることはできませんが、あるものからStreamReader読み取り、たとえば、に裏打ちされStreamReaderたものに書き込むことはできます。次に、によって書き込まれたデータをラップアラウンドできます。StreamWriterMemoryStreamStreamReaderMemoryStreamStreamWriter

ですから、あなたがやりたいことはかなり可能です。実際、セットアップで私が目にする最大の問題は、復号化キーの処理です。

于 2012-01-11T15:56:19.133 に答える
2

デコードされたファイルの内容をバイト配列に変換し、これをストリームとして公開するだけです。

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);
于 2012-01-11T15:58:27.227 に答える