【问题标题】:Do I need to seed any random number generator before using EVP_PKEY_keygen of OpenSSL?在使用 OpenSSL 的 EVP_PKEY_keygen 之前,我是否需要播种任何随机数生成器?
【发布时间】:2015-04-16 18:02:31
【问题描述】:

在名为 EVP Key and Parameter Generation 的 OpenSSL Wiki 页面上声明如下:

由于这些函数使用随机数,因此您应确保随机数生成器已适当播种

但是EVP_PKEY_keygen 上没有提到播种随机数生成器。它只讨论了用于生成密钥的非 EVP 函数的低级文档页面。

我也搜索过,到处都没有提到使用 EVP 功能时的播种。

所以我的问题是;我可以假设种子是在更高级别的 EVP 函数中为我在内部完成的吗?

如果我确实需要这样做,那么我必须查看哪些功能?

【问题讨论】:

  • 您引用的页面是man 页面的一部分。我不认为我可以让他们参考维基。所以你的问题可能没有得到解决。

标签: encryption openssl public-key-encryption public-key encryption-asymmetric


【解决方案1】:

但在 https://www.openssl.org/docs/crypto/EVP_PKEY_keygen.html 上没有任何地方提到播种随机数生成器....

请参阅 OpenSSL 维基页面 Random Numbers。它将带您通过令人精疲力竭的细节。


...在使用 EVP 功能时没有提及播种

EVP 函数使用库中使用的任何生成器。它可以是md_rand 或 FIPS AES/CTR 生成器。为 EVP 函数(相对于其他函数)获取随机数并没有什么特别之处。


我可以假设种子是在更高级别的 EVP 函数中为我在内部完成的吗?

是的,如果您没有自己为生成器播种。如果您为生成器播种并且有足够的熵,那么它不会自动播种。

您应该避免让生成器自动播种。有关详细信息,请参阅 OpenSSL wiki 页面 Random Numbers

在使用 EVP 接口时,播种/自动播种生成器没有什么特别之处。你所做的一切都适用于一切。


如果我确实需要这样做,那么我必须查看哪些功能?

OpenSSL wiki 页面 Random Numbers 提供了更多详细信息,但您应该执行以下操作:

int rc = RAND_load_file("/dev/urandom", 32);
if(rc != 32) {
    /* RAND_load_file failed */
}

/* OK to proceed */

您希望避免直接调用 RAND_poll,并且希望避免自动播种(内部调用 RAND_poll)。

【讨论】:

  • 感谢您的精彩解释。可惜 Firefox 无法连接到 wiki.openssl.org,因为它被认为是不受信任的。
  • 在 Windows 操作系统上调用 RAND_load_file 会怎样?应该使用哪个文件?你知道“一百万个随机数字”吗?该文件是否适合加载?
  • @Blurry - 查看<openssl srcs>/crypto/rand/win_rand.c 中的代码,这看起来像是问题代码(我很确定它存在 Heap Walk 错误)。在这种情况下,通过 Windows 的CryptGenRandom 读取 32 个字节,并使用RAND_add 将其添加到生成器中。请参阅pseudo-random number generator 文档。
  • 酷。我会尝试一下。谢谢
  • 在我最初做 RAND 的种子并做 keygen 之后,我是否需要做 RAND_write_file 来创建另一个文件,下次我再次生成密钥时将使用 RAND_load_file 加载?
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多