使用随机整数混合std :: time

时间:2015-01-15 23:24:15

标签: c++ cryptography xor

我们使用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 );

增加混合时间会削弱它吗?

2 个答案:

答案 0 :(得分:2)

我不相信这会伤害任何事情。如果r1r2r3仍然未知/完全随机,r4也将保持完全随机。

我们假设:

  • r1 = 390866135;
  • r2 = 879333620;
  • r3 = 986588813;
  • currentTime = 1421364812;

现在,如果我们对这些变量进行异或运行:

  • r1 ^ r2 = 589673507
  • 589673507 ^ r3 = 434868910
  • 434868910 ^ currentTime = 1297341666

因此最终的随机数最终为1297341666。即使您获得了当前的std::time(now),最终的随机数也将无法预测,因为您不知道r1r2r3

有关更多信息(可能是更好的解释),请查看this question from Cryptography Stack Exchange.

引用该答案的作者:

  

如果一个源保持不妥协,加上统计随机的所有比特,并且两个源保持独立,那么两个源的xor一起也可以被认为是不妥协的加上统计随机的所有比特。

答案 1 :(得分:0)

大多数操作系统都带有内置的随机源,可以从很多非常低级的源读取 - 直接从程序访问这种繁琐的东西。 Unix:dev / random或Windows:CryptGenRandom是明显的例子。

根据您希望RNG的速度和安全程度,然后通过加密哈希传递结果将平滑输入中的任何非随机性。