C语言 在嵌入式系统中寻找熵的来源?



对于小型嵌入式设备(TI MSP430F2274(,我正在尝试创建一个伪随机数生成器(PRNG(,但我很难确定用作种子的潜在熵源。不幸的是,该设备没有足够的可用内存空间来包含time.h并合并功能srand(time(0))。是否有人有过使用这个系列设备的经验,或者是否在受其内存空间限制的嵌入式设备中加入了 PRNG?谢谢。

您的部件 (MSP430F2274( 不提供任何通用解决方案或支持,但您的应用程序可能会这样做。 可以使用任何保证在您需要之前或确切时间发生或可用的不可预测和异步外部事件或值。

例如,该器件具有一对 16 位定时器,其中一个定时器运行,在检测到某些异步触发事件(例如用户按下按钮(时,当时时钟计数器的值可用作种子。

或者,如果您有一个具有连续变化和异步信号的模拟输入,只需随时读取该值,并可能读取间隔在适当时间间隔内的多个样本,以便在必要时生成更大的种子。

即使没有特定信号,否则未使用的ADC输入通道也可能具有足够的噪声,使其最低有效位不可预测 - 您可以连接来自多个独立样本的LSB,以生成种子或所需长度。

基本上,应用程序已经支持的任何不可预测的外部事件都可能就足够了。 如果没有您的应用细节,就不可能提供具体建议,但鉴于这是一个特定的混合信号微控制器,可能会有一些合适的外部不可预测性?

如果你有多个时钟源(MSP430F2274似乎一目了然(,如果你绝对没有更好的东西,你可以使用这些源之间的不可预测的漂移来计算熵。

方法是使用两个源,一个作为时基,测量另一个在一段时间内的即时报价。由于两个时钟源是独立的,因此即时报价的计数将略有不同。根据定时器可用的选项,这可以由定时器完成,否则甚至看门狗也可以是一个选项,配置为间隔定时器(如果没有别的,它通常能够在与主时钟不同的时钟源上运行(。

这种方法可能需要一些时间来设置(因为时钟不会偏离其指定的频率很多,因此您需要等待相对较长的时间才能在它们之间收集有意义的随机偏差量,一秒钟左右可能就足够了(。

否则,正如克利福德所提到的,你可以从你的环境中收集熵,如果你有这样的环境,这绝对是优越的。这其中唯一的好处(时钟源之间的漂移(是这很可能适用于几乎任何设置。

顺便说一句,你不能做srand(time(0)),只是从你期望time()在微控制器上获得自纪元以来的秒数? :)

相关内容

最新更新