4

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

我一直在使用PolarSSL,它有一个用于嵌入式系统的惊人的便携式 SSL 库。但是,除了文档之外,互联网上几乎没有关于它的信息!

我认为没有以正确的方式将熵源添加到我的熵累加器中。这会导致CTR-DRBG 模块出现问题,该模块在 Init 上返回错误。(源错误-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

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

4

1 回答 1

3

首先是事实答案:

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

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

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

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

然后是安全答案:

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

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

于 2014-01-13T16:29:40.380 回答