- PR -

VB.NETで画像ファイルのXOR暗号

投稿者投稿内容
未記入
会議室デビュー日: 2006/08/23
投稿数: 7
投稿日時: 2006-08-23 14:17
mioさん、一郎さん返答ありがとうございます。

ビットに変換どうこうの以前の問題ですね・・・
何も分からずトンチンカンでお恥ずかしいです。

JPGファイルをFileStreamでバイナリで読み込めばいいのでしょうか?
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-23 15:44
まずはやってみて、どうにもうまくいかなかったり、エラーが取れなかったりなら、質問しましょうよ。
それでPCが壊れるなんてことも、ないのだから。
未記入
会議室デビュー日: 2006/08/23
投稿数: 7
投稿日時: 2006-08-23 17:06
色々とやってみて、なんとか暗号化できました。

ですが、本来行いたい方法とは少し違います。
もともと、PHPで行っていたのと同じ方法で暗号化したかったのですが
その時の暗号化シード値は「元文字列と同じ長さ分"1"で埋める」としていました。

---PHPコードサンプル---
$fh = fopen("moto.JPG", "r");
$text = fread($fh, filesize("moto.JPG"));
fclose($fh);
for($i=0; $i<=strlen("moto.JPG"); $i++){
$seed .= "1";
}
//XOR暗号化
$out = $text ^ $seed; ←★★★
$fh = fopen("enc.JPG", "w");
fwrite($fh, $out);
fclose($fh);
----------

VB.NETでの場合、FileStreamでByte配列に読み込み
XOR暗号したのですが、★★★のように
「全データ XOR 1埋め」の方法が分かりません。
どうすればよいのでしょうか?
どの辺りが間違えているのか、行き詰ってしまいました。

---VB.NETコードサンプル---
Dim strImg As String = "moto.JPG"
Dim strEnc As String = "enc.JPG"
Dim rBuffer() As Byte
Dim wBuffer() As Byte
Dim fs As System.IO.FileStream
Dim fsize As Integer
Dim i As Integer

'ファイルを読む
fs = New System.IO.FileStream(strImg, IO.FileMode.Open, IO.FileAccess.Read)
fsize = CInt(fs.Length)
ReDim rBuffer(fsize - 1)
ReDim wBuffer(fsize - 1)
fs.Read(rBuffer, 0, fsize)

'XOR暗号化 ←★ここがよく分かりません★
For i = 0 To UBound(rBuffer)
wBuffer(i) = System.Convert.ToByte(rBuffer(i) Xor "1")
Next
fs.Close()

'ファイルを保存
fs = New System.IO.FileStream(strEnc, IO.FileMode.Create, IO.FileAccess.Write)
fs.Write(wBuffer, 0, fsize)
fs.Close()
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-23 21:53
引用:

未記入さんの書き込み (2006-08-23 17:06) より:
色々とやってみて、なんとか暗号化できました。

ですが、本来行いたい方法とは少し違います。
もともと、PHPで行っていたのと同じ方法で暗号化したかったのですが
その時の暗号化シード値は「元文字列と同じ長さ分"1"で埋める」としていました。


ん〜?
 PHP が変でしょう?文字列って何か、理解しています?文字じゃないものを、文字列として扱うことは、できないでしょ?ただのデータなのだから、0xff 等というコードも、当然含まれています。このコードに、文字は割り当てられていませんよ?


 さらに、「同じ長さ分の "1"」というのも、定義が非常に曖昧です。まず、「長さ」って、何の長さでしょう?上に示したように文字列ではないので、「文字列の長さ」というのは、答えとして適切ではありません。そして、"1" とは、なんでしょう?全ビットが 1 なのか、それとも "1" という文字のアスキーコードと演算するのか、不明です。

 また、暗号化したものに "jpg" の拡張子をつけるのも変でしょう。この方法だと、JPEG ではないファイルができますよね?ファイルの先頭から終わりまで XOR を取っているので、JPEG としての情報を持っているヘッダを壊してしまいます。
未記入
会議室デビュー日: 2006/08/23
投稿数: 7
投稿日時: 2006-08-23 21:57
PHPでのXOR暗号化は下記URLの通りに行いました。

第8回 ファイルの中身を暗号化する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060131/228211/?ST=tech_print

同じことをVB.NETで行いたかったのですが、無理なんでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-08-23 22:44
引用:

未記入さんの書き込み (2006-08-23 21:57) より:
PHPでのXOR暗号化は下記URLの通りに行いました。

第8回 ファイルの中身を暗号化する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060131/228211/?ST=tech_print

同じことをVB.NETで行いたかったのですが、無理なんでしょうか?


このご時勢になんちゅうふざけた記事を…
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2006-08-23 23:34
元となる記事にて行っている事はこのような話だと読みとりました。
PHPに対してはあまり知識がないので間違っていたら申し訳ありません。

「1ビットずつのXOR演算→ビットの反転」

元々の記事ではバイト単位での変換ではなく、一括して変換しようとしたため
元データと同じバイト数のシード文字列を用意した、という事ではないでしょうか。

なお少々余談なのですが、私はDOS時代も過ごしてきた人間なので、
拡張子というのはファイル名の一部でしかなく、ファイルの種別を表しているとは限らない
と思っているのですが、今のご時世ではやはり少数派なのでしょうか?


[ メッセージ編集済み 編集者: Ahf 編集日時 2006-08-23 23:37 ]
未記入
会議室デビュー日: 2006/08/23
投稿数: 7
投稿日時: 2006-08-23 23:47
Jittaさん、なちゃさん、Ahfさん 皆さんありがとうございます。

参照URLのPHPでのXOR演算の方法が?なのか分からないのですが、
やりたいことはPHPとVB.NETで同じようにJPGファイルを暗号化
(※暗号化といっても、ビューアで単純に開けなくなる程度で良かったんです)
したかったのです。

皆さんから指摘された通り、XOR演算・ビット・バイナリ・・・
基本的な部分で自分自身が分かっていないことだらけだったので
再度勉強し直して考えてみます。

ありがとうございました。

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