web-dev-qa-db-ja.com

ゲームの暗号化されたコンテンツ

私は、暗号化を使用して、ユーザーがプログラム自体の外にある私のプログラムのコンテンツを理解できないようにするという考えを持っています。ユーザーがゲームデータを使用しているときに、ゲームで使用されなかったテクスチャがイースターエッグの一部であることに気付く場合があります。これは、例えばオンラインで投稿された場​​合、皆のためにそれを台無しにします。

プレイヤーがゲームのセキュリティドアの正しい番号を押す必要がある秘密の部屋を想像してください。正しい場合、正しい復号化キーを生成し、レベルのその部分を復号化してドアを開く必要があります。したがって、キーは実際には格納されていないため、ゲームデータを調べてもイースターエッグにアクセスできなくなり、ユーザー入力に基づいて生成されます。

これが私が想像していた別の例です。私には、20のレベルがあるパズルゲームがあります。各レベルは異なるキーを使用して暗号化されています。復号化キーをプログラムに格納して直接誰かがプログラムを逆コンパイルして見つけられるようにする代わりに、前のパズルの解決策に基づいて暗号化/復号化キーを生成します。このようにして、プレーヤーは、ゲームデータを調べているときでも、次のレベルに関する情報を取得する前に実際にパズルを理解する必要があります。

パズルの解の数がおそらく解読キーの数よりも少ないとすれば、プレーヤーは、知識があれば、「簡単に」それを総当たりする可能性があります。それは本当にパズルの複雑な問題であり、ここではあまり重要ではありません。私はそれに関する答えを投稿しましたが ここに

このようなことをしたプログラム/ゲームは今日ありますか?暗号化されたコンテンツをゲームに保存しますか?そして、なぜではないのですか?店や国のレベルで、それについて多くのルールと規制がありますか?私が見落としている明らかな落とし穴を誰かが見ていますか?ユーザー体験のようなものを無視すると、その考えは私には聞こえやすく、なぜこれまでこれまで見たことがないのか不思議に思います。

編集:私が何を言っているのか正確にはわからない可能性があるため、より具体的な例を次に示します。

20文字の文字列を受け取り、対称キーを生成して、ゲームの一部のコンテンツを暗号化/復号化できる関数があるとします。ユーザーがそのコンテンツにアクセスできる唯一の方法は、それらの20文字を知って同じキーを生成することです。このキーは直接保存されることはなく、ユーザー入力に基づいてその場で生成されます。これらのキャラクターは、本、NPCとの対話、ゲームの外側のボックスの裏側などにさえ、ゲーム内に隠されます。

したがって、2 * 10 ^ 28の可能な組み合わせを試してみると、ゲームデータを調べるよりも、意図した方法でコンテンツを見つける可能性が高くなります。

編集2:問題のコンテンツは任意の秘密鍵で暗号化されますbefore消費者に出荷されます。このキーはゲームには付属していません。キーに基づいて作成された一連の手がかりが与えられ、ゲーム全体またはどこか他の場所に隠されているため、彼または彼女はどういうわけかキーを一緒に困惑させる必要があります。ただし、実際にゲームデータを調べない限り、コンテンツが暗号化されていることがわからないため、このシステムはユーザーに対して透過的です。

多くの人が言及しているように、これにはユースケースが限られているという明らかな欠点があります。一人の人がそれを理解したら、彼/彼女はそれを他の誰とでも共有することができます。しかし、あなたの意図が何かを秘密にして一人でそれを解決することができないはずであり、人々がそれを解決するために協力しなければならない場合、またはあなたのイースターエッグが非常によく隠されている(設計上)場合、ゲームプレイではなくコードで誰かがそれを見つける可能性が高くなります。次に、これはうまくいくと思います。

私は個人的には、おそらくゲームごとに1回だけ使用することをお勧めします。イースターエッグ、秘密の結末。パズルを複雑にしたり、隠したりして、コンテンツを暗号化して十分に暗号化できるように人々を遅くする必要があります。このパズルが人々の進行の邪魔になっているとしたら、誰もおそらく面白くないでしょう。

45
Christer

この質問は、ハッキングする代わりに少なくとも1人のユーザーにパズルを解かせることが可能(ジャスト商業的に実行可能またはその他の解釈ではない)かどうかを尋ねています特定のゲームコンテンツのロックを解除します。

私の知る限り、これは間違いなく可能です。実際、キーが生成も保存もされておらず、ゲーム状態から読み込まれるだけであることが非常に明確に示されている場合でも、他の回答がそれは不可能であると言っているのは奇妙です値)。 「ゲームはそれを解読する方法を知っている」ので機能しないという議論は、オープンソースの暗号化/解読ソフトウェア(たとえば、TrueCrypt)が本質的に安全でないことを意味します。キーボード入力に基づく文字列、それは簡単ですよね?)。

最も単純なケースでは、ゲーム自体がキーボードシミュレータであり、「暗号化されたファイルのパスワードは何ですか?」という質問をすることを想像してみてください。ゲームのソースコードを用意しても役に立たないことに、私たちは皆同意します。ゲームが「最小の動物の名前と連結された地球上で最大の動物の名前は何ですか?」という質問をすることを想像してください。ゲームのソースコードがあっても役に立たないことは明らかではありませんが、パズルを解決する必要がありますか?

これが可能かどうかに関しては、答えは絶対的YESです。

90
mk12

試されました。何度も何度も。暗号化を使用して、ユーザーが適切と思われるプログラムにアクセスできないようにすることを専門とする、完全な下位産業があります。そして、それは決して機能しません。最高の保護スキームは、解読されるまでに約1か月続く傾向があり、インターネットの問題は、一度解読されると、誰かが投稿するとすぐにどこでも解読されることです。あなたが見逃している明らかな落とし穴は、プログラムがデータを使用するために、それを解読するために必要なすべての情報を含まなければならないということです。それ。

これは「暗号化の根本的な問題」と呼ばれています:アリスはボブにメッセージを送信したいのですが、チャーリーはそれを手に入れても読めません。あなたのアプローチの問題この場合、提案はボブとチャーリーは同じ人物ですです。

ユーザーを台無しにしたくないという欲求は理解できますが、人々がスポイラーを欲しがればそれを見つけるでしょうし、そうでなければ、積極的にスポイラーを回避する傾向があります。しかし、本当に素晴らしいゲームを作りたいのであれば、反対のルート、根本的な開放性を試してください。 Neverwinter NightsStarcraft、またはElder Scrollsシリーズなど、リリース後何年もの間人気を維持しているゲームをご覧ください。これは、ユーザーがすべてを掘り下げ、その仕組みを理解し、独自のコンテンツを構築して共有できるようにする強力な設計ツールをゲームに同梱しているためです。 communityになり、コミュニティが存続するまで、ゲームは単なるゲームです。

57
Mason Wheeler

私は、コンテンツがそこにある場合、誰かがそれを見つけることを知るのに十分なほど長い間、長い間過ごしてきました。それを難し​​くすることは、より多くの決心した人々を引き付けるだけです。あなたの製品がより人気があるほど、それはより面白くなります。これは難しいこともあれば、この種の情報を投稿することで「信用」を得ることができる場所が非常に多いこともあります。

キーがゲームによってローカルで生成されている場合は、キーが生成されるポイントまでゲームをだます方法、または単に適切なコードを掘り出す方法を見つけることができます。ゲームの特定のステップを完了したときにサーバーからキーが送信された場合、誰かがサーバーをだまして、十分に到達したと信じ込ませます。

結局、あなたのゲームは、次のレベルの色が何であるかを見つけるのを難しくするよりも、あなたがそれを楽しく魅力的にすることに費やす時間から多くの利益を得ます。

10
axl

これがgamedev.SEにあるべき主な理由は、この暗号化を行うとゲームプレイに影響を与えるためです。

1つのパズルのソリューションを次のパズルの暗号化キーにしたいとします。つまり、そのソリューションの実際のデータは、次のパズルを解読する必要があります。つまり、復号化キーはゲームのデータの一部ではありません。プレイヤーによって生成されます。

そして、これが結果です。復号化は通常バイナリです。データの暗号化を解除するために必要な正確な復号化キーを持っているか、持っていないかのどちらかです。

ここでの結果は、あなたが設計するどんなゲームも非常に狭い範囲に集中しなければならないということですすべてのレベルに---(唯一の可能な解決策)。したがって、パズルの仕組みは、プレイヤーが意図とは異なる方法でパズルを解くことができないように、慎重に設計する必要があります。

例として、ポータル、テストチャンバー10を取り上げます。プラットフォームを下げるために、左に行っていくつかのことを行ってから、右に行っていくつかのことを行う必要があります。

または、自分自身にある程度の速度を与えて、まっすぐ歩いたときにプラットフォームまで飛んでいくこともできます。

GLaDOS:では、パズルゲームを作成しました。パズルゲームを最も楽しむ人を罰するパズルゲーム。よくやった。しかし、少なくともそれらのハッカーはあなたの貴重なデータを入手しません。なぜなら、パズルゲームを解くことを楽しむ人々は、オンラインでパズルゲームの解決策を探すまさにその種類の人々だからです。

つまり、それだけの価値があります。

だから、ロロの冒険、SpaceCHEM、ポータル(他の数百万の中でも)のようなパズルゲームは正解です。代わりに、-不可能となるようにゲームを設計して、複数のソリューションを持つパズルを作成する必要があります。これには非常に多くの注意が必要であり、通常、ゲームプレイを大幅に制限する必要があります。

GLaDOS:では、パズルゲームを作成しました。パズルの創造的な解決策を見つけるのが好きな人がプレイすることを意図したゲーム。そして、パズルに対する創造的な解決策がないゲームを作りました。 *スロークラップ*

あなたがそのようなゲームを作ることができないと言っているのではありません。または、そのようなゲームは良くありません。そのようなゲームは、特定の方法で設計する必要があるということだけです。

ああ、そしてあなたは機械的に解決策を見つけることが不可能(または非常に難しい)になるようにこのゲームプレイを設計する必要があります。

GLaDOS:では、パズルゲームを作成しました。 hackをプレイするよりも面白いパズルゲーム。よくやった。


もちろん、これには1つの注意点があります。「ソリューション」の意味です。要するに、ソリューションのどの要素を考慮に入れていますか?

動くキャラクターを含むゲームでは、おそらくキャラクターの正確な動きを使って復号化キーを作成することはないでしょう。たとえば、プレイヤーがパズルを「解く」ために特定のアイテムを拾う必要があるパズルゲームがある場合、それらのアイテムがタッチされた順序に応じてキーを依存させることができます。

もちろん、これは上記の問題にぶつかります。そこでは、プレーヤーが順不同で行う方法を見つけます。これも、パズルを設計して、注文を1つしか取得できないようにする必要があることを意味します。

さらに、復号化キーを構築するために使用する要素は、総当たりの復号化を困難にするために十分なエントロピーを提供する必要があります。上記の収集順序メカニズムを使用すると、新しいアイテムはそれぞれ1ビット余分になります。レベルに8項目しかない場合は、8ビットの暗号化を行っています。がらくたです。ほとんどのスマートフォンは数秒でそれを処理できます。

今日では、少しでもやりがいのあるものにするためには、少なくとも128が必要です。つまり、各レベルには多くのものが必要ですが、ゲームデザインにも影響を与えます。

9
Nicol Bolas

ここでの答えは良いです。でも別の視点から見てみます。あなたが説明しているのは機能です。機能にはコストとメリットがあります。コストには、機能を作成するためのドルコストと「機会コスト」の両方が含まれます。それらは:あなたが有限のお金と有限の時間と有限のプログラマーを持っている世界で、あなたがするすべての機能はその場所で行われなかった可能な機能の無限の数を意味します。

したがって、問題は、この機能のコストを実際に説明できるかどうかです。無料の機能はないので、コストについて現実的に考えてください。この機能に1000ドルを払ってもよろしいですか? 10万? 100万?この機能を使用するために、どの機能をカットしてもよいですか?

コスト、メリット、見逃した機会の観点から優先順位を付け始めると、ゲームをもっと楽しくする方法を考えていたはずのこの機能について、あまりにも多くの時間を費やしていることに気付くでしょう。

8
Eric Lippert

アリスボブとイブの問題はこれをよく説明しています。メイソンが彼の答えで指摘したように、イブもボブである場合、イブから秘密を守ることはできません。

したがって、すべてのソリューションは、必要な情報をすべて持っていないボブから構成されます。各レベルを個別のメッセージとして扱い、互いに個別に暗号化して、次のレベルのメッセージのexternalソースを用意する必要があります。メッセージを適切にゲートキープできます。

しかし、結局、それは悲観的になります。誰かが自分でゲームをプレイできる場合は、ゲームを取り込むプログラムも作成できます。したがって、あなたがしていることは、外部ソース(おそらく何らかのサーバー)との間を行き来させることです。彼らがサーバーへのメッセージを作成する方法を解読したら、それは同じ古い話です。

しかし、ここで重要な要素を忘れています。ゲームです。誰かがゲームでごまかしている場合、大きなおっと。あなたは詐欺師のためのゲームを書きませんでした。これは、クエストのウォークスルーやレベリングガイドでも同じです。自分で考え出すことに挑戦したい人は、投稿された解決策を無視します。ゲームをプレイせずにクラックを不可能にすることができたとしても(それは論理的に不可能であることはわかっていますが、可能であっても)、1人の男がそれを倒すために必要なすべてを投稿する前に歩くだけで済みます。したがって、あなたは避けられないことを遅らせているだけです。

素晴らしいゲームを作るのに時間をかけてください。 すべてのゲームに必要な10の事柄 そして最後に見たところ、暗号化はそれらの1つではありませんでした。

5
corsiKa

あなたの考えは無意味だと思います。

誰かがあなたのゲームをプレイするとき、彼らはそれをプレイすることを選択します、彼らは賞を獲得するためにそれをしていません、彼らは楽しみのためにそれをしています。

ユーザーは、最も楽しいのはあなたが意図した方法でプレイすること、そしてごまかさないことから来ることを知っています、彼らの顧客はすでにストーリーテラーとしてあなたを信頼しています。

また、誰かがパズルの解答、つまりあなたの鍵を見つけたらすぐに、インターネットのどこかにそれを投稿するだけです。
カンニングをしたいプレイヤーはまだそれをすることができます。


ただし、ゲームにスーパーマリオランドの秘密レベルなどの複数のソリューションが存在する場合、アセットを暗号化すると、それらのソリューションに簡単にアクセスできなくなります。

これはあなたのアイデアに有利な点のようですが、結局はそうではありません。

暗号化があっても、そのような秘密のソリューションが存在することを知ることは可能です。
シークレットソリューションが存在することがわかったら、プレーヤーがゲーム自体からゲームの隠された部分にアクセスすることを望んでいるため、プレーヤーがシークレットアセットを見ないようにすることは重要ではありません =(はい、たとえすべての隠されたテクスチャ/クリップ/オーディオ/テキストをすでに見たとしても)。

気付かないテクニックを使用することで、秘密のソリューションの存在の漏洩を防ぐことができます1、しかしそれでも疑わしいでしょう(秘密の解決策がない場合はなぜそうするのですか?)、プレーヤーはそれらを見つけることに興味を失い、プレーヤーの数は少なくなります。
結局、イースターエッグをトリガーするゲームを完了した後、さらに数時間プレイすることができますが、それらをトリガーするのに多大な努力が必要な場合は、1分以上プレイしません!


あなたがしたいのは、読者が自分で結末をだましてしまうのを防ぐために、次の章が現在の章の単語で暗号化されている執筆本のようなものです。
それについて考えてください、それは無意味ではないですか?

1VeraCryptとほとんど同じように、隠しボリュームを使用します。

2
Margaret Bloom

私は商業的実行可能性についてはコメントしませんが、純粋な技術的な観点からは、それは面白い挑戦です。


最初に、暗号化されていないものは保護できないことに注意してください。エントリをシークレットにゲートすることはできません。クラッカーはゲートの周りに道を見つけます。代わりに、シークレット全体をゲート自体にする必要があります。アセットに関しては、これはテクスチャ全体などを意味する必要はありません...プランを暗号化するだけで、どれがどのように使用され、十分であるかを示します。パフォーマンス上の理由から、できるだけ少ないデータを暗号化する必要があります。


第二に、キーがソフトウェアに含まれている場合、それはソフトウェアからからかわれることは正しいです。多くのゲームは、コンテンツを保護するときに、ゲームソフトウェアが変更されていないことを保証するために、あいまいさによるセキュリティまたはメカニズムのいずれかを使用しようとします。それらは戦術を遅らせるだけです。

エニグマのソリューションをキーとして使用するというあなたのアイデアはかなり興味深いですが、直接提供されたキーを使用することは簡単に力ずくで行われる可能性があります。代わりに、ユーザー入力をパスワードとして扱い、最先端のパスワードハッシュ方式を使用します。生成されるハッシュがキーです。

ただし、その場合でも、キーがゲームに存在しないという想定には誤りがあります。そうでなければ、プレイヤーをそれに向けることはできません。したがって、金庫を力ずくで強制しようとするのではなく、手がかりを探してゲームアセットをリバースエンジニアリングすることができます。私が考えることができる1つの潜在的なパズルは、グリフをエンコードするためにテクスチャを使用することです。そして、パスワードは、プレーヤーが訪れたはずの場所で(順番に)明らかになったように、キーボードで利用可能ないくつかから構成されます。

  • 問題の核心は、画像認識がまだコンピュータにとってやや難しいということです
  • その上に、CAPTCHAクラッカーがカスタムグリフではなく文字と数字用に調整されているという事実を重ねます
  • その上に、プレーヤーにグリフを表示するために複数のテクスチャー(透明度付き)を組み合わせることで、ゲーム内のどのアセットにもグリフの外観が含まれていないという事実を重ねます
  • あらゆる場所で他のテクスチャー(フラグメント付き)を使用しますが、プレーヤーが到達できないはずの隠された場所を除いて、完全なグリフを生成するような方法では決して使用しない

そして、優勝したグリフの組み合わせを自動的に抽出するプログラムは、1日で地獄になります。


第三に、次の問題は共有です。秘密のthe解が見つかると、それが明らかにされます。理想的には、各個人に少しずつ異なるバージョンのソフトウェアを渡す必要があります。キーはゲームのバージョンに固有のものです。実用的にするために、ゲームとそのアセットを「シークレット」(暗号化)と「シークレットドライバー」(キージェネレーター)から分離する方が簡単だと思います。 、そのうちのいくつかはパスワードを形成します)。

明らかな攻撃の方法は、ジェネレーターをだまして常に同じパスワードを選択させるか、検証者が常に同じパスワードを受け入れるようにだまします(たとえば、誰かの秘密ファイルをダウンロードすることによって)。

ここで、潜在的な解決策は、ファイルをユーザーのアカウントにリンクし、通常推奨されるようにパスワードをソルトすることです。

  • ユーザーが一連のファイルを要求するとき、無作為にソルトとシークレットと同じ数のパスワードを生成し、シークレットアセットを作成します(たとえば、サーバーの過負荷を避けるために、このプロセスを1日1ユーザーに制限することができます)。
  • 世代のタイムスタンプとソルトをユーザーのアカウント情報に保存する
  • タイムスタンプと個人用の秘密ファイルをユーザーに送り返す

次に、ユーザーがパスワードを送信する準備ができたら:

  • ユーザーがログインしている(まだログインしていない場合)
  • ソフトウェアにタイムスタンプとグリフパスワードの両方を送信させる
  • タイムスタンプが保存されているものと異なる場合は、古くなった一連の秘密ファイルを使用していることをユーザーに通知します
  • パスワードがすでに何度も試行されている場合は、古くなった一連の秘密ファイルを使用していることをユーザーに通知します
  • それ以外の場合は、salt + passwordをハッシュしてキーを生成します
  • それ以外の場合は、キーをユーザーに送り返して、パーソナライズされたファイルを表示できるようにします
  • このアカウントでこのパスワードが試行された回数を増やす

ここでの目標は、アカウント共有をできるだけ妨げることです。

  • シークレットファイルを生成するためにアカウントを共有することは、(a)1日に1つしか生成できないため制限されており、(b)生成された最新のものが他を廃止するため役に立たない
  • アカウントを共有し、関連する秘密のファイルを配布することは役に立たない。これは、与えられたパスワードは、キーを生成しなくなるまでN回しか使用できないためです。

そして、もうすぐそこです。


最後に、クラッカーは、秘密の資産が復号化されて直接統合されたゲームの修正バージョンをリリースすることもできます(慎重な検証スキームをバイパスします)。

解決策はシンプルです(そしてほぼすべてのものが廃止されます)1):クライアントを信頼しないでください。

あなたのウェブサイトにリーダーボードを作成し、彼らのアカウントでプレイヤーの進行状況を追跡します。プレイヤーは自分が好きなようにゲームを終了したと主張することができますが、アカウントがこれを反映していない限り、だれもが不正行為をしていることを知っています...

...これは社会的圧力と呼ばれます;)

1 プログラムがキーを推測することを防ぎ、ユーザーがキーを取得できるようにするために使用したテクスチャポジショニングファイルを除く。

1
Matthieu M.

それは興味深いアイデアです。パズルディスクの変種と手動で入力したコピー防止システム。一部の「ARG」ゲームはこのように機能し、プレイヤーがゲームデザイナーに対して集団的に行動していることがある程度理解されていると思います。

明らかに、最初の人がそれを解読すると、インターネット上で公開されます。

生成コンテンツや手続き型コンテンツも同じように機能します。「シード」を共有しない限り、他のプレーヤーと同じ世界を見ることはできません。

AppleはApp Storeから拒否する可能性があり、ゲームコンソールで承認を受けるためのソリューションを提供する必要があるかもしれませんが、私はそれに関する法的な問題を確認できません。

0
pjc50

追加のセキュリティ対策を検討するのは楽しいですが、それはconcreteの値を製品に追加しません。製品に遭遇したクラッカーの巧妙さを示しています。原則として、あなたの拮抗薬はあなたに追いつきます。

創造性に富んだ開発者とは対照的に、クラッカーは分析的な人々であり、プログラムを直感的に利用できます。開発者が過度のセキュリティ対策を講じる傾向がある場合、彼らは否定します–クラッカーが彼らの保護スキームを逆にすることができる再び

このバックグラウンドコンペティションに参加したいかどうかは、あなた次第です。ただし、それが最終製品の邪魔にならないようにしてください。ゲームをスラッグに変える風変わりな暗号化スキームは役に立ちません。

0
Avenicci

メイソン・ウィーラーはそれを正しく持っています:あなたはそれをすることができません。誰かが望むならいつでも誰かがあなたのゲームをリバースエンジニアリングすることができます。

とにかく、あなたが説明する方法でゲームを「保護」する必要はありません。一人がイースターエッグを見つけるとすぐに、秘密は袋から出ています。ゲームの各コピーに異なるイースターエッグがある場合、ハッカーのコピーのみが知られます。 1000人のうち1人のハッカーがゲームプレイを行わずにイースターエッグを見つけたことを本当に気にしますか?

著作権法は、深刻な訴訟を起こす危険なしに誰もあなたのゲームからお金を稼ぐことができないようなものなので、著作権はあなたを保護します。

ランダムなユーザーが自分のテクスチャをフォーラムのアバターに置いている限り、どうでしょうか。草の根の広告だと考えてください。

ものを「保護する」ことにこだわることは、ゲームを作るのような難しい現実からあなたをそらすだけです。

製品のない人々が存在しないものに対するIP保護スキームについて話しているのを見ると、プロジェクト全体で大きなでたらめな赤旗が発生するので、それは私にとって一種の散歩的な瞬間です。

0
Tyler Durden