在 OpenSSL 中是否有推荐的生成随机字节并添加熵的方法?
是的。请参阅 OpenSSL wiki随机数 https://wiki.openssl.org/index.php/Random_Numbers。它引导您为种子添加熵,并提取用于密钥和其他秘密材料的字节。
为播种添加熵包含在随机数和种子 https://wiki.openssl.org/index.php/Random_Numbers#Seeds。提取用于密钥和其他秘密材料的字节位于随机数和生成 https://wiki.openssl.org/index.php/Random_Numbers#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
。 Mersenne Twister 很受欢迎,您甚至可以为它编写一个引擎。
以下是如何更换引擎以用于随机数。它取自 OpenSSL wiki,并交换了 IntelRDRAND
engine:
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 引擎,解释如何使用它,并为其提供补丁。
另一种选择是将其提交给实时系统 https://rt.openssl.org/(错误跟踪器)作为功能/增强。但据我观察,大多数事物一旦进入 RT 就会枯萎死亡。