【问题标题】:What is the easiest way to generate a pseudo-random number in C for cryptographic purpose?为加密目的在 C 中生成伪随机数的最简单方法是什么?
【发布时间】:2014-04-12 14:14:37
【问题描述】:

我需要为学生的密码学作业生成随机数。

一开始我想用

srand(time(NULL));
int r = rand();

但我读到不应该将它用于密码学。 如果可能,我希望编写自己的伪随机数生成器。

在 C 中为加密目的生成伪随机数的最快/最简单方法是什么?

我在 Linux 上,如果答案不是跨平台的,我不介意。

【问题讨论】:

  • 从 /dev/urandom 读取
  • 这是一个技巧问题。有简单的方法,也有好的方法,但没有好的简单的方法。加密 RNG 是hard
  • 除非对您的解决方案提出了您未提及的要求,否则使用/dev/random 可能足以满足学生的家庭作业,而使用srand(time)(实际上,@987654324 @) 不是。
  • @JonathanLeffler 请把它写成答案,这样当前唯一的“答案”就不会因为不熟悉 StackOverflow 而被接受。
  • 在 Linux 上,/dev/random 主要用于种子材料,而/dev/urandom 是一个即用型 PRNG。在其他平台(例如,FreeBSD 或 OS X)上,它们是相同的(一个只是符号链接到另一个)。

标签: c random cryptography


【解决方案1】:

没有跨平台的解决方案。在 Linux 上,从/dev/urandom 读取(使用fread,或者如果您喜欢复杂性,则使用read)。从/dev/urandom 读取的字节适用于加密使用,除非来自新启动的嵌入式系统或缺少熵的服务器。

文档过于保守(源于理论上的安全概念,即攻击者拥有无限的计算能力,而不仅仅是使用世界上所有的计算机);在大多数情况下,it is perfectly fine to use /dev/urandom to generate cryptographic keys

如果您需要生成大量随机字节,您可能希望在代码中实现pseudo-random number generator,并仅使用/dev/urandom 为它添加熵。如果您只是生成几个密钥和类似的少量材料,或者如果您需要生成大量随机数但/dev/urandom 的速度不是瓶颈,或者如果这是一个学校练习并实施PRNG 不是练习的重点,那么只需阅读/dev/urandom 就可以了。

【讨论】:

    【解决方案2】:

    只有一个伪随机数生成器是不够的。你需要给它播种足够的熵来启动它。您可以通过设置通常从操作系统调用之一检索到的种子来执行此操作。您应该使用哪一个取决于您使用它的方法。如果您想要更高质量的随机数,您可以稍后混入种子。

    对于 Linux 系统:/dev/random 返回最大的熵,/dev/urandom 本身就是一个种子 PRNG,可以被应用程序直接使用。 /dev/random 但是,如果没有足够的熵可用,我会建议 /dev/urandom 用于大多数目的。从/dev/random/ 中读取过多可能会导致整个机器崩溃,因为任何请求熵的东西都可能会停止。在其他操作系统上,/dev/random/dev/urandom 都只是链接到种子 PRNG。

    对于 Windows,请查看 this article on MSDN

    【讨论】:

    • 添加了另一个答案,我读到您想编写自己的 PRNG,抱歉。删除了 Java SHA1PRNG 示例代码。其余的答案仍然有效,尽管我会推荐 OpenSSL 作为 API。
    • 由于 OpenSSL 的持续问题,我删除了我的其他帖子。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2010-10-12
    • 2010-09-23
    • 2011-01-09
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多