随 机 数 算 法

一、随机数概述

在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(自由变量測试)

随 机 数 算 法

时间: 2024-11-09 01:42:22

随 机 数 算 法的相关文章

BZOJ 3039 玉蟾宫 最大子矩阵 算♂法②

题意:链接 方法:最大子矩阵之算♂法② 解析: 首先这道题单调栈DP是肯定能过的,但是一点都不高端! 什么年代了还用这种方式! 所以如何彰显自己是个高端的人呢? 悬线法能满足你的需求! 什么是悬线法? 首先对于悬线的定义,对于一个n*m的坐标图中的任意一点,其向上能延伸的一个线段(不碰到坏点)称为悬线. 如果定义h[i,j]代表(i,j)该点的悬线长度. 那么,如果其上方的点是坏点,则悬线长度为0,该点为坏点,悬线长度为0,否则的话,为上方的点的悬线长度加1. 如果这么统计的话,那么最终的悬线长

Vijos 1055 奶牛浴场 最大子矩阵 算♂法①

题意:链接 方法:最大子矩阵之算♂法① 解析: 首先谈到最大子矩阵,我们可能会想到之前做过的盖房子?,那道DP求解的题目. 然而这种题目当然有更高♂端的算法. 比如接下来要谈到的算法①. 我们先来观察数据范围,n,m<=30000,这下就玩完了,怎么dp? 一下子就D掉了你原来的算法,真是不留情面. 那么我们来介绍一种新的算法. 首先谈暴力,枚举各种坏点,但这种的复杂度呢?甚至可能达到6次方,所以怎么优化呢? 按照经验,这种坐标图排个序就能降下复杂度什么的. 于是有神犇介绍了s^2复杂度的算法,

R语言与数据分析之八:霍尔特指数平滑法

上篇我和小伙伴们分享了简单指数平滑法,简单指数平滑法只能预测那些处于恒定水平和没有季节变动的时间序列,今天和大家分享非恒定水平即有增长或者降低趋势的,没有季节性可相加模型的时间序列预测算法---霍尔特指数平滑法(Holt). Holt 指数平滑法估计当前时间的水平和斜率.其平滑水平是由两个参数控制,alpha:估计当前点水平:beta:估计当前点趋势部分斜率.两个参数都介于0-1之间,当参数越接近0,大部分近期的观测值的权值将较小. 我们以1866年到1911年每年女士裙子直径为案例,我们首先录

蓝桥杯 方格填数 回溯法

方格填数 如下的10个格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+ (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 回溯法解决的源代码如下: #include<ios

检索02--随机数种子的一些概念和理解

Random ran = new Random(); 括号里存放的即为随机数的种子,如果不存放,默认为计算机的系统时间: 默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值.但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器. 种子跟产生随机数的算法有关,事实上没有绝对真实的随机数,我们所说的随机数,其实是在一个初始数字的基础上(也就

排 序 算 法

一.插入排序(Insertion Sort)1. 基本思想:  每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序:直到待排序数据元素全部插入完为止.2. 排序过程: [示例]:[初始关键字] [49] 38 65 97 76 13 27 49    J=2(38) [38 49] 65 97 76 13 27 49    J=3(65) [38 49 65] 97 76 13 27 49    J=4(97) [38 49 65 97] 76 13 27 49 

华为机试—算日期

题目:算日期 输入一个日期,输出这是这一年的第几天.(题目中没有给出闰年的定义) 输入 20131231 输出 365 #include <stdio.h> //判断是否为闰年 int isleapyear(int year) { if(year%4==0 && year%100!=0 || year%400==0) return 1; return 0; } int main() { int year,month,day; char a[8]; int leap[13]={0

SDOI 2013--随机数生成器(BSGS)

崩溃中...考试的时候freopen打成注释翻车了...呜呜呜呜... 但是还是要按照计划继续写数论题...唉 题意 小W喜欢读书,尤其喜欢读<约翰克里斯朵夫>.最近小W准备读一本新书,这本书一共有P页,页码范围为0..P-1. 小W很忙,所以每天只能读一页书.为了使事情有趣一些,他打算使用NOI2012上学习的线性同余法生成一个序列,来决定每天具体读哪一页. 我们用Xi来表示通过这种方法生成出来的第i个数,也即小W第i天会读哪一页.这个方法需要设置3个参数a,b,X1,满足0<=a,b

数算 2

线性表 顺序表示 struct SeqList{ int n; int MAXNUM; DataType *element; } typedef struct SeqList *PSeqList; - 不适合随机插入和删除- 节省了空间但是操作的时间复杂度增加了 链接表示 数据域 指针域 struct Node; typedef struct Node *PNode; struct Node{ Datatype info; PNode link; } typedef struct Node *L