一、随机数概述
在密码技术中,随机序列是非常重要的,比如密钥产生、数字签名、身份认证和众多的密码学协议等都要用到随机序列。所以产生高质量的随机数序列对信息的安全性具有十分重要的作用。随机数分为真随机数和伪随机数,计算机通过算法产生的随机数并不上真正意义上的随机数,很容易被破解,只能称为伪随机数。若要产生真正的随机数,必须通过硬件来实现,比如使用离子辐射事件的脉冲检测器、气体放电管和带泄露的电容等,但是为每台计算机配备这样的装置上不可能。所以在此我们通过改进我们的算法,使生成的伪随机数达到真随机数的标准。
二、软件常用的产生随机数的方法
在软件上计算机常用的产生随机数的算法为线性同余算法,即使用下面的公式递推产生不同的随机数.
ni+1=(a*ni+b)mod M 其中i=0,1,…,M-1
c语言中的rand()函数即是通过该公式递推产生随机数的,常用当前的系统时间为种子。
通过该公式可以看出,产生的随机数是明显有规律可寻的,每一个随机数都是在前一个随机数的基础上通过公式计算得来的,所以通过该方法得来的随机数的随机性很差。
二进制转换10进制快捷方法
所以为了提高计算机产生的随机数的随机性,在这里我们通过收集系统随机的物理量来填充随机数缓冲池,比如键盘敲击时间、鼠标点击时间、cpu运行参数等,通过这些方法得到的随机数具有很高的随机性。可达到真随机数的要求。
在WAPI系统中,均需要产生32位的随机数,在这里区分不同的平台,编写随机数产生程序,并根据美国NIST(美国标准与技术研究院)提供的最新随机数测试标准进行测试。
二、Windows平台下随机数生成算法
首先建立一个动态数据缓冲池,缓冲池被释放之前,会不停的收集windows平台下众多的物理随机信息,包括:①当前进程的ID;②当前线程的ID;③系统引导以来的时钟数;④各种高精度的性能计数器;⑤用户环境模块的MD4(Message Digest 4,信息摘要4)散列,包括用户名,计算机名和搜索路径等;⑥高精度的内部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(自由变量测试)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论