当前位置: 首页 > 知识库问答 >
问题:

在不使用时间种子的情况下制作随机数

商天逸
2023-03-14

我希望你一切都好!我使用依赖于时间的随机数进行加密。但这使得我的加密可以被破解……我的问题是,我如何在运行随机码后制作每次都不一样的随机码,并且不使用种子时间。大多数时候我们是这样随机的:srand((无符号)时间(0));cout

共有2个答案

高寒
2023-03-14

有质量和典型用途非常不同的伪随机数发生器(PRNG)。PRNGs的典型特征是:

  • 重复周期。这是PRNG可以产生的不同数字的数量,对于良好的生成器来说,这几乎总是位宽的2次方。
  • 隐藏模式。一些坏的PRNG有隐藏模式。很明显,它们降低了随机数的质量。有测试可以用来量化这方面的质量。这种特性以及速度对于蒙特卡洛模拟这样的科学应用非常重要。
  • 加密安全。对于加密操作,需要具有非常具体用例的特殊PRNG。例如,您可以在维基百科上阅读更多关于它们的信息。

我想在这里向大家展示的是,选择正确的PRNG和选择正确的种子一样重要。事实证明,Crand()在上述所有三个类别中都表现很差(速度可能除外)。这意味着,如果您将rand()种子设定为一次,并反复调用它并打印sayrand(()%11rand()以及C标准库中大多数其他更好的随机生成器都是为科学计算而设计的,不适合用于加密目的。

如果你需要加密安全的随机数,我建议你使用一个正是为此目的而构建的库。一个广泛使用的加密库,可以跨平台使用,是OpenSSL。它包括一个名为RAND_bytes()的函数,可用于安全的随机数。如果您想使用它,请不要忘记仔细阅读手册页。您必须检查返回值是否存在错误!

丌官盛
2023-03-14

srand和/或rand根本不适合您的使用。

虽然不能100%保证,但C标准库提供了一个< code>random_device,至少可以访问真正的随机数生成硬件。它有一个名为< code>entropy()的成员,旨在给出实际可用熵的估计值——但它可以作为伪随机数生成器来实现,在这种情况下,它应该返回0。假设< code>entropy()返回非零结果,则使用< code>random_device来检索您需要的任意多的随机数据。

大多数操作系统都提供自己对随机数生成硬件的访问。在Windows上,通常使用BCryptGenRandom。在UNIXesque操作系统上,您可以从/dev/random/中读取适当的字节数(还有/dev/urandom,但它可能是非阻塞的,因此如果没有足够的熵立即可用,它可能会返回随机性较低的数据——如果你在游戏中模拟掷骰子或洗牌之类的东西,这可能很好,但可能不适合你的目的)。

 类似资料:
  • 问题内容: 我脑子里有一个大问题: 我可以使用种子数生成随机数: 但是我不明白的是那颗种子的作用。例如,有什么区别 该代码具有以下内容: 问题答案: 当您向one-arg 构造函数 提供特定的硬编码种子时,每次您运行该程序时,将生成的随机数将始终相同。当您需要可预测的随机数源时就需要这样做。 但是,当您不提供种子时,构造函数将根据为您选择一个种子。每次运行程序时,随机数都会不同,因为种子每次都会不

  • 问题内容: 这是我的代码,使用种子作为参数来生成随机数: 每次我提供种子并尝试生成100个数字时,它们都是相同的。 我怎样才能解决这个问题? 问题答案: 如果你给相同的种子,那是正常的。这是允许测试的重要功能。 选中此选项可了解伪随机生成和种子: 伪随机数发生器 伪随机数生成器(PRNG),也称为确定性随机位生成器DRBG,是一种用于生成近似于随机数属性的数字序列的算法。该序列不是真正随机的,因为

  • 事件处理程序添加到GameGui.java类的GridPane中,从第82行开始。 基本上,我试图找到您在网格窗格中拖动这个对象的任何节点的索引。通过将SetonMouseEnter应用到gridpane中的每个节点,我可以在不拖动的情况下完成这一任务,但是当我试图利用SetonMouseDragEnter时,我什么也没有得到。 有人有办法让这个工作吗? 这些是我应用于GridPane中节点的事件

  • 我对这个话题很陌生。我已经用PKCS#12数字证书签署了一份PDF文档。在Adobe Reader中,当我打开签名面板时,我可以看到“签名已启用LTV”。读了这篇文章,我无法真正理解是否需要应用时间戳。如果没有,我如何验证应用签名的时间?或者我应该添加什么样的验证信息?

  • 看一下底部,上面写着“但是,如果您明确表示道具只是组件内部控制状态的种子数据,它就不是反模式:”这正是我想要做的。 这在使用React.CreateClass时非常有效,但如果可能的话,我希望使用ES6类来实现这一点。但是当使用ES6类时,初始状态是作为类上的静态属性提供的。如果您尝试实现getInitialState(),您将得到一个错误。这意味着我没有机会在道具可用后计算它。请参见https:

  • 问题内容: 我正在使用nodejs和expressjs框架从服务器下载文件’jsonFile.json’。 我正在使用以下代码 但这会导致对整个文件内容的响应。 我期望浏览器要我将文件保存在本地磁盘中。 如何将文件保存在本地磁盘中? 问题答案: 让Express设置正确的标头,然后执行以下操作: (doc) 编辑: 由于您是通过AJAX调用进行请求的,因此您必须更改设置,因为大多数(全部?)浏览器