
内置了真随机数生成器的计算机硬件是可以生成“真随机数”的,但是这个“真随机数”是不是你想要的那种“真正的随机系统”我就不知道了。
CPU里通常会有真随机数生成器(True Random Number Generator,简称TRNG)和伪随机数生成器(Pseudo Random Number Generator,PRNG)。真随机数生成器通常是通过放大电路的热噪声来产生随机数,而伪随机数生成器则是使用线性反馈移位寄存器(Linear feedback shift register,LFSR)生成。
我们知道温度高于绝对零度的原子都存在热运动,在集成电路里这些原子的热运动会在电路里产生噪声,噪声会使得电路中的电压存在微小的起伏,TRNG就是通过放大这些微小的起伏来产生随机数。
不过TRNG也有不少缺点。首先就是产生随机数的速度很低,因为噪声放大电路有低通特性,使得高频的噪声被滤除了,而放大低频噪声就需要较长的时间,使得TRNG的工作频率受限。其次是电路系统里有很多不同的噪声,但并不是所有噪声都是随机的,比如电源噪声中很大一部分就是和系统时钟强相关的。而TRNG是一个放大极小信号的电路,它对外界干扰是极其敏感的,为了避免外界非随机信号的干扰TRNG必须要耗费不少功率和面积在屏蔽上。
由于面积和功耗限制,CPU中不能内置很多个TRNG;由于频率限制,单个TRNG输出的随机数数量有限,这使得单靠TRNG产生的随机数数量不足以满足系统需要。所以大多数时候我们会用TRNG和PRNG配合来产生随机数。
基于LFSR的PRNG可以简单的认为就是一串很长很长的0、1构成的会循环的序列,在没有外界输入的情况下这个数列每个周期输出一个比特的数据(0或1)。同时,LSFR可以读取一组输入作为初始状态,跳转到数列中某个特定位置。PRNG的面积和功耗都很小,CPU里可以内置很多个,工作频率也可以轻松达到GHz。
CPU会通过TRNG不断产生真随机数,然后将真随机数储存在熵池中,当需要使用随机数时再从熵池里提取一些随机数作为种子,输入到一大堆PRNG当中,最后使用这些PRNG的输出作为随机数使用。
业界一般会用NIST(美国国家标准技术研究所)制定的随机性测试来检测RNG的随机性,这套测试会使用很多种不同的算法来预测和分析RNG的输出,如果RNG的抗预测性够强,能长时间保持所有测试全部通过,就认为这个RNG设计是合格了。
但是呢,这中方法产生的随机数到底是不是“真正意义的随机数”?这就关系到热运动到底是不是真随机的了,我可回答不了……
