- PR -

暗号化していないファイルを復号すると落ちます

1
投稿者投稿内容
さくら
常連さん
会議室デビュー日: 2004/06/15
投稿数: 31
投稿日時: 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
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-07-06 19:12
とりあえず、例外の内容ぐらいは書かないと。。。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-07-06 23:47
引用:

さくらさんの書き込み (2006-07-06 18:56) より:
暗号化していないファイルを以下のコードに通すと、
objStreamWriter.Write(objStreamReader.ReadToEnd)で落ちてしまいます。
落ちる原因がおわかりになる方はいらっしゃいますでしょうか?



セキュリティ設計が、根本から間違ってるからです。
「原因」としては。

、、いやほんとだって(苦笑)。

例外の内容もいいですが(分かれば、書いてほしいが。)

そもそも、設計で決めるべき「データ」の内容を実装で切り分けること自体が
楽しく間違いです。

。。。。「実装」で切り分けたいの?
よくあるんだよね。最近は「設計」すらしないからね。

って普通に

>'復号化されたデータをストリームから読み込み、別のテキストファイルに書き込むます。
>objStreamWriter.Write(objStreamReader.ReadToEnd)

で例外が発生するから、そこだけ例外をハンドリングして無視すればいいのでは。
「製品」では昔から、よくある実装です。

さくら
常連さん
会議室デビュー日: 2004/06/15
投稿数: 31
投稿日時: 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

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-07-07 09:26
引用:

さくらさんの書き込み (2006-07-07 04:08) より:
加納さん返答ありがとうございます。

例外の内容は「復号化したデータの長さが違います」でした。もしくは「データが違います。」
本当は、暗号化したファイルとそうでないファイルの違いが復号処理をする前に
何かしらの方法でわかればいいのですが・・・。


処理を行う前に分かるようにファイルの設計を行えばよい。

例えば実行ファイルだって、ファイルの先頭に実行ファイルであることを示すフラグを持っている。拡張子がEXEだからと言って、いきなり実行しているわけではない。例えばZIPファイルはデータを格納するときに暗号化を施すことが出来る。暗号化されているか否かを、暗号化を解除できるかトライ&アンドエラーで判断しているわけではない。あなたのファイルだって同じように先頭に非暗号化部分を設けて、そこに判断するためのフラグをもつことは可能でしょ。

でなければ素直に「復号化したデータの長さが違います」もしくは「データが違います。」とエラーメッセージを表示したらよいでしょ。
1

スキルアップ/キャリアアップ(JOB@IT)