- - PR -
暗号化していないファイルを復号すると落ちます
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-06 18:56
暗号化していないファイルを以下のコードに通すと、
objStreamWriter.Write(objStreamReader.ReadToEnd)で落ちてしまいます。 落ちる原因がおわかりになる方はいらっしゃいますでしょうか? 落ちた場合は、復号ロジックを通さないでファイルを開くようにしたいのですが、 途中で落ちてしまうと、ストリームがcloseできなくて、新たにファイルにアクセスできません。 どなたかご存知の方はご教授くださいませ。 Public Function DecryptByDES(ByVal inputFileName As String, ByVal decryptedFileName As String) As Boolean Dim objCryptoStream As System.Security.Cryptography.CryptoStream Dim objFileStream As System.IO.FileStream Dim objStreamReader As System.IO.StreamReader Dim objStreamWriter As System.IO.StreamWriter Try 'objFileStreamのインスタンスを作成します。 objFileStream = New System.IO.FileStream(inputFileName, IO.FileMode.Open) Dim des As System.Security.Cryptography.DESCryptoServiceProvider = GetKeyInfo() 'DES復号化オブジェクトの作成 Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _ des.CreateDecryptor() '読み込むためのCryptoStreamの作成 objCryptoStream = New System.Security.Cryptography.CryptoStream(objFileStream, desdecrypt, _ System.Security.Cryptography.CryptoStreamMode.Read) 'StreamReaderのインスタンスを作成します。 objStreamReader = New System.IO.StreamReader(objCryptoStream, System.Text.Encoding.Default) objStreamWriter = New System.IO.StreamWriter(decryptedFileName) '復号化されたデータをストリームから読み込み、別のテキストファイルに書き込むます。 objStreamWriter.Write(objStreamReader.ReadToEnd) objStreamReader.Close() objStreamWriter.Close() objFileStream.Close() objCryptoStream.Close() Catch Ex As Exception MessageBox.Show("読み込みに失敗しました。", "エラー", MessageBoxButtons.OK) Return False End Try Return True End Function | ||||
|
投稿日時: 2006-07-06 19:12
とりあえず、例外の内容ぐらいは書かないと。。。
| ||||
|
投稿日時: 2006-07-06 23:47
セキュリティ設計が、根本から間違ってるからです。 「原因」としては。 、、いやほんとだって(苦笑)。 例外の内容もいいですが(分かれば、書いてほしいが。) そもそも、設計で決めるべき「データ」の内容を実装で切り分けること自体が 楽しく間違いです。 。。。。「実装」で切り分けたいの? よくあるんだよね。最近は「設計」すらしないからね。 って普通に >'復号化されたデータをストリームから読み込み、別のテキストファイルに書き込むます。 >objStreamWriter.Write(objStreamReader.ReadToEnd) で例外が発生するから、そこだけ例外をハンドリングして無視すればいいのでは。 「製品」では昔から、よくある実装です。 | ||||
|
投稿日時: 2006-07-07 04:08
加納さん返答ありがとうございます。
例外の内容は「復号化したデータの長さが違います」でした。もしくは「データが違います。」 本当は、暗号化したファイルとそうでないファイルの違いが復号処理をする前に 何かしらの方法でわかればいいのですが・・・。 例外をハンドリングして無視とはこういうことでしょうか? この方法だとcloseしたところでまた、落ちてしまいます。 ちなみに、 Writeをして落ちるのではなく、objStreamReader.ReadToEndで既にエラーになっていました。 try objStreamWriter.Write(objStreamReader.ReadToEnd) catch finally objStreamReader.Close() objStreamWriter.Close() objFileStream.Close() objCryptoStream.Close() end try | ||||
|
投稿日時: 2006-07-07 09:26
処理を行う前に分かるようにファイルの設計を行えばよい。 例えば実行ファイルだって、ファイルの先頭に実行ファイルであることを示すフラグを持っている。拡張子がEXEだからと言って、いきなり実行しているわけではない。例えばZIPファイルはデータを格納するときに暗号化を施すことが出来る。暗号化されているか否かを、暗号化を解除できるかトライ&アンドエラーで判断しているわけではない。あなたのファイルだって同じように先頭に非暗号化部分を設けて、そこに判断するためのフラグをもつことは可能でしょ。 でなければ素直に「復号化したデータの長さが違います」もしくは「データが違います。」とエラーメッセージを表示したらよいでしょ。 |
1