2012-05-06 87 views
0

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

私钥将在发动机手动设置(作为常数),使得其被编译到发动机中。然而,这个技巧是在那里混淆它,这样你的普通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文本(比特位,对吧?),你可以使用一个inocuous前瞻性诊断字符串作为你的钥匙,没有人会注意到它。

尽管如此,通过隐藏的安全通常是由在该领域(他们做了很多皱眉)专家皱起了眉头。如果你真的在做公共密钥加密,公开密钥是完全没问题的。毕竟,这是关键。这是必须保密的私钥。

如果你真的想这样做,那么我会看看一个随机数生成算法,并将它的一个迭代展开到一个基本上需要一个种子并评估为一个大型表达式的(大)宏中,该表达式产生一个伪随机整数作为其结果。这应该做到这一点。如果种子从编译时间(__TIME__)等不可预测的事情中衍生出来,它可能会起作用。

+1

隐藏密钥是必要的。危险不在于某人可能学习私钥,而是他们可能会用自己选择的一个替换公钥,并在其控制下匹配一个不同的私钥。 –

+0

我不想公开公钥的原因是因为它可以用来解密游戏数据文件。私钥与文件和引擎保持独立,这样任何人都无法制作游戏数据文件。另外,另一半是防止制造的是@BenVoigt刚才所说的。 – orangething

+0

但有关使用'__TIME__'的想法听起来像是一个完美的解决方案,加上随机性算法。谢谢! – orangething

0

目前还没有任何兰德宏或模板元函数,但它可以被创建... ...很多努力。

在另一方面,你可以简单地触摸的/ dev /随机作为构建过程的一部分,或其他一些随机源,并创建结果的标题。在你得到一个随机数字常数的地方包含这个头部。

+0

好的建议,但在Windows上有相当的?也可以简单地做#include“/ dev/random”有什么好处,或者不能像那样指定路径? – orangething