C++ 比时间更好的种子(0)?

C++ 比时间更好的种子(0)?,c++,boost,random,C++,Boost,Random,我知道时间(0)通常用于播种随机数生成器,只有当程序每秒运行一次以上时,时间才会成为问题。我想知道什么是更好的种子时,要考虑产生随机数。我阅读了有关Windows上的GetTickCount、timeGetTime和QueryPerformanceCounter的信息。这些是否足以满足几乎所有操作,或者是否有更好的播种选项 下面是一个使用boost库的快速代码示例: #include <iostream> #include <boost/random.hpp> using

我知道时间(0)通常用于播种随机数生成器,只有当程序每秒运行一次以上时,时间才会成为问题。我想知道什么是更好的种子时,要考虑产生随机数。我阅读了有关Windows上的GetTickCount、timeGetTime和QueryPerformanceCounter的信息。这些是否足以满足几乎所有操作,或者是否有更好的播种选项

下面是一个使用boost库的快速代码示例:

#include <iostream>
#include <boost/random.hpp>
using namespace std;
using namespace boost;

int main()
{
    mt19937 randGen(42);
    uniform_int<> range(0,100);
    variate_generator<mt19937&, uniform_int<> > GetRand(randGen, range);

    for (int i = 0; i < 30; ++i)
        cout << GetRand() << endl;
}
#包括
#包括
使用名称空间std;
使用名称空间boost;
int main()
{
mt19937兰登(42);
统一整数范围(0100);
变量发生器GetRand(randGen,量程);
对于(int i=0;i<30;++i)

cout一些早期的Netscape安全黑客主要是知道加密数据包何时被发送,并利用这些知识缩小种子的可能范围。因此,获取滴答数或其他甚至是远程确定性的东西并不是你的最佳选择

即使使用一个种子,“随机”数的序列也是基于该种子确定的。内华达州博彩委员会的一名调查员意识到了这一点,他本应检查某些插槽,并利用这些知识在被抓住之前赚了不少钱

如果你需要世界级的随机性,你可以在你的系统中添加硬件来提供一个高度随机的数字。著名的扑克网站就是这样做的(至少他们是这么说的)

除此之外,还可以将系统中的许多因素结合起来,这些因素都是独立而快速地变化的,并且尽可能少地具有可预测性,以创建一个非常好的种子。由于Guid基于许多确定性因素,包括时间,因此这并不是种子的良好基础:

WinAPI GUID的密码分析 生成器显示,由于 V4 guid的序列是伪随机的, 给定初始状态,可以 预测未来25万个guid 由函数返回 UuidCreate[2]。这就是为什么要创建GUI 不应该用在密码学中, e、 例如,作为随机键


来源:

在unix系统上,您可以从/dev/random中提取几个字节作为RNG的种子。/dev/random应该是非常好的随机,使用PC上可用的不同熵源。当然,这完全取决于实现


这可能对加密应用程序有用的一种情况是,因为时间(0)相对容易猜测。

您将需要另一种/第二种熵源。根据您要使用的熵的大小,您可以计算以下任何输入的哈希值,并将其用作最终生成器的种子:

  • 在堆栈上声明未初始化的随机大小字符数组
  • 分配随机字节的内存
  • 要求用户移动鼠标
  • 要求用户将随机CD放入CD驱动器中,并从第一首曲目的随机位置读取随机字节
  • 打开用户的麦克风或摄像头,收集输入的随机秒数,计算散列并种子
  • Windows:用于获取加密随机字节的缓冲区
  • Unix:如其他人所述,请阅读
    /dev/random

在unix上尝试从/dev/random读取数据。从该设备读取数据的速度很慢,因此不要太频繁,例如只设置初始种子。随机设备从硬件生成的熵(设备的环境噪声)获取数据在给定的时间段内,并没有无限量的可用信息。如果熵用完,SSL库可能会失败。熵会在一段时间后重新填充(实际上是一个熵池)。还有urandom afaik,它更经济,但随机性更低,在低熵条件下不会阻塞。

使用tickCout()或者任何高频率的东西都是个坏主意。 这是因为couter循环回零的速度非常快,因此提供了具有相同种子的可能性

time(NULL):   Repeats every 64 years.  
tickCouter()  Repeats every X days.
你可以尝试从大自然中获得一些随机值。

Lightining在最后一秒袭击了全世界(令人震惊的是,这是在线的)?(你可能需要做研究,看看这是否是可变的)。

评论太长了,但是关于在线扑克早期32位种子的有趣故事

混合算法中的洗牌算法 ASF软件总是以 订购一副牌,然后 生成一个随机数序列 用于重新排列甲板。在真实的 一副牌,有52张!(~2^226) 可能是唯一的洗牌。记得吗 32位随机数的种子 生成器必须是32位数字, 也就是说,只有超过4个 十亿颗可能的种子。自从甲板上 已重新初始化,并且生成器 每次洗牌前重新设定种子,仅4个 可能导致10亿次洗牌 从这个算法。4B可能 洗牌次数惊人地少于52

RST开发了一个工具来利用这一点 该漏洞需要来自的五张卡 甲板是已知的。基于 五张已知的卡片,程序搜索 通过几十万 可能的洗牌和推断 一个是完美的匹配。在 德州扑克,这意味着 程序将这两张卡作为输入 作弊者被判有罪, 加上前三张社区卡 面对面的(失败)。 这五张卡片是在 四轮投注中的第一轮,以及 足以确定(实时, 在游戏中)确切的洗牌


有一个web服务,提供免费和付费的由大气噪声产生的“真实”随机比特:


Wired发表了一篇关于两个人的文章,他们基本上利用网络摄像头CCD芯片产生的噪音来生成随机数:

您可以在程序退出时存储随机种子,并在启动时加载,因此您需要在时间(0)o时初始化RNG