Binary Formatで.dat
暗号化されたファイルを取得する単純なプログラムを作成し、それをバイト配列に復号化すると、すべてが復号化されたファイルに再書き込みされます。
例えば:
バイナリ暗号化アルゴリズムを作成しました。=> 0100100001100101001000000110100001100101011000 ...
しかし、これは非常に簡単に解読できます...
保存の進行状況を暗号化するために、何らかのキーを必要としない方法がありますか?
Binary Formatで.dat
暗号化されたファイルを取得する単純なプログラムを作成し、それをバイト配列に復号化すると、すべてが復号化されたファイルに再書き込みされます。
例えば:
バイナリ暗号化アルゴリズムを作成しました。=> 0100100001100101001000000110100001100101011000 ...
しかし、これは非常に簡単に解読できます...
保存の進行状況を暗号化するために、何らかのキーを必要としない方法がありますか?
回答:
一般に、数学とコンピューターサイエンスの両方で少なくとも博士号を取得していない限り、独自の暗号化アルゴリズムを発明することはできません。しかし、既知の攻撃がなく、多くのプログラミング言語で無料で実装されている優れたストックアルゴリズムが多数あります。たとえば、RC5、AESまたはBlowfish。ゲームの開発に使用するテクノロジーによっては、すぐに使用できる安全な暗号化を提供する場合もあります。
ただし、savegamesを暗号化することをお勧めします。
まず、ゲームの実行可能ファイルで暗号化と復号化を行う場合、ゲームの実行可能ファイルにアルゴリズムとキーの両方を含める必要があります。つまり、決意のあるハッカーはそれらを見つけて抽出し、それらを使用してセーブゲームエディタを構築できます。そのため、100%安全になることはありません。
第二に、なぜあなたはとにかくこれをしたいのですか?オンラインゲームの場合、プレイヤーが変更できないゲーム状態をオンラインで保存する必要があります。オフラインゲームの場合、なぜ面倒なのですか?不正行為者は、最悪の場合でも自分のゲーム体験を傷つけることができます。意図したとおりにゲームを楽しみたい正直なプレイヤーは、この影響を受けません。一方、プレイヤーにチートを許可すると、ゲームに価値を加えることができます。プレイヤーはゲームをさまざまな方法で体験でき、ゲームの長期的な楽しみを増やすことができます。
ローカルで暗号化および復号化するには、プログラムにキーを保存する必要があります。コードを逆アセンブルすると、暗号化を解読できます。キーを難読化するためのトリックがありますが、それでも専用の攻撃者がキーを見つけて、それほど熱心ではないすべての人のためにオンラインで公開します。暗号化によって防止されるのは、16進エディタを使用する人だけです-圧縮や、解凍プログラムでファイルを読み取れないようにするものであれば、簡単にそれを阻止できます。たとえば、データの前に1バイトを追加します。
または、ファイルの最後にsavefileのmd5を追加して、ファイルが改ざんされているかどうかを確認できます。その後、これを使用して、savegameのロードを拒否するか、サポートチケットに適切にフラグを立てて、手動で変更されたsavegameによって引き起こされる問題に時間を無駄にしないようにします。繰り返しますが、これはあなたのコードを読むことができる人なら誰でも回避するのは簡単です。
デバイス上のバイナリにアクセスできる人が回避できないものが必要な場合は、管理下にあるサーバー上でプログラムの一部を実行する必要があります。
最後の質問に答えるために、キーと暗号化のタイプは、暗号化/復号化に適用する必要がある正確なアルゴリズムを識別するだけです。方法を定義するアルゴリズムがなければ、データを暗号化/復号化することはできません。
実際の保存データの変換されたSHA256ハッシュを保存ファイルに保存します。
格納されたハッシュを、ロード時にデータのSHA256値と比較します。
それが一致しない場合、ファイルをごまかしたか破損しています。
編集して明確にする:これにより、アンチチートシステムをクラックすることはより困難になりますが、それでも可能です。
私は標準の暗号化アルゴリズムを使用します(保存されたファイルの暗号分析を実行するのが難しくなるため)が、最もよく使用される上位5つのアルゴリズムの1つではなく、コード全体で非表示にします(どのアルゴリズムを理解するのが難しくなるため)キーはどこにあります。)
暗号化アルゴリズムをコードに隠すには:オープンソースバージョンを取得し、そのフロー(どの関数が他のどの関数をどの順序で呼び出すか)を理解してから、すべての変数、構造体フィールド、関数名を(確実に)改名し、関数を広げますコードベース全体で、さまざまなオブジェクトとモジュールで、おそらく実行も一時的に分離します(暗号化の一部を実行してから別のことを行い、一見無関係なコードの一部から数ミリ秒後に戻って別のフェーズを実行します)暗号化アルゴリズムのさまざまな隠された部分によって実行時にアクセスされる、クラス全体で一見無関係な多数の定数として、キーは同じ方法で隠されます。
これがすべて経済的に意味があるかどうかは、まったく別のトピックです。