回 帖 发 新 帖 刷新版面

主题:密码算法<解密>

#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);  

回复列表 (共1个回复)

沙发

这几天研究这个密码算法.想想用QB表示出来呀.

一直看..到现在为止,还不知道这个密码到底是什么样的?????

我来回复

您尚未登录,请登录后再回复。点此登录或注册