好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

维吉尼亚密码的C语言实现.pdf

9页
  • 卖家[上传人]:鲁**
  • 文档编号:574422459
  • 上传时间:2024-08-16
  • 文档格式:PDF
  • 文档大小:652.56KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 仅供个人参考 不得用于商业用途 密码学原理作业报告 作业1:古典密码体制的实践与分析 一、实验目的 要求:综述本次实验的基本目的 1•了解古典密码的基本体制,掌握维吉尼亚密码的加解密方式,能对文件进行加解密 2.掌握重合指数的计算方法, 了解掌握Kasiski' s的计算方法,能对明文以及密文进行重 合指数的计算以及 Kasiski' s计算方法; 二、实验内容 要求:对如下内容进行详细描述 1. 弗吉尼亚密码加密解密算法; 明文=(密文-密钥+26) /26; 密文=(明文+密钥)/26; 具体实现见下代码 2. 重合指数计算算法; 先统计出各个字母出现的频数 ,f(a),f(b),……,f(z) f(a)+f(b)+ ……+f(z)=XX就是密文长度),然后把所有的f(字母)*(f(字母)-1)的和求出来,假 设为sum ,sum/(X*(X-1))就是重合指数 具体实现见下代码 3. Kasiski's 计算方法; ① 在密文中标出重复的三个或多个字符结构; ② 对每一个字符结构,记下结构的起始位置; ③ 计算相邻的起始点的距离; ④ 对每个距离求出所有因数; ⑤ 若使用多字母替换密码,则密钥的长度为步骤 4种出现的某一因数; 2016 春 密码学原理 软件学院 查志华 院系 软件学院 学号 姓名 1133710313 任课教师 刘绍辉 指导教师 刘绍辉 实验地点 哈尔滨工业大学 实验时间 2016.3.15-2016.3.18 仅供个人参考 不得用于商业用途 、实验结果及分析 要求:将实验获得的结果进行描述, 涉及不同的密钥以及密钥长度, Kasiski分析及重合指数分析得出的结果。

      选择文件进行操作,对于不同的密钥以及不同长度的密钥,情况如下: (文件选取为英文原著阿兹卡班的囚徒 1.txt,大小为21K) 各字符频率统计: 密钥长度为4时,即n=4时: G:\LJ IWI^ige^in^ebugVVige -exe 不同密文长度情况下的 和密(1) i解密(2):退岀⑶ 请输入密钥长度 呃a-i R { y R IJ 0 .•档率a7 为突舸4 密查符90 的w-丄 成果各2 生幫" 聖文飽 ::7.972x 2.542K 4_393z 0,0?9K b .陌 2乂 1』 磁 7.050Z 2 -506K &.189X 6.595X 5.B49K 0.115Z 109>! 7.6B7K 6.148^ 2.378Z 密文中各字符出现的频率( 1.954X 4-095乂 2 ”拋“ 2.142X 5.71SX 4・73矽 3.646x 4.13SK 5.867K 1-614X 6.328K 4.914K S.734J< 3.919K 1.668^ a-2 5.133X 礼 737K 4.575J* 3.950Z 3.549K 1.044X 2.336X 2,633x >:2.852x 3.119K 3-719K 1.flOBx 2.154X 6.&31Z (a) »退岀O) 密钥长度为16时,即n=16时: 请选擇操作「加密匕);解密⑵:退出⑶ 馆输入密钥长度 :IFUNSULKCQVEFDLG »M"T? ujj-■上2.190^ £・6G2X 1.96GX 7.050Z 4.8?0^ 6.1S9Z 6.S95X 5 •昶眈 0.115X a-3) :7-972^ 11-9715C 1 0,109z 7.&87M B.148Z 2.378K 1.044Z 2.336X 2.633K M.243K 3・719x 3.276X 3.877Z 3 .6细 4.52BX 3.646z 3.853X 3.677K 5.133K 3.7®Gz 3.743Z 3.944X 3.555K 3.495Z 4.842?! 3.282Z 3_95H^ 4.296K 3.464Z 4.356x 重合指数计算: n=1 时: 仅供个人参考 不得用于商业用途 n=16 时: n=32 时: 6.329X 3.971X n=64 时: 6.329X 3.916X n=9000 时: 结论:当密钥的长度足够大时,发现密文的重合指数会趋向于 3.84%,也就是1/26。

      为:6.329Z 为t 4.078X 99 密丈訂重合猖数为:卫-8舷_、 鹰为9000时 %:锻. n=2 时: n=4 时: n=8 时: :6.329X :4.4^ n=128 时: n=256 时: 6.329X 仅供个人参考 不得用于商业用途 代码如下: #i nclude #i nclude #in elude #in elude #in elude void Gen key(i nt len); void De nKey(); int mai n() { int len = 0; int select =0; while(1) { printf("请选择操作:加密(1);解密(2):退出(3) \n”); scan f("%d", &select); if(select ==1)〃 加密操作 { printf("请输入密钥长度\n"); scan f("%d",&len); Gen key(le n); } else if(select ==2)〃 解密操作 { Den Key(); } else if(select ==3) { exit(0); } else { printf("输入有误! \n”); } } return 0; } void Gen key(i nt len) { srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 int nu mber=0,i=0,j=0,le n1; len 1=le n; char ch; char key1[10000]=""; char alp[26] = {'A','B',C,'D','E','F','G', 仅供个人参考 不得用于商业用途 'H',T,'J','K','L','M','N','O','P',Q,'R','S',T,'U','V','W,X,'Y','Z' }; while(len >0)//随机生成密钥 { number= rand() % 26; // 产生 0-25 的随机数 key1[i] = alp[ nu mber]; len --; i++; } printf(”随机生成的密钥为:”); while(len1>0)// 打印密钥 { prin tf("%c",key1[j]); j++; len 1--; } prin tf("\n"); int L=strle n( keyl); FILE *fp,*fp1; int num1[26]; int num2[26]; int m=0; for(m=0; m<26; m++) { nu m1[m]=0; nu m2[m]=0; } int al=0,bl=0; fp=fope n("G:\\1.txt","r"); fp仁 fope n("G:\\2.txt","w"); if(fp == NULL) { printf("文件打开失败!"); } i=0,j=0; fsca nf(fp,"%c",&ch); while(!feof(fp)) { if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) if(ch>='A'&&ch<='Z') { al=(i nt)(ch-'A'); nu m1[al]++; fprin tf(fp1,"%c",(ch+key1[j%L]-'A'-'A')%26+'A'); bl=(i nt)((ch+key1[j%L]-'A'-'A')%26); 仅供个人参考 不得用于商业用途 nu m2[bl]++; j++; } else { al=(i nt)(ch-'a'); nu m1[al]++; fprin tf(fp1,"%c",(ch+key1[j%L]-'A'-'a')%26+'A'); bl=(i nt)((ch+key1[j%L]-'A'-'a')%26); //prin tf("%d ",bl); nu m2[bl]++; j++; } } fscan f(fp,"%c",&ch); } printf("加密结果请查看文档! \n"); // prin tf("%d\n",j); fclose(fp1); fclose(fp); //统计明文密文中各字符的频率 printf(”明文中各字符的频率(a-z):"); for(m=0; m<26; m++) { prin tf("%.3f%% ",(float )n um1[m]/j*100); if((m%5)==0) { prin tf("\n"); } } printf(”密文中各字符出现的频率(a-z):"); for(m=0; m<26; m++) { prin tf("%.3f%% ",(float )n um2[m]/j*100); if((m%5)==0) { prin tf("\n"); } } //计算重合指数 int sum =0; int sum1=0; for(m=0; m<26; m++) 仅供个人参考 不得用于商业用途 { sum=sum+nu m1[m]* (nu m1[m]-1); } for(m=0; m<26; m++) { sum 仁 sum1+ nu m2[m]*( nu m2[m]-1); } printf(”密钥长度为%d时\n”丄); printf(” 明文的重合指数为: %.3f%%\n",(float)sum/(j*(j-1))*100); printf(” 密文的重合指数为: %.3f%%\n",(float)sum1/(j*(j-1))*100); } void De nKey() { char key[10000]; char ch,temp; int L,j=0; if(getchar()=='\n') temp=''; printf("请输入密钥(小写字母):”); gets(key); L=strle n( key); FILE *fp,*fp1; fp=fope n("G:\\2.txt","r"); fp仁 fope n( "G:\\3.txt","w"); if(fp == NULL) { printf("文件打开失败!"); } else { fscan f(fp,"%c",&ch); 仅供个人参考 不得用于商业用途 while(!feof(fp)) { if(ch>='A'&&ch<='Z') { fprin tf(fp1,"%c",(ch-key[j%L]-'A'+'a'+26)%26+'A'); j++; } else if(ch>='a'&&ch<='z') { fprin tf(fp1,"%c",(ch-key[j%L]-'a'+'a'+26)%26+'A'); j++; } fsca nf(fp,"%c",&ch); } printf("解密结果请查看文档! \n"); fclose(fp1); fclose(fp); } } 四、实验成绩(共 5 分) 程序设计成绩(1分) 实验结果成绩(2分) 实验报告成绩(2分) 总成绩 指导教师签字 日期 仅供个人参考 不得用于商业用途 仅供个人用于学习、研究;不得用于商业用途 For personal use only in study and research; not for commercial use. Nur f u r den pers?nlichen f u r Studien, Forschung, zu kommerziellen Zwecken verwendet werden. Pour l ' e tude et la recherche uniquement a des fins personnelles; pas a des fins commerciales. TO员BKO g^A.nrogeHKO TOpBieno 员 b3ymmcoi6yqeHu兄 cj egoB u HHue肉go 员冶HBI ucno 员 B3OBaTbCE B KOMMepqeckux ____________ 以下无正文 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.