2014-01-13 27 views
4

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

我一直在使用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

我敢肯定这是一个愚蠢的问题,但你有没有检查过CPU没有硬件RNG内置它?许多ARM9都可以,有些可能不会。你能告诉我们关于处理器的更多信息吗?我看不到一个明显的数据表。 – Tom

+0

@Tom不,它根本不傻!我希望它内置了一个硬件RNG。但是,我从供应商处获得的所有文档都与Randomness无关。我可以直接与他们联系,但这不太可能! – Timmay

回答

3

首先fa实际答案:

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

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

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

所以,你需要提供“更好”熵源或定义的阈值的具体来源(一些消息来源这可能是如果源不能期望总是传递熵数据)更适当的值。

然后安全答案:

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

编辑:。我会加强我们的Knowledge Base article on adding entropy sources能够更好地覆盖这种情况!

+0

非常感谢您深思熟虑的答案。看来我必须将阈值设置为零来添加其他熵源。 确实,电池强度并不是熵的好来源,但这是一个POS终端,并没有那么多的来源。我迄今为止唯一接近良好熵的是键盘输入。 我想我将不得不使用种子文件。非常感谢您的建议! – Timmay

+2

你会认为一个POS终端,基本上用于做安全交易,将配备密码强的随机性...... – Tom

+0

@Tom我希望如此,但我的经验是,情况往往不是这样: ( – Paul