破解vigenere密码算法C++版.....

cpp 代码

  1. // P40第9题   
  2. // 破解vigenere密码课本P15—2.3.3所用的算法   
  3. //   
  4. #include<stdio.h>   
  5. #include<math.h>   
  6. //寻找密钥长度   
  7. int find_key_lenth(char*pass,int len)     
  8. {   
  9.     //pass密文,len 密文长度;移位统计相等的密文,取其最大的步数为d;   
  10.     int d=0,count,MaxCount=0;   
  11.     for(int step=1;step<10;step++)      //移动步数从1-10;   
  12.     {   
  13.         count=0;                           
  14.         for(int j=0;j<len&&(j+step)<len;j++)   
  15.         {   
  16.             if(pass[j]==pass[j+step])      
  17.                 count++;   
  18.         }   
  19.         if(count>MaxCount)   
  20.         {   
  21.             MaxCount=count;   
  22.             d=step;   
  23.         }   
  24.     }   
  25.     return d;   
  26. }   
  27. // 发现密钥并解密。。。   
  28. void decode(char*pass,char*ming,int d,int len)   
  29. {   
  30.     float v[26]={0};               //V或W向量组;   
  31.     int per_len=len/d;             //每组长度;   
  32.     double A[26]={0.082,0.015,0.028,0.043,0.127,              //英文字母频率表A   
  33.               0.022,0.02,0.061,0.07,0.002,0.008,   
  34.               0.04,0.024,0.067,0.075,0.019,0.001,   
  35.               0.06,0.063,0.091,0.028,0.01,0.023,0.001,0.02,0.001};   
  36.                       
  37.     double B[26]={0};              //存储W*A值   
  38.     char*key;                      //密钥   
  39.     key=new char[d];     
  40.     for(int i=0;i<d;i++)   
  41.     {   
  42.         int j=0;   
  43.         while(true)                     //统计每组a–z出现的频率存在V[26]中   
  44.         {   
  45.             if((i+d*j)>=len) break;   
  46.             v[pass[i+d*j]-‘a’]+=1;   
  47.             j++;               
  48.         }              
  49.         for(int k=0;k<26;k++)          //计算W   
  50.             v[k]=v[k]/per_len;   
  51.   
  52.         for(k=0;k<26;k++)              //计算B[i]=Ai*V;   
  53.         {   
  54.             for(int l=0;l<26;l++)         
  55.                 B[k]+=A[l]*v[(l+k)%26];        
  56.         }   
  57.         //找出B中的与0.065最接近的值其的下标即为密钥   
  58.         double max=1;                       
  59.         int c;   
  60.         for(k=0;k<26;k++)               
  61.         {      
  62.             if(fabs(B[k]-0.065)<max)   
  63.             {   
  64.             max=fabs(B[k]-0.065);c=k;          
  65.             }   
  66.         }   
  67.         key[i]=c;           
  68.         //清空B,V;   
  69.         for(k=0;k<26;k++)   
  70.         {   
  71.             B[k]=0;   
  72.             v[k]=0;   
  73.         }   
  74.         printf(“%c”,’a’+key[i]);   
  75.     }      
  76.     //解密并显示   
  77.     printf(“\n\n明文:\n”);   
  78.     for(i=0;i<len;i++)   
  79.     {   
  80.       int tmp;   
  81.       tmp=pass[i]-‘a’;   
  82.       ming[i]=(tmp-key[i%d]+26)%26+’a’;   
  83.       printf(“%c”,ming[i]);   
  84.     }    
  85.     printf(“\n\n”);    
  86.     return ;   
  87. }   
  88. int main()   
  89. {   
  90.     char password[1000]={0}; //密文   
  91.     char mingwen[1000]={0};  //明文   
  92.     FILE* fp;   
  93.     if((fp=fopen(“xkju.txt”,“r+”))==NULL)   
  94.     {   
  95.         printf(“xkju.txt open error!\n”);   
  96.         return 1;   
  97.     }   
  98.     int i=0,d;   
  99.     printf(“密文:”);   
  100.     while((password[i++]=fgetc(fp))!=EOF);   
  101.     for(int j=0;j<i;j++)   
  102.     {   
  103.         if(j%59==0) printf(“\n”);   
  104.         printf(“%c”,password[j]);   
  105.     }     
  106.     d=find_key_lenth(password,i-1);   
  107.     printf(“\n\nd==%d\n”,d);   
  108.     printf(“key=”);   
  109.     decode(password,mingwen,d,i-1);     
  110.     fclose(fp);   
  111.     return 0;   
  112. }   

发现指针有指针的好处,有好多问题都是JAVA不太方便处理的

    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/justaphper/article/details/83172752
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞