在嵌入式系统中生成随机数的典型方法是什么?

时间:2014-05-28 11:56:13

标签: algorithm random embedded microcontroller

在嵌入式系统中生成随机数的典型方法是什么?您能为每种方法提供优缺点,和/或某些因素可能会让您选择一种方法而不是另一种方法吗?

3 个答案:

答案 0 :(得分:2)

这样做的一种方法是创建一个伪随机位序列,只需一串零和一串,并将底部位读取为数字。

可以通过触发移位寄存器的位,对它们执行某些逻辑,并使用该逻辑产生下一位移入来生成PRBS。使用任何非零数字对移位寄存器进行种子处理。有一个数学运算可以告诉你需要哪些比特来产生最大长度序列(即N比特移位寄存器的2 ^ N-1个数)。有表格可用于2抽头,3抽头和4抽头实现。如果你搜索"最大长度移位寄存器序列"你可以找到它们。或"线性反馈移位寄存器。

enter image description here 来自:http://www.markharvey.info/fpga/lfsr/

HOROWITZ AND HILL给出了关于此的章节的很大一部分。大部分数学都围绕PRBS的性质而不是您使用位序列生成的数字。有一些论文是关于从比特序列中获取数字并通过屏蔽用于生成随机数的比特来改善相关性的最佳方法,例如,Horan和Guinee,基于随机数序列的相关分析关于伪随机二进制序列生成的研究。 IEEE ISOC ITW2005编码和复杂性;编辑M.J. Dinneen;联合主席U. Speidel和D. Taylor;第82-85页

一个优点是,这可以通过位移和简单的位逻辑操作来实现。一个班轮就可以做到。另一个优点是数学很好理解。缺点是这只是伪随机的,而不是随机的。另外,我对随机数字知之甚少,而且我可能还有更好的方法可以做到这一点,我根本就不知道。

你花费多少能量取决于你需要多少随机数。如果我在运行赌博网站,并且需要随机数来生成交易,我就不会依赖于伪随机比特序列。在那些情况下,我可能会研究模拟噪声技术,可能是围绕一个大喇叭电阻的约翰逊噪声或PN结上的一些结噪声,放大并对其进行采样。这样做的好处是,如果你做对了,你有一个非常好的随机数。缺点是有时您需要一个伪随机数,您可以通过存储种子来精确地重现序列。此外,这使用硬件,有人必须支付,而不是一两行代码,这是便宜的。它还使用A / D转换,这是另一种使用的外设。最后,如果你做错了 - 比如60Hz最终压倒你的白噪声会犯一个错误 - 你可以得到一个非常糟糕的随机数。

答案 1 :(得分:0)

  

在嵌入式系统中生成随机数的典型方法是什么?

Giles间接表示:这取决于使用情况。

如果您使用生成器来驱动模拟,那么您只需要均匀分布,linear congruential generator (LCG)就可以正常工作。

如果您需要 安全 生成器,那么这是一个棘手的问题。我撇开安全意味着什么,但是从10,000英尺开始思考"将其包装在加密转换中,如SHA-1 / HMAC或SHA-512 / HMAC。还有其他方法,例如抽样随机事件,但它们可能不可行。

当您需要安全随机数时,一些低资源设备非常难以使用。例如,请参阅Mining Your Ps and Qs: Detection of Widespread Weak Keys in Network DevicesTraffic sensor flaw that could allow driver tracking fixed。对Linux 3.0内核用户的一个警告:内核删除了几个熵源,因此熵耗尽和饥饿可能会变得更糟。请参阅LWN上的Appropriate sources of entropy

如果 你有一个安全的发电机,那么你的问题就变成了一个好种子(或种子随着时间推移)。对于受限制的环境,我看到的一种更好的方法是 Hedging 。针对虚拟机提出了对冲,其中程序可以在VM重置后生成相同的序列。

对冲的想法是提取同伴提供的随机性,并使用它来保证生成器安全。例如,在TLS的情况下,有client_randomserver_random。如果设备是服务器,那么它会在client_random中激起。如果该设备是客户端,那么它会在server_random中激起。

您可以找到两篇有意解决对冲的论文:

使用client_randomserver_random与Peter Guttman关于此主题的观点一致: "mix every entropy source you can get your hands on into your PRNG, including less-than-perfect ones" 。古特曼是Engineering Security的作者。

套期保值只能解决部分问题。您仍然需要解决其他问题,例如如何引导熵池,如何在池处于错误状态时重新生成系统密钥对,以及当没有文件系统时如何在重新启动时保持熵。

答案 2 :(得分:0)

虽然它可能不是最复杂或最合理的方法,但使用外部刺激作为随机数生成的种子会很有趣。考虑使用光电二极管或热敏电阻的模拟输入。即使来自浮动引脚的随机噪声也可能产生一些有趣的结果。