|
![]() | 作者: hackerjune [hackerjune]
![]() |
登录 |
本帖由 [日月双星] 从 << 菜鸟乐园>> 转移而来原文转移`收为吾手 创建时间:2004-09-04 文章属性:原创 文章提交:saibinhe (amh2002.student_at_sina.com) 凯撒密文的破解编程实现 近来安全的发展,对密码学的研究越来越重要,虽然我们现在大多采用的是 非对称密码体制,但是同时由于处理及其它的一些重要原因,对传统密码仍然 是在大量的使用,如移位,替代的基本思想仍然没有改变,我个人认为,将来 的很长时间内,我们必将会花大量的时间对密码学进行研究,从而才能促进我 们的电子政务,电子商务的健康发展,下面我要谈的是对一个古典密码----- 凯撒(kaiser)密码的的解密,也就是找出它的加密密钥,从而进行解密,由于 它是一种对称密码体制,加解密的密钥是一样的,下边简单说明一下加解密 加密过程: 密文:C=M+K (mod 26) 解密过程: 明文:M=C-K (mod 26) 详细过程请参考相关资料 破解时主要利用了概率统计的特性,E字母出现的概率最大。 加密的程序实现我就不说了, 下面重点说一下解密的程序实现:我是用C写的,在VC6.0下调试运行正确 #include"stdio.h" #include"ctype.h" #include"stdlib.h" main(int argc ,char *argv[]) { FILE *fp_ciper,*fp_plain; //密文与明文的文件指针 char ch_ciper,ch_plain; int i,temp=0; //i用来存最多次数的下标 //temp用在求最多次数时用 int key; //密钥 int j; int num[26]; //保存密文中字母出现次数 for(i = 0;i < 26; i++) num[i] = 0; //进行对num[]数组的初始化 printf("======================================================\n"); printf("------------------BY 安美洪 design--------------------\n"); printf("======================================================\n"); if(argc!=3) { printf("此为KAISER解密用法:[文件名] [密文路径] [明文路径]\n"); printf("如:decryption F:\ciper_2_1.txt F:\plain.txt\n"); } //判断程序输入参数是否正确 if((fp_ciper=fopen(argv[1],"r"))==NULL) { printf("打开密文出错!解密失败\n"); exit(0); } while((ch_ciper=fgetc(fp_ciper))!=EOF) switch(ch_ciper) { case 'A':num[0]=num[0]+1; break; //统计密文各字母出现次数 case 'B':num[1]=num[1]+1; break; //与上同,下边一样 case 'C':num[2]=num[2]+1; break; case 'D':num[3]=num[3]+1; break; case 'E':num[4]=num[4]+1; break; case 'F':num[5]=num[5]+1; break; case 'G':num[6]=num[6]+1; break; case 'H':num[7]=num[7]+1; break; case 'I':num[8]=num[8]+1; break; case 'J':num[9]=num[9]+1; break; case 'K':num[10]=num[10]+1;break; case 'L':num[11]=num[11]+1;break; case 'M':num[12]=num[12]+1;break; case 'N':num[13]=num[13]+1;break; case '0':num[14]=num[14]+1;break; case 'P':num[15]=num[15]+1;break; case 'Q':num[16]=num[16]+1;break; case 'R':num[17]=num[17]+1;break; case 'S':num[18]=num[18]+1;break; case 'T':num[19]=num[19]+1;break; case 'U':num[20]=num[20]+1;break; case 'V':num[21]=num[21]+1;break; case 'W':num[22]=num[22]+1;break; case 'X':num[23]=num[23]+1;break; case 'Y':num[24]=num[24]+1;break; case 'Z':num[25]=num[25]+1;break; } fclose(fp_ciper); for(i=0;i<26;i++) if(num[i]>temp) { j=i; // 求出最大次数的下下标 temp=num[i]; } if(j<5) key=(j+1+26)-5; //是按字母表的第几位计算 //而不是按下标,故加1 //5是指E在字母表中的位序 else key=(j+1)-5; if((fp_ciper=fopen(argv[1],"r"))==NULL) { printf("再次打开密文出错!解密失败\n"); exit(0); } //再次打开密文,进行解密 if((fp_plain=fopen(argv[2],"w"))==NULL) { printf("打开或建立明文文件出错!解密失败\n"); exit(0); } //把明文存到此文件 while((ch_ciper=fgetc(fp_ciper))!=EOF) { if(ch_ciper > 'E') ch_plain=(((ch_ciper-'A'-key)%26)+'A'); //解密 else ch_plain=(((ch_ciper-'A'-key+26)%26)+'A'); //解密 ch_plain=tolower(ch_plain); //把大写明文转化为小写 fputc(ch_plain,fp_plain); //把明文写到文件文件plain } fclose(fp_ciper); fclose(fp_plain); printf("解密成功,密钥KEY=%d,明文已保存到文件中,谢谢使用!\n",key); } |
地主 发表时间: 04-09-18 14:12 |
![]() | 回复: hackerjune [hackerjune] ![]() |
登录 |
密文我不明白`` |
B1层 发表时间: 04-09-18 19:56 |
![]() | 回复: pengbing [pengbing] ![]() |
登录 |
好东西!顶!了!![]() |
B2层 发表时间: 04-09-18 20:22 |
![]() | 回复: 286 [unique] ![]() |
登录 |
加密过程: 密文:C=M+K (mod 26) 解密过程: 明文:M=C-K (mod 26) 据我所知,凯撒密文中K是等于3,否则就叫移位密码。(前者是后者的特例),怎么程序还需要统计字母频率?那不成了替代密码破解了吗? BTW: switch(ch_ciper) { case 'A':num[0]=num[0]+1; break; //统计密文各字母出现次数 case 'B':num[1]=num[1]+1; break; //与上同,下边一样 case 'C':num[2]=num[2]+1; break; case 'D':num[3]=num[3]+1; break; case 'E':num[4]=num[4]+1; break; case 'F':num[5]=num[5]+1; break; case 'G':num[6]=num[6]+1; break; case 'H':num[7]=num[7]+1; break; case 'I':num[8]=num[8]+1; break; case 'J':num[9]=num[9]+1; break; case 'K':num[10]=num[10]+1;break; case 'L':num[11]=num[11]+1;break; case 'M':num[12]=num[12]+1;break; case 'N':num[13]=num[13]+1;break; case '0':num[14]=num[14]+1;break; case 'P':num[15]=num[15]+1;break; case 'Q':num[16]=num[16]+1;break; case 'R':num[17]=num[17]+1;break; case 'S':num[18]=num[18]+1;break; case 'T':num[19]=num[19]+1;break; case 'U':num[20]=num[20]+1;break; case 'V':num[21]=num[21]+1;break; case 'W':num[22]=num[22]+1;break; case 'X':num[23]=num[23]+1;break; case 'Y':num[24]=num[24]+1;break; case 'Z':num[25]=num[25]+1;break; } 可优化为: num[ch_ciper-'A']++; |
B3层 发表时间: 04-09-20 09:00 |
![]() | 回复: hackerjune [hackerjune] ![]() |
登录 |
恩 |
B4层 发表时间: 04-10-07 06:59 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号