2012-01-11 8 views
3

現在、.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にコピーする - 私が間違っている場合は私を修正してください。

私はバグが発生する可能性があるので、できるだけ既存の(これまで共有していない)コードベースを少し変更しなければならないのが大好きです。私はまた、ファイルをディスクに書き込むことなくこれをやりたいと思っています(明らかに、それらを暗号化する理由があります)。

ありがとうございました。申し訳ありませんが、私は十分に明確でないか少し曖昧です。あなたが私を助けるために必要な場合、私はより多くの情報を追加することができます。

ジェイミー

+0

ラップと '閉じる(への呼び出しを失う:CryptoStreamコンストラクタはまだ幸せになります) '。 –

+0

参考までに、データを復号化するには、簡単に取り込めるキーを保存する必要があります。また、スクリプトを使用するには、そのスクリプトを復号化する必要があります。これは簡単にキャプチャすることもできます。アプリが別のコンピュータで実行されている場合は、アプリを管理することはできません。 "Process Explorer"と同じくらい単純なことは、あなたの "drm"を迂回することができます。 – Bengie

+0

@Bengieええ、私は知っています。私たちは、本当に必然的にスクリプトファイルの内容を知りたいと思っている人は、おそらく時間がかかりすぎていると考えています。ソフトウェアでリリースされるユーザーガイドにスクリプトビルドセクションがあることを考慮すると、エンドユーザーは独自の暗号化されていないスクリプトを読み込むことができます。 –

答えて

2

var stream = new System.IO.MemoryStream(System.Text.Encoding.Unicode.GetBytes(decodedFile)); 
var streamReader = new StreamReader(stream); 

また、あなたはおそらく使用してブロックに置くことで、あなたのRijndaelManagedインスタンスを廃棄する必要があります。

using (RijndaelManaged rijndaelCryptography = new RijndaelManaged()) 
{ 
    ... 
} 

更新

あなたは、そのような暗号化されたファイルを取得することができますし、すべての `IDisposable`オブジェクト(` FileStream`、 `RijndaelManaged`、` CryptoStream`と `StreamReader`)using`ブロック`で

Stream fileToDecrypt= _assembly.GetManifestResourceStream(File); 
... 
CryptoStream cs = new CryptoStream(fileToDecrypt, rijndaelCryptography.CreateDecryptor(key, iv), CryptoStreamMode.Read); 
+0

復号化されたスクリプトをStreamReaderに読み込んだので、スクリプトファイルを読み込む際にエラーが発生していることがわかりました。 FileStreamを使用すると、dllに埋め込まれるのではなく、dllと同じディレクトリにあるファイルに対して明示的にコードが検索されることがわかりました。問題は、CryptoStreamがデータを暗号化するためにFileStreamを必要としたことです。あなたはこれを回避する方法を知っていますか? –

+0

@JamieTaylor CryptoStreamコンストラクタでは、Streamのインスタンスのみが必要です。Assembly.GetManifestResourceStream(resourceName)を使用して埋め込みリソース(ファイル)を取得することができます –

+0

このコードで作業している他の人は、 "それは彼が感謝を表明したことであり、あなたはとても役に立ちました。ありがとうございます。 –

2

私はこれを行う方法のためのインターネットの周りに長い外観を持っていたし、私が来た最も近い別のStreamReaderオブジェクトにdecryptReaderの内容をコピーする代わりに、文字列に出て復号化されたが、あるStreamReaderの内容を別のStreamReaderにコピーすることはできないようです。私が間違っていれば私を修正してください。

ごくわずかです。 StreamReaderから別のコピーにコピーすることはできませんが、StreamReaderから1つ読むことができ、MemoryStreamなどのバックアップを受けてStreamWriterに書き込むことができます。 StreamReaderは、StreamWriterによって書き込まれたMemoryStreamのデータのまわりでラップできます。

あなたがしたいことはかなり可能です。実際、私があなたの設定で目にする最大の問題は、復号鍵を扱うことです。あなたは、単にバイト配列に、あなたのデコードされたファイルの内容を変換し、ストリームとしてこれを公開することができ

関連する問題