使用引擎进行随机数生成

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

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

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

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

随机数和种子涵盖了为播种添加熵。 随机数和生成包含用于键控和其他秘密材料的提取字节。


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

OpenSSL附带了一些与随机数相关的引擎。 默认值是基于软件的PRNG引擎md_rand 。 您可以在/crypto/rand/md_rand.c找到它的源代码。 另一个是英特尔的RDRAND引擎。 您可以在/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_bytes ,你永远不会做任何其他事情。 你如何使用RAND_bytesRAND_add和朋友永远不会改变。


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

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

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