⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 破解Vigenere密码
💻
字号:
 密码学程序设计---破解Vigenere密码


第一部分  Kasiski测试



#include <iostream.h>
#define error 0
#define ok 1




int streaminput(char* &c,int &length)               //串输入
{
int i;
cout<<"请输入明文的长度:"<<endl;
cin>>length;
c=new char [length];
    cout<<"请输入明文:"<<endl;
for(i=0;i<length;i++) cin>>c;
    return ok;
}




int streamoutput(char* c,int length)               //串输出
{
int i;
for(i=0;i<length;i++) cout<<c;
    cout<<endl;
return ok;
}



int search(char* c,int length)   //用字符串头2个和3个字母组寻找相同字母组
{
     int i;
  for(i=1;i<length-1;i++)
  {
   if((c[0]==c)&&(c[1]==c[i+1]))
   {
    cout<<"第"<<i+1<<"个位置与"<<c[0]<<c[1]<<"字母组重复."<<endl;
    cout<<"它们之间的距离是"<<i<<endl;
   }
  }
     for(i=1;i<length-2;i++)
  {
   if((c[0]==c)&&(c[1]==c[i+1])&&(c[2]==c[i+2]))
         {
    cout<<"第"<<i+1<<"个位置与"<<c[0]<<c[1]<<c[2]<<"字母组重复."<<endl;
             cout<<"它们之间的距离是"<<i<<endl;
   }
  }
  return ok;
}



int searchall(char* c,int length)  //遍历所有的子字符串
{
int i, j;
char* c1;
search(c,length);
for(i=1;i<length-3;i++)
{
  
  c1=new char[length-i];
         for(j=0;j<length-i;j++)
   {
    c1[j]=c[i+j];
         }

  search(c1,length-i);
     delete c1;
}
return ok;
}



             
     void main()



{
      char* c;
   int length;
   streaminput(c,length);
      searchall(c,length);
}
第二部分 系数统计

#include <iostream.h>
#define ok 1
#define error 0

int input(char* &c,int length)
{
int i;
c=new char[length];
cout<<"请输入字符串:"<<endl;
for(i=0;i<length;i++)
  cin>>c;
    return ok;
}

int output(int* result)
{
int i;
for(i=0;i<26;i++)
{
  cout<<result<<" ";
}
    return ok;
}


int jude(char* c,int length,int* &result)
{
int i,j;
result=new int[26];
for(i=0;i<26;i++)
{result=0;}

for(i=0;i<26;i++)
  for(j=0;j<length;j++)
  {
   if(((int)c[j]-97)==i)
    result++;
  }
    return ok;
}

void main()
{
     char* c;
     int* result;
     int length;
     cout<<"请输入每列的长度:"<<endl;
     cin>>length;  
     input(c,length);
     jude(c,length,result);
     output(result); 
}

第三部分 chi测试

#include <iostream.h>
#define ok 1
#define error 0

int input(int* &chi)
{
int i;
chi=new int[26];
cout<<"请输入测试系数:"<<endl;
for(i=0;i<26;i++)
  cin>>chi;
    return ok;
}

int output(int* chi)
{
int i;
for(i=0;i<26;i++)
{
  cout<<chi<<" ";
}
return ok;
}

int CHItest(int* chi1,int* chi2)
{
    int length1=0,length2=0,i;
double result=0;
    for(i=0;i<26;i++)
{
  length1=length1+chi1;
}
for(i=0;i<26;i++)
{
  length2=length2+chi2;
}

for(i=0;i<26;i++)
{
  
  if((chi1!=0)&&(chi2!=0))
        {   
   result=result+((double)chi1*(double)chi2)/((double)length1*(double)length2);
  }
}
cout<<"CHI测试结果为:"<<result<<endl;
    return ok;
}

int move(int* &chi,int movevalue)
{
    int i;
int* temp;
temp=new int[26];
for(i=0;i<26;i++)
{
  temp=chi;
}
    for(i=movevalue;i<26;i++)
  chi=temp[i-movevalue];
for(i=0;i<movevalue;i++)
  chi=temp[26-movevalue+i];
return ok;
}

int CHIall(int* chi1,int* chi2)
{
int i;
    

for(i=1;i<=25;i++)
{
  move(chi2,1);
  output(chi2);
  cout<<"第"<<i<<"组"<<endl;
  CHItest(chi1,chi2);
}
return ok;
}


      void main()
   {
    int* chi1;
    int* chi2;
    input(chi1);
    input(chi2);
    CHIall(chi1,chi2);
   }
第四部分 密文转明文

#include <iostream.h>
#define ok 1
#define error 0


int streaminput(char* &c,int &length)               //串输入
{
int i;
cout<<"请输入密文的长度:"<<endl;
cin>>length;
c=new char [length];
    cout<<"请输入密文:"<<endl;
for(i=0;i<length;i++) cin>>c;
    return ok;
}

int streamoutput(char* c,int length)               //串输出
{
int i;
for(i=0;i<length;i++) cout<<c;
    cout<<endl;
return ok;
}

int transformstream(char* c1,char* &c2,int length)
{
int i,j;
    int* key;
int keylength;
cout<<"请输入密钥的长度:"<<endl;
cin>>keylength;
key=new int[keylength];
c2=new char[length];
for(i=0;i<keylength-1;i++)
{
cout<<"请输入密钥第"<<i+2<<"位相对第1位位置:"<<endl;
cin>>key;
}

for(j=0;j<keylength-1;j++)
{

       for(i=j+1;i<length;i+=keylength)
    {
            c2=(char)(((int)c1-97+key[j])%26+97);
    }
       for(i=0;i<length;i+=keylength)
    {
      c2=c1;
    }
    }
return ok;

}

int DK(char* c1,int length)
{
char* c2;
int i,j;
int temp;
c2=new char[length];
for(i=0;i<26;i++)
{
  for(j=0;j<length;j++)
  {
            {
   if(((int)c1[j]-97-i)<0)
    temp=(int)c1[j]-97-i+26;
   else
    temp=(int)c1[j]-97-i;
   }
   c2[j]=(char)(temp%26+97);
  }
   streamoutput(c2,length);
}

  return ok;

}


void main()
{
char* c1;
char* c2;
int length;
streaminput(c1,length);
    transformstream(c1,c2,length);
DK(c2,length);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -