【问题标题】:Random Numbers in C++ Macros [duplicate]C ++宏中的随机数[重复]
【发布时间】:2012-05-15 03:22:01
【问题描述】:

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

私钥将在引擎中手动设置(作为常量),以便将其编译到引擎中。然而,诀窍是在其中混淆它,这样普通的 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++ 宏中随机生成一个数字?该数字必须在编译时随机生成(或者随机值每个设置为用户选择的随机值),因此任何运行时函数都不好。

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

【问题讨论】:

标签: c++ random macros obfuscation


【解决方案1】:

由于您在编译时生成一个常量随机数,该随机数将融入您的程序,我看不出这与您自己将随机数(您自己选择的)硬编码到其中之间没有区别。我想使用宏,每次编译都会得到不同的随机数。真的那么重要吗?

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

不过,该领域的专家通常不赞成默默无闻的安全性(他们经常皱眉头)。如果你真的在做公钥加密,那么公开公钥是完全可以的。毕竟这才是重点。这是必须保密的私钥。

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

【讨论】:

  • 隐藏密钥是必要的。危险不在于有人可能会知道私钥,而是他们可能会用他们选择的一个替换公钥,匹配他们控制下的不同私钥。
  • 之所以不想暴露公钥是因为它可以用来解密游戏数据文件。私钥与文件和引擎分开保存,因此没有人可以伪造游戏数据文件。另外,防止制造的另一半就是@BenVoigt 刚才所说的。
  • 但是使用__TIME__ 的想法听起来像是一个完美的解决方案,再加上随机算法。谢谢!
  • 我会重新考虑您对让人们创建游戏数据文件的反感。 DOOM 和 DOOM II 成功的一个重要因素是人们可以制作自己的 .wad 文件。他们让比赛保持新鲜。更好的是,提供像 Little Big Planet 这样的编辑器。当然,如果你有其他原因,那就加密掉。 :)
  • @BenVoigt:如果你的安全系统依赖于玩家的客户端发送诚实的消息,我会更担心人们对你程序的通信协议进行逆向工程,而不是对你程序的规则文件格式和加载机制进行逆向工程。跨度>
【解决方案2】:

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

另一方面,您可以简单地触摸 /dev/random 作为构建过程的一部分,或其他一些随机源,然后创建一个带有结果的标题。在您获得随机数常量的位置包含此标头。

【讨论】:

  • 好建议,但在 Windows 上是否有等效的建议?也只是简单地做#include“/dev/random”有什么好处,或者不能像那样指定路径?
猜你喜欢
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2011-10-23
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2011-09-03
相关资源
最近更新 更多