【发布时间】:2018-06-25 16:14:52
【问题描述】:
对于小型嵌入式设备 (TI MSP430F2274),我正在尝试创建一个伪随机数生成器 (PRNG),但我很难确定用作种子的潜在熵源。不幸的是,该设备没有足够的可用内存空间来包含time.h 和合并函数srand(time(0))。有没有人使用过这个系列的设备,或者在受内存空间限制的嵌入式设备中加入了 PRNG?谢谢。
【问题讨论】:
标签: c memory random embedded entropy
对于小型嵌入式设备 (TI MSP430F2274),我正在尝试创建一个伪随机数生成器 (PRNG),但我很难确定用作种子的潜在熵源。不幸的是,该设备没有足够的可用内存空间来包含time.h 和合并函数srand(time(0))。有没有人使用过这个系列的设备,或者在受内存空间限制的嵌入式设备中加入了 PRNG?谢谢。
【问题讨论】:
标签: c memory random embedded entropy
您的部件 (MSP430F2274) 不提供任何通用解决方案或支持,但您的应用程序可能会这样做。可以使用任何保证在您需要之前或恰好在您需要时发生或可用的不可预测和异步的外部事件或值。
例如,该器件有一对 16 位定时器,其中一个运行时,在检测到一些异步触发事件(例如用户按钮按下)时,当时的时钟计数器的值可以用作种子.
或者,如果您有一个具有连续变化和异步信号的模拟输入,则只需随时读取该值,并可能读取间隔在合适时间间隔内的多个样本,以在必要时生成更大的种子。
即使没有特定信号,否则未使用的 ADC 输入通道也可能具有足够的噪声,使其最低有效位不可预测 - 您可以连接多个独立样本的 LSB 以生成种子或所需长度。
您的应用程序已经支持的任何不可预测的外部事件基本上就足够了。如果没有您的应用程序的详细信息,则无法提供具体建议,但鉴于这是一款专门的混合信号微控制器,大概会有一些合适的外部不可预测性?
【讨论】:
如果您有多个时钟源(MSP430F2274 似乎一目了然),如果您绝对没有更好的选择,则可以使用这些源之间不可预测的漂移来获取熵。
这样做的方法是使用两个源,一个作为时间基准,测量另一个在一段时间内的刻度。由于两个时钟源是独立的,滴答计数会略有不同。根据定时器可用的选项,这可以由定时器完成,否则即使看门狗也可以是一个选项,配置为间隔定时器(如果没有别的,它通常能够在与主时钟不同的时钟源上运行)。
这种方法可能需要一些时间来设置(因为时钟不会偏离它们指定的频率很多,所以你需要等待相对较长的时间来收集它们之间有意义的随机偏差,一秒钟左右也许就足够了)。
否则,正如 Clifford 所提到的,您可以从您的环境中收集熵,如果您有这样的环境可用,这绝对是优越的。这个唯一的好处(时钟源之间的漂移)是它很可能适用于几乎任何设置。
顺便说一句,你不能做srand(time(0)),只是从你期望time() 获得微控制器上纪元以来的秒数? :)
【讨论】: