我正在尝试使用OpenSSL的 RAND_bytes API,但我想尝试使用各种随机数生成引擎。
是否有推荐的方法在OpenSSL中生成随机字节并添加熵?我在哪里可以获得其他Engine实现,以及如何交换它们?
答案 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_bytes
,RAND_add
和朋友之外,您永远不会做任何其他事情。您如何使用RAND_bytes
,RAND_add
和朋友永远不会更改。
Mersenne Twister很受欢迎,你甚至可以为它编写引擎......
如果您这样做,那么您可以考虑发布其他人使用的源代码。我建议在OpenSSL的wiki上创建一个页面,解释Mersenne Twister引擎,解释如何使用它,并为它提供补丁。
另一种选择是将其作为功能/增强功能提交给RT system(错误跟踪器)。但是我的观察是,大多数事情一旦进入RT就会枯萎死亡。