维吉尼亚密码C语言实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1/82016春密码学原理软件学院密码学原理作业报告作业1:古典密码体制的实践与分析姓名查志华院系软件学院学号1133710313任课教师刘绍辉指导教师刘绍辉实验地点哈尔滨工业大学实验时间2016.3.15-2016.3.18一、实验目的要求:综述本次实验的基本目的。1.了解古典密码的基本体制,掌握维吉尼亚密码的加解密方式,能对文件进行加解密。2.掌握重合指数的计算方法,了解掌握Kasiski’s的计算方法,能对明文以及密文进行重合指数的计算以及Kasiski’s计算方法;二、实验内容要求:对如下内容进行详细描述。1.弗吉尼亚密码加密解密算法;明文=(密文-密钥+26)/26;密文=(明文+密钥)/26;具体实现见下代码。2.重合指数计算算法;先统计出各个字母出现的频数,f(a),f(b),……,f(z)f(a)+f(b)+……+f(z)=X(X就是密文长度),然后把所有的f(字母)*(f(字母)-1)的和求出来,假设为sum,sum/(X*(X-1))就是重合指数具体实现见下代码。3.Kasiski’s计算方法;①在密文中标出重复的三个或多个字符结构;②对每一个字符结构,记下结构的起始位置;③计算相邻的起始点的距离;④对每个距离求出所有因数;⑤若使用多字母替换密码,则密钥的长度为步骤4种出现的某一因数;2/8三、实验结果及分析要求:将实验获得的结果进行描述,涉及不同的密钥以及密钥长度,不同密文长度情况下的Kasiski分析及重合指数分析得出的结果。选择文件进行操作,对于不同的密钥以及不同长度的密钥,情况如下:(文件选取为英文原著阿兹卡班的囚徒1.txt,大小为21K)各字符频率统计:密钥长度为4时,即n=4时:密钥长度为16时,即n=16时:重合指数计算:n=1时:3/8n=2时:n=4时:n=8时:n=16时:n=32时:n=64时:n=128时:n=256时:n=9000时:结论:当密钥的长度足够大时,发现密文的重合指数会趋向于3.84%,也就是1/26。4/8代码如下:#includestdio.h#includestdlib.h#includetime.h#includeString.h#includeconio.hvoidGenkey(intlen);voidDenKey();intmain(){intlen=0;intselect=0;while(1){printf(请选择操作:加密(1);解密(2):退出(3)\n);scanf(%d,&select);if(select==1)//加密操作{printf(请输入密钥长度\n);scanf(%d,&len);Genkey(len);}elseif(select==2)//解密操作{DenKey();}elseif(select==3){exit(0);}else{printf(输入有误!\n);}}return0;}voidGenkey(intlen){srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样intnumber=0,i=0,j=0,len1;len1=len;5/8charch;charkey1[10000]=;charalp[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};while(len0)//随机生成密钥{number=rand()%26;//产生0-25的随机数key1[i]=alp[number];len--;i++;}printf(随机生成的密钥为:);while(len10)//打印密钥{printf(%c,key1[j]);j++;len1--;}printf(\n);intL=strlen(key1);FILE*fp,*fp1;intnum1[26];intnum2[26];intm=0;for(m=0;m26;m++){num1[m]=0;num2[m]=0;}intal=0,bl=0;fp=fopen(G:\\1.txt,r);fp1=fopen(G:\\2.txt,w);if(fp==NULL){printf(文件打开失败!);}i=0,j=0;fscanf(fp,%c,&ch);while(!feof(fp)){if((ch='a'&&ch='z')||(ch='A'&&ch='Z'))6/8{if(ch='A'&&ch='Z'){al=(int)(ch-'A');num1[al]++;fprintf(fp1,%c,(ch+key1[j%L]-'A'-'A')%26+'A');bl=(int)((ch+key1[j%L]-'A'-'A')%26);num2[bl]++;j++;}else{al=(int)(ch-'a');num1[al]++;fprintf(fp1,%c,(ch+key1[j%L]-'A'-'a')%26+'A');bl=(int)((ch+key1[j%L]-'A'-'a')%26);//printf(%d,bl);num2[bl]++;j++;}}fscanf(fp,%c,&ch);}printf(加密结果请查看文档!\n);//printf(%d\n,j);fclose(fp1);fclose(fp);//统计明文密文中各字符的频率printf(明文中各字符的频率(a-z):);for(m=0;m26;m++){printf(%.3f%%,(float)num1[m]/j*100);if((m%5)==0){printf(\n);}}printf(密文中各字符出现的频率(a-z):);for(m=0;m26;m++){printf(%.3f%%,(float)num2[m]/j*100);7/8if((m%5)==0){printf(\n);}}//计算重合指数intsum=0;intsum1=0;for(m=0;m26;m++){sum=sum+num1[m]*(num1[m]-1);}for(m=0;m26;m++){sum1=sum1+num2[m]*(num2[m]-1);}printf(密钥长度为%d时\n,L);printf(明文的重合指数为:%.3f%%\n,(float)sum/(j*(j-1))*100);printf(密文的重合指数为:%.3f%%\n,(float)sum1/(j*(j-1))*100);}voidDenKey(){charkey[10000];charch,temp;intL,j=0;if(getchar()=='\n')temp='';printf(请输入密钥(小写字母):);gets(key);L=strlen(key);FILE*fp,*fp1;fp=fopen(G:\\2.txt,r);fp1=fopen(G:\\3.txt,w);if(fp==NULL){printf(文件打开失败!);}else{fscanf(fp,%c,&ch);8/8while(!feof(fp)){if(ch='A'&&ch='Z'){fprintf(fp1,%c,(ch-key[j%L]-'A'+'a'+26)%26+'A');j++;}elseif(ch='a'&&ch='z'){fprintf(fp1,%c,(ch-key[j%L]-'a'+'a'+26)%26+'A');j++;}fscanf(fp,%c,&ch);}printf(解密结果请查看文档!\n);fclose(fp1);fclose(fp);}}四、实验成绩(共5分)程序设计成绩(1分)实验结果成绩(2分)实验报告成绩(2分)总成绩指导教师签字日期

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功