東方datの構造 (仮) part1
東方datの構造 (仮) part1
画像ファイルや効果音のファイルなどを格納した、東方datを調べているのですが、このままだと全然ブログを更新できないので、わかったことについて ちょろっと書こうと思います。
現在、新しい作品の東方datから調べていて旧作とかはまだわかりませんが、(主にbrightmoonのソースコードの解釈) 基本的に 暗号化+圧縮 みたいです。
暗号化は、PC98版とWindows版で違う方式をとっていています。どちらもxor演算を使用し、暗号化キーを1回ごとに一定の数値を加算して変化させていくのは同じなのですが、Windows版ではさらにバイト列を特定の長さごとに切り分け、その中で奇数番目と偶数番目のバイトを並び替えるという作業をしています。
永夜抄と花映塚、それ以降の作品で、暗号化のアルゴリズムは一緒なのですが、一部仕様が違います。
どちらも、ファイル名の一覧のデータは圧縮してから暗号化しているのですが、1つ1つのファイルのデータは、前者は、1つ1つ暗号化して1つ1つ独自のヘッダをつけてから圧縮していて、後者は単純に圧縮してから暗号化しています。前者も後者も、1つ1つのファイルデータを暗号化するためのキーを8種類あらかじめ準備しているのですが、そのどれで暗号化するのかを決める方法が異なります。
永夜抄、花映塚は、1つ1つのファイルを暗号化したら、特定の数値 (0~255) と、決まった3バイトの文字列の合計4バイトをヘッダとして付加します。暗号化のキーのリストのにも、1つづつ、この (0~255) に対応する数値を入れておき、どのキーで暗号化したのかを明確にするようにしています。ヘッダを付加後に圧縮するので、解凍時にヘッダの3バイトを確認すれば、成功したかどうかがわかります。
永夜抄、花映塚以降の作品はもうちょっと簡単で、1つ1つのファイル名の文字コードを全部足して、8で割った余りを暗号化キーのどれかを示す数値としています。
暗号化の処理は、割と簡単に作れました。xor演算して並び替えるだけですので。xor演算は、もう一回同じ数値でxor演算すると元に戻るという性質があるので、並び替えの処理だけ逆にすれば、暗号化の処理もできます。
あとは、圧縮解凍の関数を作ればとりあえず東方datを編集できるツールができそうです。
ググれば東方のツールなんてたくさんありますが、こういっちゃ悪いですけど使いにくいものが多いですし、神霊廟などの新しい作品に対応していなかったりしますから。それに、自分のC言語/C++の能力をつけたいし、なにより、自分で作るということ自体が楽しいですから。他人のコードを見ながら作っているとはいえ、逆の処理を考えたり、ユーザーインターフェースをどんなものにしようかとか考えたりしますからね。自分で考えて作るのが楽しいんです。疲れますけど、それだけする値打ちはあります。
ではまたいつか。
↓クリック (投票) お願いします~
大変そうだなあ。頑張れ!
ありがとうございます!