C++宏中的随机数

Random Numbers in C++ Macros

本文关键字:随机数 C++      更新时间:2023-10-16

我正在开发一种加密游戏数据文件的方法,该方法将在我正在创建的游戏引擎中使用。游戏数据文件将使用私钥加密,并在加载到游戏引擎后解密。

私钥将在引擎中手动设置(作为 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++宏中随机生成一个数字?该数字必须在编译时随机生成(或将每个随机值设置为随机用户选择的值(,因此任何运行时函数都不好。

如果有更好的方法,我愿意接受任何建议,但我绝对希望使用私钥/公钥对加密游戏数据文件,并且公钥尽可能保密。

由于您在编译时生成一个常量随机数,该随机数将被烘焙到您的程序中,因此我认为这与简单地将随机数(您自己选择的(硬编码到其中之间没有区别。我想使用宏,每次编译都会得到一个不同的随机数。这真的那么关键吗?

我建议做一些更简单的事情:如果密钥只是ASCII文本(位就是位,对吧?(,您可以使用看起来很可疑的诊断字符串作为密钥,没有人会注意到它。

尽管如此,默默无闻的安全性通常被该领域的专家所反对(他们经常皱眉(。如果您真的在进行公钥加密,那么公开公钥是完全可以的。毕竟这是重点。私钥必须保密。

如果你真的想这样做,那么我会看看一个随机数生成算法,并将其迭代展开到一个(大(宏中,该宏本质上接受一个种子并计算为一个产生伪随机整数作为结果的大型表达式。这应该可以做到。如果种子以某种方式派生自不可预测的事情,例如编译时间(__TIME__(,它可能会起作用。

目前没有任何 rand 宏或模板元函数,但可以创建它......付出了很多努力。

另一方面,您可以简单地触摸/dev/random 作为构建过程的一部分,或者其他一些随机源,并使用结果创建一个标头。 包括此标头,您可以在其中获得随机数常量。