LoginSignup
14
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-14

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

14
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15