ファイルに暗号をかける

文章:1J寺田


1.初めに

 プログラムを組んでゲームを作る際、画像や音楽等の各種データは外部ファイルから読み込むことになります。
 しかしこの際、例えば画像データを読み込むときにそのままBMPファイルを使っていてはユーザーにファイルの中身を見られてしまいます。
 そうなるとまずい、ということでデータファイルには暗号をかける必要があります。
 ではどうやってファイルに暗号をかけるか。そんなことをこの会誌で書き綴ることとします。
 我流なのでどの程度参考になるかはわかりませんが。

2.さっそく置き換える

 データ圧縮をしない、1:1の暗号化を考えます。

 一番簡単な方法としては…
1.ファイルを開く。(バイナリモード)
2.一文字読み込む。
3.数値に1を足す。(数値が255のときは0にする)
4.書き出す。
5. 2に戻る。(以後ファイルをすべて読み込むまでループ)
 少なくとも普通の画像編集ソフトでは読み込めなくなります。
 慣れた人が解析すると一発でばれると思いますが。

 少し捻って
1.ファイルを開く。
2.一文字読み込む。。
3.2で割り切れる数なら2を足して書き出す。(数値が254のときは0にする)
4.2で割り切れない数ならそのまま書き出す。
5. 2に戻る。(以後ループ)

 発想を変えて
1.ファイルを開く。
2.一文字読み込んでaに代入。
3.次の一文字を読み込んでbに代入。
4.bを書き出す。
5.aを書き出す。
6. 2に戻る。(以後ループ)
 ファイルの終点部分を考慮すればなかなか使えるかと。

 ざっと思いついたものを書いてみました。
 あとはこれらを組み合わせれば、そこそこ解析されにくい暗号ファイルが出来上がるのではないかと思います。
 実際のゲームでデータを読み込むときは基本的に暗号をかけるときと逆の操作をすることになります。

3.ヘッダなんて飾りです

 例えばBMPファイルに前項一番上の方法で暗号をかけたとしましょう。
 すると、どんなBMPファイルに暗号をかけても、最初の2文字は"CN"になります。
 BMPファイルには、 「最初の2文字は"BM"である」 という決まりがあるからです。

 普通、一般的な(暗号をかけられていない)ファイルの先頭にはヘッダというものがついており、
 画像編集ソフトなどはヘッダ部分を読み込んで
 「あ、これは多分BMPファイルだな」
 という風に予想をつけることができます。
 ヘッダには「ファイルの種類を判別する」という働きと「ファイルの傾向(BMPの場合、色数や縦横の長さ)を判別する」という働きがあります。
(※あまり詳しく勉強してないので正確ではないと思いますが、多分大外れはしていないはずです)
 ゲーム用データとして読み込むときは、どのファイルがどんなデータなのか最初からわかっているので、ヘッダの「ファイルの種類を判別する」部分は無視していい事になります。状況によってはヘッダ全体を無視してもいいでしょう。
 具体的には、
1.ファイルを開く。
2.とりあえず最初の2文字を無視。("BM"の部分)。
3.一文字読み込む。
4.数値に1を足す。(数値が255のときは0にする。)
5.書き出す。
6. 3に戻る。(以後ファイルをすべて読み込むまでループ)
 こうすることで、解析されにくくなる&ちょっとだけ容量が節約できます。
 もしこうしない場合、
 「最初の2文字が"CN"のファイルが妙に多い」
 →「これはヘッダじゃないか?」
 →「仮に"BM"を弄って"CN"にしたとすると、文字に−1すれば元に戻るから残りのデータも−1していけば...」
 →解析成功。
 なんてことになりかねません。

 ちなみに、JPGには"JFIF"、WAVには"RIFF"と"WAVE"という文字列が必ず含まれています。

4.とりあえず完了

 数学を勉強すればもっと複雑な暗号をかけることができると思いますが、どんな暗号法だろうと解析されるときは解析されます。
 時間稼ぎだと思って気楽にやればいいんじゃないかと思います。

最初に書いた日:2002/10/26
修正:10/30