0

作成しているゲームエンジンで使用するゲームデータファイルを暗号化する方法を開発しています。ゲームデータファイルは秘密鍵で暗号化され、ゲームエンジンにロードされると復号化されます。

秘密鍵は、エンジンにコンパイルされるように(constとして)エンジンに手動で設定されます。ただし、その秘訣は、コードを逆アセンブルしてリバースエンジニアリングするだけでは、平均的なJoe Bloggsが(簡単に)キーを見つけられないようにすることです。

struct Example {
    u_int8_t random1;
    u_int64_t segment31;
    u_int8_t random2;
    u_int8_t random3;
    u_int64_t segment3;
    u_int64_t segment14;
    // Etc
};

私の考えは、ランダムに生成されたバイトと一緒に混乱しているセグメントにキーを格納することです。私の質問はこれです:

C ++マクロでランダムに数値を生成する方法はありますか?数値はコンパイル時にランダムに生成される必要があるため(または、ランダムな値がそれぞれユーザーが選択したランダムな値に設定される)、ランタイム関数は適切ではありません。

これを行うためのより良い方法があれば、私はどんな提案も受け入れますが、ゲームデータファイルを秘密鍵と公開鍵のペアで暗号化し、公開鍵を可能な限り秘密にしておくことを強く望んでいます。

4

2 に答える 2

1

コンパイル時に一定の乱数を生成してプログラムに焼き付けているため、それと(自分で選択した)乱数を自分でハードコーディングすることとの違いはわかりません。マクロを使用すると、コンパイルごとに異なる乱数が得られると思います。それは本当に重要ですか?

もっと簡単なことをお勧めします: キーが単なる ASCII テキスト (ビットはビットですよね?) である場合、無害に見える診断文字列をキーとして使用でき、誰もそれに気付かないでしょう。

それでも、あいまいさによるセキュリティは、一般的に、この分野の専門家からは眉をひそめられます (彼らはよく眉をひそめます)。公開鍵暗号化を実際に行っている場合は、公開鍵を公開してもまったく問題ありません。結局のところ、それがポイントです。秘密にしておく必要があるのは秘密鍵です。

本当にこれを行いたい場合は、乱数生成アルゴリズムを見て、その反復を (大きな) マクロに展開します。このマクロは、本質的にシードを取り、その結果として疑似乱数整数を生成する大きな式に評価されます。 . それはそれを行う必要があります。シードがコンパイル時のような予測できないものから何らかの形で派生した場合 ( __TIME__)、うまくいく可能性があります。

于 2012-05-06T05:01:34.917 に答える
0

現在、rand マクロまたはテンプレート メタ関数はありませんが、作成することはできます...多くの努力が必要です。

一方、ビルド プロセスの一部として /dev/random やその他のランダム ソースに触れて、結果を含むヘッダーを作成することもできます。乱数定数を取得するこのヘッダーを含めます。

于 2012-05-06T04:51:23.963 に答える