ファイルの復号化について

タグの編集
投稿者 bcltkn  (中学生) 投稿日時 2009/12/5 03:34:33
 です。

http://msdn.microsoft.com/ja-jp/library/cc440863.aspx のサンプルコードを使ってファイルの復号化を行うのですが、このコード通りにやるとファイルとして出力されます。
しかし、ファイルとして出力したくないので、復号化されたデータだけを読み取りたいです。
いろいろと試行錯誤してみたのですが、すべてエラーになってしまいます。
何か方法があったら教えてください。


また、このコードを使わない(別のコードを使った)やり方があれば、そちらも教えていただきたいです。

よろしくお願いします。
投稿者 葉月  (社会人) 投稿日時 2009/12/5 04:34:53
ファイル以外だとレジストリに保存する手しか浮かびませんね。
重要レベルならレジストリに保存するのがいいと思いますが――
USBメモリを使っているので、そこまでこだわらなくてもいいと思います。
恐らくセキュリティの観点から気にしているんだと思うのですが――

そうなると媒体のUSBメモリを使うところから、改めないといけません。
USBを使う場合は、大手企業は自社か他社で開発した暗号化複合化のソフトを提供し社員に使わせるケースがあります。
それでも安心というレベルじゃない場合がほとんどです。
使う社員の利便性を考えず、企業コンプライアンス(社内の法令)を順守することが前提になっているためです。
詳細はお話しません。

利便性をそこなっていいなら、USBのバックアップを製作者が取るようにします。
それから、パスワードはシフトキーを含めた特殊文字16文字以上にして3回間違えたらUSBの中身を消去する手があります。

ただ、今回は日記とかの話ですから、そこまでこだわらくてもいいと思います。
恐らく、プログラミングなどに一番精通しているのはbcltknさんですし、
そのサンプルをベースにやってはどうでしょうか?
投稿者 あにす  (社会人) 投稿日時 2009/12/5 04:40:49
サンプルコード中で復号化したデータを読み込んでいる行、復号化したデータをファイルに書き込んでいる行を探してみて下さい。リンク先をよく読めば丁寧に説明されていますよ。
投稿者 bcltkn  (中学生) 投稿日時 2009/12/5 17:18:40
ご返答ありがとうございます。
そうですね、たかが中学生のやっていることなのにここまでしなくてもいいかな、と思いました。

ファイルを読み込んで復号化し、プログラムが起動しているあいだはそのファイルを放置し、終了と同時にそのファイルを暗号化する、という流れを作ってやってみたいと思います。

投稿者 葉月  (社会人) 投稿日時 2009/12/5 23:24:32
用途が日記だったので、そこまでしなくていいのではと感じました。
「学生だからやらなくていいんじゃない?」
と伝えたかった訳ではありません。
もし、そう感じてしまったなら私の文章力が拙いために誤解させてしまいました。

むしろ、チャレンジして欲しいと感じています。
bcltknさんは、ツールも作成されているようなので、
これからも興味のあることに挑戦された方がいいと思います。
社会人になってからは、興味があっても挑戦しにくい環境になります。
スキルを伸ばせるうちに伸ばした方が将来役立つでしょう。

試験用にサンプルを作ったり、他のアプリで使うには効果があるかも知れません。
投稿者 daive  (社会人) 投稿日時 2009/12/6 00:01:10
暗号化というほど、大げさでなければ、

1.バイナリーで、ファイルの読書きを行い。
  文字をある単位で、BitShiftする。
  →通常の方法では、直ぐには見れなくなります。
2.画像データや、サウンドファイルなどの、大きめのファイルなどに
  文章を混ぜてしまう。
 (分散化を適切に行えば、画像は画像として、音は音として問題ないレベルになります。)
  混ぜ方のパターンなり、方法が解からないと、データが取り出せません。
3.データの誤り訂正方法を、応用する:CRC-32とか
4.安直に、BASE-64化する。

暗号化、複合化であれば、

'10 行でズバリ !! 暗号化 (VB)
'http://msdn.microsoft.com/ja-jp/events/dd283151.aspx
が参考になるかもしれません。
投稿者 bcltkn  (中学生) 投稿日時 2009/12/6 03:06:07
ご返答ありがとうございます。

daiveさんの紹介してくれたサイトのサンプルコードをもとに、
Private Sub btnLogin_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnLogin.Click

    Dim UserName As String = Me.txtUserName.Text
    Dim PswDataPath As String = Application.StartupPath & "\pswdata\" & UserName & ".upf"
    '".upf"は、パスワード格納ファイルの拡張子 (User's Password File) 

    ' CryptData 配列から destination 配列へ変換 
    ' 暗号化された文字列を byte 配列に変換します 
    Dim sr As New StreamReader(PswDataPath)
    Dim data As String = sr.ReadToEnd()
    Dim source As Byte() = Encoding.Unicode.GetBytes(data)

    ' Triple DES のサービス プロバイダを生成します 
    Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider

    ' 入出力用のストリームを生成します 
    Dim ms As MemoryStream = New MemoryStream
    Dim cs As CryptoStream = New CryptoStream(ms, des.CreateDecryptor(DesKey, DesIV), CryptoStreamMode.Write)

    ' ストリームに暗号化されたデータを書き込みます 
    cs.Write(CryptData, 0, CryptData.Length)
    cs.Close()

    ' 復号化されたデータを byte 配列で取得します 
    Dim destination As Byte() = ms.ToArray()
    ms.Close()

    If Me.txtPassword.Text = Encoding.Unicode.GetString(destination) Then
        MsgBox("true")
    Else
        MsgBox("false")
    End If

    sr.Close()

End Sub

のように書き加えてみたのですが、
cs As CryptoStream = New CryptoStream(ms, des.CreateDecryptor(DesKey, DesIV), CryptoStreamMode.Write)

のところで「指定されたキーは、このアルゴリズムには有効なサイズではありません。」というエラーが表示されてしまいます。
どうしたらこのエラーはなくなりますか?

人任せですみません。
投稿者 daive  (社会人) 投稿日時 2009/12/6 04:17:05
10 行でズバリ !! 暗号化 (VB)
を、上から下まで、全て読んで理解しましたか?
サンプル通りの、動作は、試してみましたか?

試していないなら、試してみましょう。
出来ているならば、応用した部分の、何が悪いか考えましょう。
サンプルと違う部分は、どこでしょう?

理解せずに、切った貼ったしても、プログラムは動きません。