随机数实验报告

云南大学软件学院

实 验 报 告

班级:

课程名称 信息技术 ? 实验目的 利用密码技术或者专门的随机数产生算法产生随机数,

并对产生的随机数进行统计分析

实验内容(算法、程序、步骤和方法)

设计一种随机数算法

利用上学期在密码技术中学到的RC4加密算法来实现此次随机数生成,此次实验主要用到的是RC4密钥流的产生过程。RC4每次生成一个0-255(8bit)的数字,本次统计随机数是将这个8bit的数字,分为两个4bit(0-15)的随机数来统计,统计的随机数的范围是从0-15。

实现该随机数算法

主要是利用RC4算法,该算法的原理和核心代码将在下面详细阐述:

初始化S:开始时,S中元素的值被置为按升序从0-255(unsigned char型),即S【0】=0,......,S【255】=255。同时建立一个临时向量T。设密钥长度为keylen字节,讲K的值赋给T的前kenlen个元素,并循环重复用K的值赋给T剩下的元素,直至T全部被赋值。具体实现过程如下:

//------初始化S数组和T数组
unchar S[256]={0};
unchar T[256]={0};
for(int i=0;i<256;i++)
{
S[i]=i;
T[i]=K[i%keylen];//循环复用K
}

然后用T长生的S的初始置换,从S【0】到S【255】,对每个S【i】,根据由T【i】确定的方案,将S【i】置换为S【i】中的另一字节,具体实现如下:

//-------用T数组影响S数组
int j=0;
int i;
for(i=0;i<256;i++)
{
j=(j+S[i]+T[i])%256;
Swap(&S[i],&S[j]);
}

向量S一旦完成初始化,输入密钥就不再被使用。密钥流的生成是从S【0】到S【255】,对每个S【i】,根据当前S的值,将S【i】与S中的另一个字节置换。当S【255】完成置换后,操作继续重复从S【0】开始:

//------随机数的产生
i=0;j=0;
int c[MAX]={0};//用来保存随机序列
for(int n=0;n
{
unchar t;//用来临时存储随机数的下标
unchar k;//产生的随机序列(一个字节)如:2f
i=(i+1)%256;
j=(j+S[i])%256;
Swap(&S[i],&S[j]);
t=(S[i]+S[j])%256;
k=S[t];
printf("%x",k);//以16机制形式显示在屏幕上
c[n]=k;//将生成的随机序列保存到数组c[n]中
}

对该算法产生的随机数进行统计,分析其效果

统计随机数的时候,一定要注意把生成的一个unsigned char的数字当成两个随机数统计,比如生成的数字时6b(16进制),就要当成6和b两个数字统计。

具体的统计过程的核心代码如下:

//------统计次数和频率
int n[16];//用来存储随机数(0-15)的次数
float f[16];//用来存储随机数(0-15)的频率
for(int i=0;i<16;i++)//初始化次数和频率
{
n[i]=0;
f[i]=0.0;
}

统计次数的这一个模块非常重要,一定要把生成的数据(unsigned char型)的数据当成两个随机数字来读,具体过程如下:

for(int i=0;i
{//统计次数
unchar temp=(unchar)c[i];
for(int j=0;j<2;j++)
{//先读低四位的16进制数,再读高四位的16机制数
int p=0;
p=temp%16;//低四位的16进制数,第二次循换就是高四位的16进制数
temp=temp/16;//得到高四位的16机制数
n[p]++;//对应次数加1
}
}
printf("\n");
for(int i=0;i<16;i++)
{//计算频率
f[i]=(float)n[i]/(MAX*2);//因为生成的是MAX个8bit的数据,换成16进制(4bit)
//就是2MAX个16进制的数字了
}
for(int k=0;k<16;k++)
{
printf("%2d出现的次数为:%2d , ",k,n[k]);
printf("%2d出现的频率为:%f\n",k,f[k]);}

最后看看每个随机数出现了多少次,和随机数出现的次数在总的数字里占的比例