在使用 OpenSSL 的 EVP_PKEY_keygen 之前,我是否需要为任何随机数生成器设置种子?

Do I need to seed any random number generator before using EVP_PKEY_keygen of OpenSSL?

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

Since these functions use random numbers you should ensure that the random number generator is appropriately seeded

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

我也搜索过,到处都没有提到使用 EVP 函数时播种。

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

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

but nowhere on https://www.openssl.org/docs/crypto/EVP_PKEY_keygen.html it makes any mention of seeding a random number generator....

请参阅 OpenSSL 维基页面 Random Numbers。它会带您详细了解它。


... no mention is made of seeding when the EVP functions are used

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


May I assume that the seeding is done internally for me in the higher-level EVP functions?

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

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

使用 EVP 接口时,seeding/auto-seeding 生成器没有什么特别之处。无论你做什么都适用。


If I do need to do it then which functions must I have a look at?

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)。