ツクールMVで書き出したゲーム、暗号化できる?

  • 14
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

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並の負荷がサーバにかかるため、これが現実的かといわれると疑問です……。が、面白い題材だと思います!