随机数实验报告.doc_第1页
随机数实验报告.doc_第2页
随机数实验报告.doc_第3页
随机数实验报告.doc_第4页
随机数实验报告.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

云南大学软件学院实 验 报 告姓名: 学号: 班级: 信息安全 日期: 成绩: 课程名称 信息安全技术 实验项目随机数产生实验目的 利用密码技术或者专门的随机数产生算法产生随机数,并对产生的随机数进行统计分析实验内容(算法、程序、步骤和方法)1) 设计一种随机数算法利用上学期在密码技术中学到的RC4加密算法来实现此次随机数生成,此次实验主要用到的是RC4密钥流的产生过程。RC4每次生成一个0-255(8bit)的数字,本次统计随机数是将这个8bit的数字,分为两个4bit(0-15)的随机数来统计,统计的随机数的范围是从0-15。2) 实现该随机数算法主要是利用RC4算法,该算法的原理和核心代码将在下面详细阐述:初始化S:开始时,S中元素的值被置为按升序从0-255(unsigned char型),即S【0】=0,.,S【255】=255。同时建立一个临时向量T。设密钥长度为keylen字节,讲K的值赋给T的前kenlen个元素,并循环重复用K的值赋给T剩下的元素,直至T全部被赋值。具体实现过程如下:/-初始化S数组和T数组 unchar S256=0;unchar T256=0;for(int i=0;i256;i+)Si=i;Ti=Ki%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;i256;i+)j=(j+Si+Ti)%256;Swap(&Si,&Sj);向量S一旦完成初始化,输入密钥就不再被使用。密钥流的生成是从S【0】到S【255】,对每个S【i】,根据当前S的值,将S【i】与S中的另一个字节置换。当S【255】完成置换后,操作继续重复从S【0】开始:/-随机数的产生 i=0;j=0;int cMAX=0;/用来保存随机序列 for(int n=0;nMAX;n+)unchar t;/用来临时存储随机数的下标 unchar k;/产生的随机序列(一个字节)如:2f i=(i+1)%256;j=(j+Si)%256;Swap(&Si,&Sj);t=(Si+Sj)%256;k=St; printf(%x,k);/以16机制形式显示在屏幕上 cn=k;/将生成的随机序列保存到数组cn中 3) 对该算法产生的随机数进行统计,分析其效果统计随机数的时候,一定要注意把生成的一个unsigned char的数字当成两个随机数统计,比如生成的数字时6b(16进制),就要当成6和b两个数字统计。具体的统计过程的核心代码如下: /-统计次数和频率 int n16;/用来存储随机数(0-15)的次数 float f16;/用来存储随机数(0-15)的频率 for(int i=0;i16;i+)/初始化次数和频率 ni=0;fi=0.0;统计次数的这一个模块非常重要,一定要把生成的数据(unsigned char型)的数据当成两个随机数字来读,具体过程如下:for(int i=0;iMAX;i+)/统计次数 unchar temp=(unchar)ci;for(int j=0;j2;j+)/先读低四位的16进制数,再读高四位的16机制数 int p=0;p=temp%16;/低四位的16进制数,第二次循换就是高四位的16进制数 temp=temp/16;/得到高四位的16机制数 np+;/对应次数加1 printf(n);for(int i=0;i16;i+)/计算频率 fi=(float)ni/(MAX*2);/因为生成的是MAX个8bit的数据,换成16进制(4bit)/就是2MAX个16进制的数字了for(int k=0;k16;k+)printf(%2d出现的次数为:%2d , ,k,nk);printf(%2d出现的频率为:%fn,k,fk);最后看看每个随机数出现了多少次,和随机数出现的次数在总的数字里占的比例。看看每个随机数的次数和频率是否大致相等。比较接近就可以证明是随机的。下面的数据记录和计算模块,将会对统计结果进行详细说明。数据记录和计算 当从键盘输入“abcd”的初始向量时,产生的2*MAX(即20000)随机数情况如下:0-15的次数和频率如下:从上述的统计结果可以看书0-15出现的次数大致都为1200多,频率大致都为0.06多,结果都比较接近。再来测一组数据,从键盘输入“12eh5”的初始向量时,产生的2*MAX(即20000)随机数情况如下:0-15的次数和频率如下:从上述的统计结果可以看书0-15出现的次数大致都为1200多,频率大致都为0.06多,结果都比较接近。之后又测了N多组数据,每组数据的0-15的次数和频率都大致相等,这里就不一一展示了。从这N组数据的统计结果中,可以看出此次生成的这个20000个数字时随机产生的,符合随机数的定义。结 论(结 果)1、 本次实验用以前学过的密码技术实验中的RC4算法产生密钥流的思想来生成随机数。2、 通过统计每个随机数出现的次数和频率来判断是否是随机序列。3、 观察出现的次数和频率大致相近,可以判断此次实验中产生的序列是随机序列。源代码#include #include #include #define MAX 10000 typedef unsigned char unchar;/交换函数,用来交换两个变量 void Swap(unchar *a,unchar *b)unchar temp;temp=*a;*a=*b;*b=temp;int main()/-RC4-/ char *K=0x00;char *key;printf(please input key:);scanf(%s,key);K=key;/密钥数组,相当于种子 int keylen;keylen=strlen(K);/-初始化S数组和T数组 unchar S256=0;unchar T256=0;for(int i=0;i256;i+)Si=i;Ti=Ki%keylen;/循环复用K /-用T数组影响S数组 int j=0;int i;for(i=0;i256;i+)j=(j+Si+Ti)%256;Swap(&Si,&Sj);/-随机数的产生 i=0;j=0;int cMAX=0;/用来保存随机序列 for(int n=0;nMAX;n+)unchar t;/用来临时存储随机数的下标 unchar k;/产生的随机序列(一个字节)如:2f i=(i+1)%256;j=(j+Si)%256;Swap(&Si,&Sj);t=(Si+Sj)%256;k=St; printf(%x,k);/以16机制形式显示在屏幕上 cn=k;/将生成的随机序列保存到数组cn中 /-RC4-/-统计次数和频率 int n16;/用来存储随机数(0-15)的次数 float f16;/用来存储随机数(0-15)的频率 for(int i=0;i16;i+)/初始化次数和频率 ni=0;fi=0.0;for(int i=0;iMAX;i+)/统计次数 unchar temp=(unchar)ci;for(int j=0;j2;j+)/先读低四位的16进制数,再读高四位的16机制数 int p=0;p=temp%16;/低四位的16进制数,第二次循换就是高四位的16进制数 temp=temp/16;/得到高四位的16机制数 np+;/对应次数加1 printf(n);for(int i=0;i16;i+)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论