??
字號:
密碼學程序設計---破解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 + -