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



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

我一直在使用PolarSSL,它为嵌入式系统提供了一个令人惊叹的便携式SSL库。然而,除了文档之外,互联网上几乎没有关于它的内容!

我认为没有以正确的方式将熵源添加到我的熵累加器中。这导致CTR-DRBG模块出现故障,该模块在初始化时返回错误。(源错误-52)由于RNG是针对嵌入式系统的,因此系统没有初始熵,因此产生了误差。(链接)当我在其他标准操作系统(如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

我已经研究了大约一个星期了,但没有取得任何进展。差点放弃!!有人愿意帮忙吗?

第一个事实答案:

它在Windows上工作的主要原因是它可以使用多个特定于操作系统的熵源,这些熵源可以产生"足够"的随机性。

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

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

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

然后安全答案:

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

编辑:我将加强我们关于添加熵源的知识库文章,以更好地报道这种情况!

最新更新