c - 使用引擎生成随机数

标签 c random openssl prng

我正在尝试使用 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/

相关文章:

C - 如何在 for 循环中每次在不同的变量上迭代相同的指令

c# - 从 C 程序到 C# 的数据传输

javascript - 网页的随机背景图片

openssl - 在centos 6.3上安装openssl

python - 如何将 SwigPyObject 转换为 ctypes void*

javascript - 使用 math.random 随机排列数组

c++ - 为什么人们说使用随机数生成器时存在模偏差?

javascript - 在 PHP openssl 中加密并在 javascript CryptoJS 中解密

nginx - CentOS 安装 nginx 失败

c - 函数中的参数太少