AdventCalendar前哨戦として投稿します。
ツクールMVかっちゃっていじってます!!
さて表題の件についてです。現時点でソリューションは存在しませんが、できるかできないか、できるならどのように、の観点で書きたいと思います。
#その前に……
クライアントサイドの暗号化は、かならず破られます。
暗号化は、データの抽出に時間がかかるか、そうでないかの違いでしかありません。やるひとはやります。
よって、リソースの保護という観点では、あまり意味がありません。
それなのになぜ暗号化するのか?理由はプレイヤ側にあると考えてます。
##簡単に見えたりいじれると萎える
人間安きに流れます。たとえばラスボスの画像が画像ビューアでみえちゃうとなると、みたくなるのが人情というもの。
また、プロジェクト丸見えなため、敵強すぎー!!って思ったら、ちょちょいといじれちゃいます。Lvもいきなり99です。
これはお互いしょんぼりです。
つまり、暗号化の目的は、 プレイヤを萎えさせないため です。
目的を明らかにすることで、とるべき方法の方針も自ずと決まってきます。
- イメージ、音楽は、少なくてもビューアやプレイヤで見えないようにすればよい
- data/以下は、MVのエディタで読めなくすればよい
- スクリプトはぱっとみわからなければいい
#アセットの暗号化
戦略としては二つあります。
##そもそもビューアでみれないようにする
ヘッダをいじったり、ファイルに暗号化をかける方法です。
WebAudioはsourceにArrayBufferを受け取れるため、暗号化を解除するだけでよいですが、画像を読み込むためには一工夫が必要です。
- JavaScriptでデコードを行う
png-jsというものが存在します。速度的に劣るでしょうが、可能です。
- dataURIを使う。
Image.srcにBase64でエンコードしたdataURIを指定します。Base64にエンコードする時間と、ブラウザがBase64をデコードし、pngをデコードする時間が必要です。
##ビューアでみれても無意味にする
ビューアでみれても無意味にする戦略です。画素に対して暗号化を書ける、といえるかもしれません。音楽にこの処理は逆に難しいため、省きます。
- ピクセルに対してxorをかける
乱数のシードをあわせてxorをかければ、ぱっと見無意味な画像にできますし、xorを再度かければ、もとに戻せます。
- ダイス化、あるいはレイヤ化する
画像を細切れにして、読み込み時につなぎ合わせます。ただし、ファイル数自体が増えるため、読み込みに時間がかかります。
#data/以下の暗号化
そもそももとがテキストデータのため、暗号化するにあたって、特に問題は無いでしょう。
#スクリプトの暗号化
まず、Web版では暗号化は無意味です。できますが、暗号化を解除するためにはJavaScriptを記述する必要があるため、コードを読める人にとっては意味がありません。難読化(uglify)はできますが、コードを読めるレベルの人は、その逆変換(beautify)ができることは知ってますので、やはり無意味です。
一方、PC版は、簡単に改造できない形式に変換することができます。nwjcです。
V8にはスナップショットという、JavaScriptの「環境の状態」を保存する機能があり、それを利用したものです。
ただし、実験的機能であることに注意してください。これを行ったせいで動かなくなる、ということも十分考えられます。
以上が、暗号化の行うための技術的なポインタになります。
#おまけ:ネトゲ化という夢
Web版の場合、ロジックをすべてサーバ側でもてば、改造のたぐいは難しくなるでしょう。
MO並の負荷がサーバにかかるため、これが現実的かといわれると疑問です……。が、面白い題材だと思います!