使用引擎生成随机数

Using engines for random number generation

我正在尝试使用 OpenSSL 的 RAND_bytes API,但我想尝试使用各种随机数生成引擎。

是否有推荐的在 OpenSSL 中生成随机字节并添加熵的方法?我在哪里可以获得其他 Engine 实现,以及如何交换它们?

Is there a recommended way of generating Random bytes and adding entropy in OpenSSL?

是的。请参阅 Random Numbers 上的 OpenSSL wiki。它带您完成为种子添加熵,并提取字节以用于密钥和其他秘密 material。

为播种添加熵在 Random Numbers and Seeds. Extracting bytes for use in keysing and other secret material is covered at Random Numbers and Generation 中介绍。


Where can I get other Engine implementations, and how can I swap them in?

OpenSSL 附带了一些与随机数相关的引擎。默认是基于软件的 PRNG 引擎,md_rand。您可以在 <openssl src>/crypto/rand/md_rand.c 找到它的源代码。另一个是英特尔的 RDRAND 引擎。您可以在 <openssl src>/crypto/engine/eng_rdrand.c.

找到来源

如果您有硬件,也可以使用基于硬件的 RNG。您甚至可以编写自己的引擎来提供 SHA-512 HMAC。或者甚至是将 SHA-512 HMAC 与 RDRAND 组合(异或)的一个。 Mersenne Twister 很受欢迎,您甚至可以为它编写引擎。

以下是交换引擎以用于随机数的方法。它取自 OpenSSL wiki,并交换了英特尔 RDRAND 引擎:

 1    unsigned long err = 0;
 2    int rc = 0;
 3
 4    OPENSSL_cpuid_setup();
 5    ENGINE_load_rdrand();
 6
 7    ENGINE* eng = ENGINE_by_id("rdrand");
 8    err = ERR_get_error();
 9
10    if(NULL == eng) {
11        fprintf(stderr, "ENGINE_load_rdrand failed, err = 0x%lx\n", err);
12        abort(); /* failed */
13    }
14
15    rc = ENGINE_init(eng);
16    err = ERR_get_error();
17
18    if(0 == rc) {
19        fprintf(stderr, "ENGINE_init failed, err = 0x%lx\n", err);
20        abort(); /* failed */
21    }
22  
23    rc = ENGINE_set_default(eng, ENGINE_METHOD_RAND);
24    err = ERR_get_error();
25
26    if(0 == rc) {
27        fprintf(stderr, "ENGINE_set_default failed, err = 0x%lx\n", err);
28        abort(); /* failed */
29    }
30
31    /* OK to proceed */
32
33    ...
34    ENGINE_finish(eng);
35    ENGINE_free(eng);
36    ENGINE_cleanup();

... I am trying to use the RAND_bytes API of OpenSSL ...

除了像往常一样使用 RAND_bytesRAND_add 和朋友之外,您什么都不做。您使用 RAND_bytesRAND_add 和朋友的方式永远不会改变。


The Mersenne Twister is popular, and you could even write an engine for it, too...

如果你这样做,那么你可以考虑发布源代码供其他人使用。我建议在 OpenSSL 的 wiki 上创建一个页面,解释 Mersenne Twister 引擎,解释如何使用它,并为其提供补丁。

另一种选择是将其作为 feature/enhancement 提交给 RT system(错误跟踪器)。但据我观察,大多数事物一旦进入 RT 就会枯萎死亡。