現在、.dllファイルに埋め込まれているプレーンテキストファイルの暗号化/復号化に取り組んでいます。プレーンテキストファイルはスクリプトであり、必要なときに解析されています。分でディスクに書き込まずにStreamReaderで復号化されたRijndael暗号化ファイルにアクセスする
が、これは(プレーンテキスト)スクリプトファイルがロードされているかである。
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);
}
は、誰もが、私はラインダールを使用してファイルを、復号化することができる方法を知っていますが、StreamReaderをのインスタンスに読み込まとしてアクセス出力を/持っている:分で、これは私が要求されたファイルを復号化しています方法ですオブジェクト?
私はこれを行うための方法についてインターネットを見渡してきました。最も近いのは、decryptReaderの内容を文字列に復号化するのではなく別のStreamReaderオブジェクトにコピーすることでしたが、あるStreamReaderの内容を別のStreamReaderにコピーする - 私が間違っている場合は私を修正してください。
私はバグが発生する可能性があるので、できるだけ既存の(これまで共有していない)コードベースを少し変更しなければならないのが大好きです。私はまた、ファイルをディスクに書き込むことなくこれをやりたいと思っています(明らかに、それらを暗号化する理由があります)。
ありがとうございました。申し訳ありませんが、私は十分に明確でないか少し曖昧です。あなたが私を助けるために必要な場合、私はより多くの情報を追加することができます。
ジェイミー
ラップと '閉じる(への呼び出しを失う:CryptoStreamコンストラクタはまだ幸せになります) '。 –
参考までに、データを復号化するには、簡単に取り込めるキーを保存する必要があります。また、スクリプトを使用するには、そのスクリプトを復号化する必要があります。これは簡単にキャプチャすることもできます。アプリが別のコンピュータで実行されている場合は、アプリを管理することはできません。 "Process Explorer"と同じくらい単純なことは、あなたの "drm"を迂回することができます。 – Bengie
@Bengieええ、私は知っています。私たちは、本当に必然的にスクリプトファイルの内容を知りたいと思っている人は、おそらく時間がかかりすぎていると考えています。ソフトウェアでリリースされるユーザーガイドにスクリプトビルドセクションがあることを考慮すると、エンドユーザーは独自の暗号化されていないスクリプトを読み込むことができます。 –