以正确的方式将熵源添加到随机数生成器

时间:2014-01-13 14:57:49

标签: c random generator entropy polarssl

我的任务是为嵌入式系统制作随机数生成器。截至目前,我使用的熵源是键盘输入,以及其他变量,如信号强度和电池强度。

我一直在使用PolarSSL,它有一个用于嵌入式系统的惊人的可移植SSL库。但是,除了文档之外,互联网上关于它的内容很少!

我认为不是以正确的方式将熵源添加到我的熵累加器中。这会导致CTR-DRBG module出现问题,这会在Init上返回错误。 (Source Error -52) 由于RNG用于嵌入式系统,因此系统没有初始熵,因此存在错误。 (LINK)当我在其他标准操作系统(如Windows)上尝试使用相同的RNG时,我没有错误。以下是与之相关的一些代码。

    // Global Variables.
ctr_drbg_context ctx;
entropy_context etx;

// Inside Main
entropy_init( &etx );
// Add entropy sources

// Initializing CTR_DRBG
printf("Before ctrdrbg: %d", err);
err = ctr_drbg_init( &ctx, entropy_func, &etx,  (const unsigned char *) "RANDOM_GEN", 10 );
if( err != 0 )
{
   printf("Failed in ctr_drbg init!: %d", err);
} 

输出: Error on Ctr_drbg init: -52

我已经对此持续了大约一个星期而现在没有进展。几乎放弃!!有人愿意帮忙吗?

1 个答案:

答案 0 :(得分:3)

首先是事实答案:

它在Windows上运行的主要原因是它可以使用多个特定于操作系统的熵源来生成足够的'随机的。

CTR-DRBG请求的熵数为48个字节(基于默认配置)。

为了使熵池能够提供这48个字节,它将对每个熵源进行最多256次轮询(ENTROPY_MAX_LOOP)并将其全部放入累加器中。它希望所有来源至少提供其阈值!如果没有,因为它不会在连续调用中返回更多数据,它将以现在的方式失败( POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED )。

所以你需要提供更好的'熵源或将阈值定义为特定来源的更合适的值(对于某些来源,如果不能期望源始终提供熵数据,则 0 )。

然后安全回答:

熵池需要真正的熵才有用。电池表不是真正安全的(因为它是可预测的(如果通电则总是100)并且通常在可预测的范围内。如果正确使用键盘输入可能是有价值的。但是你需要更多......在其芯片组中未提供硬件RNG的系统的最佳方法是使用在更安全的系统上生成的种子文件,并在启动和关闭时读取并更新它。您可以使用这个种子文件作为熵源,直接在ctr_drbg中提供它。在你的情况下,我希望你只有非常低的阈值源(有时 0 )并从种子文件中获取主熵

修改:我会更好地Knowledge Base article on adding entropy sources以更好地涵盖这种情况!