一、随机数概述
在password技术中,随机序列是非常重要的,比方密钥产生、数字签名、身份认证和众多的password学协议等都要用到随机序列。所以产生高质量的随机数序列对信息的安全性具有十分关键的数据。随机数分为真随机数和伪随机数,计算机通过算法产生的随机数并不上真正意义上的随机数,非常easy被破解,仅仅能称为伪随机数。若要产生真正的随机数,必须通过硬件来实现,比方使用离子辐射事件的脉冲检測器、气体放电管和带泄露的电容等,可是为每台计算机配备这种装置上不可能。所以在此我们通过改进我们的算法,使生成的伪随机数达到真随机数的标准。
二、软件经常使用的产生随机数的方法
在软件上计算机经常使用的产生随机数的算法为线性同余算法,即使用以下的公式递推产生不同的随机数.
ni+1=(a*ni+b)mod M 当中i=0,1,…,M-1
c语言中的rand()函数即是通过该公式递推产生随机数的,经常使用当前的系统时间为种子。
通过该公式能够看出,产生的随机数是明显有规律可寻的,每个随机数都是在前一个随机数的基础上通过公式计算得来的,所以通过该方法得来的随机数的随机性非常差。
所以为了提高计算机产生的随机数的随机性,在这里我们通过收集系统随机的物理量来填充随机数缓冲池,比方键盘敲击时间、鼠标点击时间、cpu执行參数等,通过这些方法得到的随机数具有非常高的随机性。可达到真随机数的要求。
在WAPI系统中,均须要产生32位的随机数,在这里区分不同的平台,编写随机数产生程序,并依据美国NIST(美国标准与技术研究院)提供的最新随机数測试标准进行測试。
二、Windows平台下随机数生成算法
首先建立一个动态数据缓冲池,缓冲池被释放之前,会不停的收集windows平台下众多的物理随机信息,包含:①当前进程的ID;②当前线程的ID;③系统引导以来的时钟数;④各种高精度的性能计数器;⑤用户环境模块的MD4(Message Digest 4,信息摘要4)散列,包含username,计算机名和搜索路径等;⑥高精度的内部CPU计算器,如RDISC,ROMSR,RDPM等;⑦底层系统信息,如空暇时间,内检时刻,中断时间,提交限定,页面计数,缓存计数,操作系统外部计数、键盘、鼠标信息等。
当程序须要随机数时,从这些缓冲池中读取这些物理信息,由于这些信息大部分均从物理量读取而来,所以有不可预測性,能够满足随机性的要求。
三、Linux平台下随机数生成算法
Linux平台下也首先建立一个缓冲池用来收集来自设备驱动程序和其他来源的环境噪音,包含两次中断的时间间隔、键的扫描码、两次按键之间的时间间隔、鼠标位置和连续两次鼠标中断时间间隔、连续两次磁盘操作之间的间隔。
须要随机数的时,就从这些缓冲池中读取这些物理信息,这些信息具有不可预測性,满足随机性的要求。
四、随机数统计測试
每项的測试结果均转换为p-value值进行推断,若p-value>=0.01,则说明该随机数序列具有随机性,否则不具有随机性。下面对这15项測试进行简单的介绍。
这15项測试分别为:
1. Frequency (Monobit) Test(频率測试)
2. Frequency Test within a Block(块内频率測试)
3. Runs Test(流程測试)
4.Test for the Longest Run of Ones in a Block(块内最长游程測试)
5. Binary Matrix Rank Test(二进制矩阵測试)
6. Discrete Fourier Transform (Spectral) Test(离散付利叶測试)
7. Non-overlapping Template Matching Test(非重叠模板匹配測试)
8. overlapping Template Matching Test(重叠模板匹配測试)
9. Maurer’s “Universal Statistical” Test(Maurer's普通统计測试)
10. Linear Complexity Test(线性复杂性測试)
11. Serial Test(连续測试)
12. Approximate Entropy Test(近似熵測试)
13. Cumulative Sums (Cusum) Test(累积和測试)
14. Random Excursions Test(自由游程測试)
15. Random Excursions Variant Test(自由变量測试)