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 回答