我们使用xor组合随机整数来播种随机数生成器。我们被要求“添加更多来源”。但是,所有好的随机源都已经在混合中,因此建议我们添加std :: time(now)。它很容易添加,但我担心的是,可以添加弱化池吗?它不是随机的,也不是均匀分布的等等。我的直觉说它不会伤害,但我并不积极。以下是代码的外观:
int r1 = random1;
int r2 = random2;
int r3 = random3;
int r4 = (r1 ^ r2) ^ r3;
如果添加时间,它可能如下所示:
int r4 = ((r1 ^ r2) ^ r3) ^ std::time( now );
增加混合时间会削弱它吗?
答案 0 :(得分:2)
我不相信这会伤害任何事情。如果r1
,r2
和r3
仍然未知/完全随机,r4
也将保持完全随机。
我们假设:
r1 = 390866135;
r2 = 879333620;
r3 = 986588813;
和currentTime = 1421364812;
现在,如果我们对这些变量进行异或运行:
r1 ^ r2 = 589673507
589673507 ^ r3 = 434868910
434868910 ^ currentTime = 1297341666
因此最终的随机数最终为1297341666
。即使您获得了当前的std::time(now)
,最终的随机数也将无法预测,因为您不知道r1
,r2
或r3
。
有关更多信息(可能是更好的解释),请查看this question from Cryptography Stack Exchange.
引用该答案的作者:
如果一个源保持不妥协,加上统计随机的所有比特,并且两个源保持独立,那么两个源的xor一起也可以被认为是不妥协的加上统计随机的所有比特。
答案 1 :(得分:0)
大多数操作系统都带有内置的随机源,可以从很多非常低级的源读取 - 直接从程序访问这种繁琐的东西。 Unix:dev / random或Windows:CryptGenRandom是明显的例子。
根据您希望RNG的速度和安全程度,然后通过加密哈希传递结果将平滑输入中的任何非随机性。