我听说过使用光传感器,盖革计数器,以及其他物理传感器来产生随机数的人,但我怀疑。 是否真的有办法采取物理世界的测量(使用一个Arduino或者任何其他微控制器)生成随机数? 如果是这样,将这些数字永远是真正随机的?
澄清:问题是关于使用微控制器收集的数据,以生成可以被香甜应用于cryptography--替代依赖于设备的熵的随机数的可行性。
我听说过使用光传感器,盖革计数器,以及其他物理传感器来产生随机数的人,但我怀疑。 是否真的有办法采取物理世界的测量(使用一个Arduino或者任何其他微控制器)生成随机数? 如果是这样,将这些数字永远是真正随机的?
澄清:问题是关于使用微控制器收集的数据,以生成可以被香甜应用于cryptography--替代依赖于设备的熵的随机数的可行性。
以模拟“真实世界”的测量通常是一个很好的来源熵 (又名真随机数据)。 模拟源总是有叠加可以“收获”一些不可预知的噪音。 然而,如前指出,测得的数据是很少的未偏置。
模拟电测量也可能是无法控制的影响或甚至来自外部的攻击,例如通过使所述传感器(S)的饱和度或多或少敏感。 EMI也很可能与测量干涉; 置于相当接近电路在通话过程中一个普通的手机将最有可能造成的对任何模拟信号混乱。
未偏置的,高熵的均匀分布的数字是常用的那些人希望的,因为它们的性质 (未值 )在某种程度上标准化,因此可以更可靠地预测。
当测量与,比如说,10位分辨率的模拟输入,数字的理想的范围内从测量聚集将覆盖从0所有值1024,并且将具有相同的频率(或概率)自该范围内的任何其它值发生的每个值。
在现实中,这些值通常是(或多或少)正态分布(高斯分布)周围一些特性标准偏差一些avarage值,例如约500 @每采样10比特。
所以,为了生成具有所需性质的随机值(见上文),某些反偏置需要做:一个随机性提取器需要某种形式的。
使用密码功能,如(单程)的散列函数或密码算法,通常容易产生所期望的结果为好; 这是以虽然成本:所述的那些功能“混合”是由设计极强,这使得不可能确定变换后的源数据的质量(=随机性)。 即使是值的简单的确定性序列,如{1,2,3,4,5 ...},哈希生成数据时将最有可能通过的任何和所有统计随机性测试相当不错,虽然它不是“随机”在所有。
在微控制器的环境中是很少想到熵的良好来源是事件发生的时间 。 使用高速定时器,真熵可以通过响应于某些异步事件读取计时器值来收集。 这种情况下,这是不相关的与运行的定时器,可以是按钮的用户的推动下,通信的另一个(子)系统或IC,或基本上不被触发μC任何其他事件启动开始(或任何同步子系统)本身。
事实上,熵甚至可以从只有两个独立的时钟源收获; 例如通过经由其他时钟定时一个时钟的周期。 这将打开几个取决于μC的能力爱特梅尔AVRμCs非常有趣的可能性(这是在Arduino的使用):
大多数的AVR系列有内部EEPROM存储器。 写操作这个内存是由一个专用定时独立于主系统时钟的计时( -据说有一些芯片(未种),其中的测量表明,这可能并非如此!)( 编辑:请注意,在一些AVR单片机,ATTiny25 / 45/85,用于例如,EEPROM定时从内部RC振荡器产生,这样就没有熵可以收集时该振荡器也被选择作为系统时钟源); 这可能取决于主时钟源(内部R / C与外部晶振/谐振器)上。 因此,存在一些(真正随机的)抖动在需要写入到EEPROM相对于主系统时钟,其再次可以是一个高速定时器/计数器来测量的时间可以预期的。
较新的AVR系列有让看门狗定时器产生一个软件中断的能力,而不是硬件复位。 看门狗定时器是由设计通过其自身的独立的时钟源,其产生相对抖动可以测量控制。
许多的AVR必须有一个专用的定时器/计数器可以从外部32kHz晶振改进的实时测量精度计时的能力。 这个外部晶体是与主时钟不相关事件的另一个来源。 (否则,将是额外的水晶摆在首位没有用的......)
后者似乎是有希望的用于相对高带宽的其潜在的:当与显著更快运行一个系统定时器定时每个32kHz的时钟周期(的600+的因子可以在当前的AVR来实现@ 20MHz的!)和保守假定只有1个比特每次测量熵的,这导致每秒熵32000+位-远远超过了μC将永远消耗由本身。
编辑:同时,我已经进行了32kHz的计时器方法的一些简单的测试,以及短期业绩似乎是相当低质量的。 每个样品所产生的熵上边界似乎是非常低,而我还没有测试的样品为从更多或更少的规则相移始发非显而易见的图案。 这个结果可能是由于这样的事实,我的DUT有其主时钟通过其可以被预期为外部晶体(在测量的精密度内)驱动频率作为当在有限的时间范围内所观察到的32kHz的石英同样是稳定的。 扩展取两个样本之间的时间(分钟?)在很低的带宽可能会返回良好熵,但。 (NB:测量也可以是部分地由于变化取决于在中断被触发的时间权执行的机器指令的中断延迟抖动)
编辑#2:看起来我的DUT(ATmega1284)的内部RC振荡器产生显著频率抖动(几kHz /秒); 这个振荡器运行确实似乎当由外部32kHz晶振定时产生非常熵(千位/秒)。
在一个小实验我最近研究了前两种方法。 在我的DUT EEPROM定时一般会在WDT有利:
定时产生约4.82每个写入操作的熵比特EEPROM写,而看门狗定时器似乎更稳定的频率逐得到每看门狗超时约3.92比特。 此外,EEPROM的写入时间似乎顺利得多高斯分布在WDT的分布似乎有点不对称,并用大量的像差。
铌:聚合多个“随机”的事件为单个熵测量实际上可能降低熵得到:快速,在源的随机波动可以部分地彼此,得到的结果值与来自平均值下偏差补偿。 所以,代替定时,例如一个实时秒(RTC晶体的32K周期)更熵可以从在相同的时间服用32K定时(一个用于晶体的每个周期)的预期。
AVR-GCC编译的应用程序通常具有片上执行用户代码之前RAM清为0x00整,即main()
把代码放到一个早期.init
部分是通过gcc的初始化程序覆盖之前提供访问原始的未初始化的内存内容。
由于在RAM的物理存储单元(比特),并且根据一些真随机热噪声(和其他效果)微乎其微方差,不是每一个小区将当(重新)施加到所述芯片的电源本身初始化到相同的已知状态。 动力了一些功能之后芯片的RAM中的内容结合可以产生熵的显著大量供以后使用。 - 这种方法的缺点是,当电源已经关闭了一段时间,然后再次打开它只会可靠地工作。 一个正常的芯片复位 ,通过硬件,软件,或外部信号,将保留RAM的以前的内容,因此不(总是)熵的良好来源。 然而,由于整个系统(RAM)的在复位时的状态很难在一个合理的复杂应用程序来预测一些熵可以立即复位后反正聚集。
熵源的质量具有相对于它的带宽和由应用使用熵的带宽被看到。 熵收集的一些方法在几秒钟的时间可能不会产生熵的一个以上的位,而其他的(不是真的在μCs...)可产生100千比特/秒以上。
必须指出的是,一个人不能从算法存在熵“创造”新的熵! - 熵的一个位不能计算转化为熵的两位。
因此,人们不能(上avarage)消耗每单位时间更多的(真实)熵比从在相同时间熵源极(S)收集的。
当需要强大的随机数,这种情况并不少见真正的熵的一个或多个源相结合,具有较强的PRNG ,利用熵聚集地(重新)每一次新的熵可用播种PRNG。
所述PRNG可以用来产生更不可预知基本上比数据熵源实际上在同一时间提供。
作为一种特殊的PRNG的,加密的加密功能可以被使用,其中熵用来初始化和更新密码的密钥。
linux的/dev/urandom
常用这种方式来实现。
如上所讨论的,它是在一个共同的微控制器产生真正的随机数相当可行的。 作为熵的所有其他来源,需要分析由熵源极(S),用于实熵的它们所包含的量和每单位时间所产生的熵的量所提供的原始数据,以确定该源是适合于使用情况或没有。
一个真正的熵源和强大的PRNG的组合是普遍实现的,哪些应该在微控制器上藏汉被使用的方法。
编辑:
该PRNG方法可能不是用于加密密钥生成的最佳选择。 对于一个应该只使用真正的随机位产生安全密钥。 收集熵的这个量可能需要一些时间(秒也许),但由于通常不上的μC执行密钥生成非常频繁,这很可能是可接受的。 (每秒负载过重的服务器女巫数百个或多个SSL(HTTPS)连接,这将完全是另外的问题...)
为了产生质量高熵比特流适当的密钥生成随机性提取如上所述应该被采用。
(在另一方面,如果在源的输出熵的量可以被测量或估计的一个可以简单地通过的因子缩放密钥长度(bitlength of key)/(entropy per bit sampled)
,然后使用原始低熵从熵源数据直接生成这个更长的密钥,然后将具有相同的总熵作为原始长度的完全随机的密钥,但如果这确实的伎俩依赖,对密码如何处理两种不同长度的密钥。 )
取决于传感器的范围内,采样频率和灵敏度。 您可以考虑传感器测量的位串或浮点数,其实并不重要。 问题的关键是,最显著位/主导小数都不是很随机的,他们甚至可能几乎不变。 同样地,至少显著位是随机性的不可靠的来源,因为它们可能会显示由于有限的传感器灵敏度的步骤的效果,并且取决于他们可能在时间上高度相关的传感器(例如,温度或电压将具有逐渐改变的倾向)。 中间位/数字不过很可能是真正的随机值的来源。
假设有一个输出值在0至200的范围内,与0.01的精度的传感器。 比方说,这是一个压力表,也许分贝计。 你需要广泛的测试这一点,看看值的特定传感器和环境中的分布,但我认为在10 ^ 0的数字,10 ^ -1的位置很可能是均匀,无明显的顺序分配。
最适合的传感器,可以做出非常精确的测量,但总得去面对具有高水平的噪音。 因为大多数传感器不旨在提供精确的不必要的/不可靠的水平。这可能会带来问题。 另外,测量是大致随时随地(除了噪声)同样将被优选当然。 宇宙背景辐射是一个很好的例子。
我一直在尝试与硬件资源的随机数生成,到目前为止,他们似乎提供了一个不可预知的来源。 如果使用的美白技术,任何底层偏压减少/消除,以允许它们以产生随机整数的均匀序列。
如果您想尝试和实验,我已经实现了使用和看门狗定时器产生随机数相关的抖动的Arduino兼容库。 初步结果表明它是生产适于密码目的结果。
可以在这里找到Code.google库的储存库
谷歌:真随机数发生器
那你是怎么做到这一点,你产生噪声和品尝它。 你不能创造一些东西,从真正的随机是确定性就像一个软件算法。