2015年03月15日

P2PでTCGを対戦するソフトでイカサマを対策するには(理論編)

※やや専門的な記事です。この記事を理解するには、基本情報技術者レベルの知識が必要かもしれません。
※TCG(トレーディングカードゲーム)の知識も必要です。


リアルでTCGを対戦するのは楽しいものですが、忙しくなるとそうもいかなくなってきます。
また、オンライン対戦の方がリアル対戦に比べて、短時間で対戦できるというメリットもあります。

そんなわけで、オンラインでTCG対戦ができるソフトの需要は確かにあるのですが、オンライン対戦ソフトを作るにあたって、1つ考慮しなければならない事があります。

それが「イカサマ」や「チート」と呼ばれるものです。

普通のネトゲなんかでも、チートプレイヤーなるものが居たりするのですが、ソフトの設計に問題があると、TCGでもこれができてしまいます。
そこでこの記事では、TCGのネット対戦で「悪いプレイヤー」が使うであろうイカサマと、それを対策するにはどのようなロジックにすれば良いか? という事を考察していきたいと思います。

−ご注意−
最初におことわりしておきますが、私はオンラインTCG対戦ソフトを開発しているわけではありませんし、そんな計画もありません。
ただ単に、こういうヤヤコシイ事を考えるのが好きなだけです。

 
 
1:P2P対戦ソフトとは、どのようなものか?
オンライン対戦には、大きく分けて2つの種類があります。「サーバ型」と「P2P型」です。

「サーバ型」というのは、2人のプレイヤーの間にサーバが入っているタイプです。
現在商用で提供されているオンラインTCGソフトは、ほぼ全てがこのタイプだと思われます。

逆に、間にサーバをかまさずに、2人のプレイヤーが直接メッセージのやり取りを行うやり方が、「P2P型」と呼ばれるタイプです。

TCG_P2P_01.png

サーバ型には、
・サーバの維持費がかかる
・サーバが障害でダウンしたら何もできなくなる
・サービスが終了したら永遠に遊べなくなる

というデメリットがありますが、課金コンテンツで儲けることができる、イカサマの入り込む余地がない、といったメリットがあるため、商用サービスでは広く使われています。

その一方でP2P型には、
・ルータの設定やプロバイダによっては遊べない
・セキュリティ対策が必要

といったデメリットがありますが、サーバの維持費が全くかからないため、有志でプロジェクトを立ち上げるのに非常に適しています。

この記事では、このP2P方式に焦点を当てて話を進めていきたいと思います。

2:どのようなイカサマが存在するか
さて、P2P方式では、サーバ方式と違って、シャッフルやドローはプレイヤーのPCで行わなければなりません。
ここに、イカサマの入り込む余地があるのです。

悪質なプレイヤーCが居たとします。CはP2P対戦ソフトを逆コンパイルしてリバースエンジニアリングし、改造クライアントを作りました。

【改造クライアントで可能なイカサマ】
・シャッフルしない(積み込み)
シャッフルしない事によって、積み込んだカードを思い通りに引くことができます。
簡単に言うと、毎回デッキが「ブン回り」するのです。

・ドロー操作
もし積み込みに失敗しても安心です。デッキの順番を勝手に並び替えて、自分に有利なカードが引けるようにすれば良いのです。

・すり替え
手札の中の要らないカードを、こっそりデッキの中の好きなカードと取り替えます。

・デッキに存在しないカードを引く
デッキのカード情報を改ざんして、デッキにないカードを手札に入れます。
対策カードさえあれば、状況をひっくり返すのは簡単ですよね!

・4枚制限のカードを10枚入れる
ルールで「同じ名前のカードは4枚まで」と決められているのに、10枚も20枚も入れたりします。

‥‥このような事は、クライアントを改造できるだけの技術がないと不可能ですが、イカサマはそれだけではありません。
自分のPCのメモリの中を覗くだけでできるイカサマもあります。

・次に自分が引くカードを知る
だけではなく、デッキの順番を全て調べる事ができてしまいます。
次にどのカードを引くのかが分かれば、作戦も立てやすいですよね。

・相手のデッキの中身を知る
積み込み対策で、「デッキを対戦相手にシャッフルしてもらう」という仕様のソフトがあったとします。
その場合、適切な対策を施していなければ、その時に相手のデッキの中身を読み取って、どんなカードが入っているのかを全て知ることができてしまいます。
改造クライアントと組み合わせれば、相手が不要カードしか引かないように操作する事だってできちゃいます。

‥‥‥といった具合に、色々とイケナイ事ができてしまいます。
それだけで済めば良いのですが、そのプレイヤーCがとんでもない悪意を持っていた場合、こんな事までできてしまいます。

‥‥プレイヤーCは、その改造クライアントを自サイトで公開して配布し、誰もがイカサマができる状態にしました。
その結果、そのコミュニティではイカサマが横行し(もしくは皆がイカサマの疑心暗鬼に囚われて)マトモなプレイができなくなり、その結果そのコミュニティは潰れてしまいましたとさ。おしまい。

こんな事しても得するのはCだけなのですが、世の中どんな人が居るか分かりません。用心しておくに越したことはないのです。

これがサーバ型のソフトであれば、このような事はできません。シャッフルは第三者であるサーバが行うので、積み込みは不可能です。シャッフル後のデッキの中身もサーバが持っているので、ドローを操作したり、次に引くカードを事前に知ったりする事も不可能です。
手札にないカードを場に出そうものなら、サーバがそれを察知してノーゲームにしてしまいます。

しかし、P2P型は第三者を介さないので、どうしても
・メモリの中を覗かれるかもしれない
・改造クライアントによってデッキデータを改ざんされるかもしれない
というリスクが付きまといます。

そこで、何らかの対策が必要になるわけです。

3:お互いのPCで結果の突き合わせをする
片方のクライアントが自分のデッキを処理する方法だと、勝手にデッキの並び順を変えたり、デッキの中のカード情報を書き換えたりする事ができてしまいます。
また、4枚制限のカードが5枚デッキに入っていたとしても、それを調べる術はありません。

でも、両方のクライアントが「デッキの中身」と「デッキの並び順」を知っていれば、イカサマをされても、それを察知できます。
イカサマはバレないから楽しいのであって、すぐに相手にバレてしまうのでは意味がないわけです。

そのため、「両方のクライアントで同じ処理を行い、その結果を突き合わせる」という方法が、イカサマには非常に有効です。

4:覗き見防止のために、暗号化とハッシュ化を使う
しかし、お互いのPCで同じ処理をするという事は、自分のデッキ情報を対戦相手に渡す事を意味します。つまり、自分のデッキの中身を見られてしまう危険があるわけです。
メモリの中は特殊な手段を使わないと見ることができませんので、もし対戦相手が「いい人」か、もしくは「技術を持っていない人」であれば問題ありません。そして、普通はそういう人の方が多いです。
でも、これはイカサマの記事ですので、対戦相手がバリバリの悪意と技術力を持っていると仮定して話を進めます。

しかし、いくら悪意と技術力があったとしても、そのデッキが暗号化されていたらどうでしょうか?
カギを使わずに暗号を解くのには時間がかかります。
固い暗号であれば年単位の時間がかかりますし、「そこそこの強度」であっても、解析には数時間かかります。
TCGの対戦なのですから、解析に30分もかかるようでは意味がありません。解析が終わる前に試合が終わってしまいます。つまり、いくら悪意と技術があったとしても、デッキの中を覗き見ることはできないのです。

そこで登場するのが「暗号化」と「ハッシュ化」の技術です。
簡単に言うと‥‥
・暗号化とは:「鍵」を使って文字列をぐちゃぐちゃにし、読めなくします。元に戻すには暗号化した時に使った「鍵」が必要です。(秘密鍵暗号の場合)
・ハッシュ化とは:「鍵」を使って文字列を変換し、意味の無い文字列(ハッシュ)にします。一方通行なので、元に戻すことはできません。(掲示板のIDや「トリップ」なんかに使われている技術です。)

この2つを駆使してイカサマを防ぐ方法を考えてみようと思います。
(後編「実装編」に続きます)
posted by TCT at 12:40| Comment(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: