使用引擎进行随机数生成

时间:2015-03-19 16:56:55

标签: c random openssl prng

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

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

1 个答案:

答案 0 :(得分:1)

  

是否有推荐的方法在OpenSSL中生成随机字节并添加熵?

是。请参阅Random Numbers上的OpenSSL wiki。它将引导您为种子添加熵,并提取字节以用于键控和其他秘密材料。

Random Numbers and Seeds涵盖了为播种添加熵。 Random Numbers and Generation涵盖了用于键控和其他秘密材料的字节提取。

  

我在哪里可以获得其他引擎实现,以及如何交换它们?

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结合起来(XOR)。 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();
  

...我正在尝试使用OpenSSL的RAND_bytes API ...

除了正常使用RAND_bytesRAND_add和朋友之外,您永远不会做任何其他事情。您如何使用RAND_bytesRAND_add和朋友永远不会更改。

  

Mersenne Twister很受欢迎,你甚至可以为它编写引擎......

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

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