我正在尝试使用 RAND_bytes OpenSSL 的 API,但我想尝试使用各种随机数生成引擎。
在 OpenSSL 中是否有推荐的生成随机字节和添加熵的方法?我在哪里可以获得其他 Engine 实现,以及如何交换它们?
最佳答案
Is there a recommended way of generating Random bytes and adding entropy in OpenSSL?
是的。请参阅 Random Numbers 上的 OpenSSL wiki。 .它会带您完成为种子添加熵,并提取字节以用于 key 和其他 secret Material 。
为播种添加熵在 Random Numbers and Seeds 中介绍. Random Numbers and Generation 中介绍了提取字节以用于 key 和其他 secret Material 。 .
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
找到它的源代码。 .另一个是Intel的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_bytes
,你什么都不做, RAND_add
和 friend 一样正常。您如何使用 RAND_bytes
, RAND_add
和 friend 永远不会改变。
The Mersenne Twister is popular, and you could even write an engine for it, too...
如果您这样做,那么您可能会考虑发布源代码供其他人使用。我建议在 OpenSSL 的 wiki 上创建一个页面,解释 Mersenne Twister 引擎,解释如何使用它,并为其提供补丁。
另一种选择是将其提交给RT system。 (错误跟踪器)作为功能/增强。但据我观察,大多数事物一旦进入 RT 就会枯萎和死亡。
关于c - 使用引擎生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150585/