我的任务是为一个嵌入式系统制作一个随机数发生器。到目前为止,使用的熵源是键盘输入和其他变量,如信号强度和电池强度。
我一直在使用PolarSSL它有一个用于嵌入式系统的惊人的可移植ssl库。然而,除了文档,互联网上几乎没有关于它的内容!
我认为没有用正确的方法把熵源添加到我的熵累加器中。这会给CTR-DRBG module带来麻烦,它在初始化时返回一个错误。(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
我已经仔细研究了大约一个星期,现在没有进展。快放弃了!!有人愿意帮忙吗?
最佳答案
首先是事实答案:
它在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以更好地覆盖这种情况!