2012-05-06 9 views
0

私が作成しているゲームエンジンで使用されるゲームデータファイルを暗号化する方法を開発しています。ゲームデータファイルは秘密鍵で暗号化され、一度ゲームエンジンに読み込まれると解読されます。C++マクロの乱数

秘密鍵はエンジンに手動で設定され(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++マクロでランダムに数値を生成する方法はありますか?数値はコンパイル時にランダムに生成する必要があります(またはランダムな値をランダムに選択した値に設定する)ので、ランタイム関数はうまくいかないでしょう。

これを行うより良い方法があれば、私は提案はしていますが、ゲームデータファイルをプライベート/パブリックキーペアで暗号化し、公開キーをできるだけプライベートにしておきたいと思います。

+0

あなたがに見てとることができます:[Cプリプロセッサを使用して乱数を生成します]を[1] [1]:http://stackoverflow.com/a/17420032/653372 – nergeia

+1

_ @ orangething_あなたは自分に尋ねているのですか?まあ、私はサービスにいます。 –

答えて

1

コンパイル時に定数乱数を生成するので、プログラムに焼き込まれることになりますが、違いは見当たりません。マクロを使うと、コンパイルごとに異なる乱数を得ることができます。それは本当に非常に重要ですか?

キーが単純にASCIIテキスト(ビットはビットです)の場合は、あなたのキーとして偽の診断文字列を使用することができます。誰も気づかないでしょう。

まだ、曖昧さによるセキュリティは、一般にフィールドのエキスパートにぶち壊されています(彼らは多くの驚きをします)。実際に公開鍵の暗号化を行っている場合は、公開鍵を公開しても問題ありません。結局のポイントです。それは秘密にしなければならない秘密鍵です。

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

+1

キーを非表示にする必要があります。危険なのは、誰かが秘密鍵を習得することではなく、自分のコントロール下で別の秘密鍵と一致する公開鍵を選択したものに置き換える可能性があるということです。 –

+0

パブリックキーを公開したくない理由は、パブリックキーをゲームデータファイルの解読に使用できるからです。非公開鍵は、誰もゲームデータファイルを作成することができないように、ファイルおよびエンジンとは別に保持される。 @BenVoigtがちょうど言ったことは、製造を妨げることのもう半分でもあります。 – orangething

+0

しかし、 '__TIME__'の使用についての考え方は、完璧な解決策のように聞こえます。ありがとう! – orangething

0

現在、randマクロやテンプレートのメタ機能はありませんが、作成するには多大な労力を要します。

一方、/ dev/randomをビルドプロセスの一部または他のランダムなソースとしてタッチし、その結果のヘッダーを作成することができます。乱数定数を取得する場所にこのヘッダーを含めます。

+0

良い提案ですが、Windowsには同等の機能がありますか?また単に#include "/ dev/random"を良いものにするか、あるいはそのようなパスを指定することはできませんか? – orangething