?? vigenere_cipher.cpp
字號:
// VigenereCipher 密碼分析程序
#include <iostream.h>
#include "math.h"
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"string.h"
void LetterFrequence(char ch1[500]);
void KeyDistance(char ch2[500]);
int main()
{
char ch[500]={"KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXRGUDDKOTFMBPVGEGLTGCKQRACQCWDNAWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJVAJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGSFRLSWCWSJTBHAFSIASPRJAHKJRJUMVGKMITZHFPDISPZLVLGWTFPLKKEBDPGCEBSHCTJRWXBAFSPEZQNRWXCVYCGAONWDDKACKAWBBIKFTIOVKCGGHJVLNHIFFSQESVYCLACNVRWBBIREPBBVFEXOSCDYGZWPFDTKFQIYCWHJVLNHIQIBTKHJVNPIST"};
char *pp = ch;
KeyDistance(pp); // Kasiski測試法
LetterFrequence(pp); // 重合指數法
return 0;
}
/************************* Kasiski測試法 *********************/
void KeyDistance(char ch2[500])
{
cout<<"\n\n Kasiski測試法\n\n";
int count[50];
int i =0, j = 0, k = 0;
while(ch2[i])
{
j = i+1;
while(ch2[j])
{
if(ch2[j]==ch2[i]&&ch2[j+1]==ch2[i+1]&&ch2[j+2]==ch2[i+2]&&ch2[j+3]==ch2[i+3])
{
count[k]=j-i;
k++;
cout<<k<<" "<<i<<" "<<j<<" "<<ch2[i]<<ch2[i+1]<<ch2[i+2]<<ch2[i+3]<<" "<<count[k-1]<<"\n";
}
else if(ch2[j]==ch2[i]&&ch2[j+1]==ch2[i+1]&&ch2[j+2]==ch2[i+2]&&ch2[j+3]!=ch2[i+3])
{
count[k]=j-i;
k++;
cout<<k<<" "<<i<<" "<<j<<" "<<ch2[i]<<ch2[i+1]<<ch2[i+2]<<" "<<count[k-1]<<"\n";
}
j++;
}
i++;
}
}
/************************** *********************/
void LetterFrequence(char ch1[500])
{
cout<<"\n\n 重合指數法\n\n";
/******************* 1. 密文字母頻數統計 *********************/
double a[26],b1[26];
double iy = 0;
int i = 0,k = 0;
char p = 65;
double count=0;
cout<<"1.密文字母頻數統計:\nFrequence: ";
for(int j=0; j<26; j++)
{
i = 0;
int number = 0;
while(ch1[i])
{
if(ch1[i]==p)
number++;
i++;
}
count=count+number;
a[k++]=number;
cout<<p<<":"<<number<<" ";
p=p+1;
}
cout<<"\nTotal number: "<<count;
cout<<"\n\n";
/********************* 2.密鑰長度計算 **************************/
for(int n=0; n<26; n++)
{
iy+=(a[n]*(a[n]))/(count*(count));
}
cout<<"\n2.密鑰長度計算:\nI(Y) = "<<iy<<"\n";
double d = 0.027*count/((count-1)*iy-0.0385*count+0.0655);
cout<<"d = "<<d<<"\n\n";
cout<<"\n\n";
/********************* 3.求解密鑰 *******************************/
i=0;
double mg=0;
double pro[26] = {0.063, 0.0105, 0.023, 0.035, 0.105, 0.0225, 0.011, 0.047, 0.055, 0.001, 0.003, 0.02, 0.021, 0.059, 0.0654, 0.0175, 0.001, 0.054, 0.052, 0.072, 0.0225, 0.008, 0.012, 0.002, 0.012, 0.001};
cout<<"\n\n3.求解密鑰\n";
for(int i11=0; i11<6; i11++)
{
double a1[26];
double iy1 = 0;
int i1 = 0,k1 = 0;
char p1 = 65;
double count1=0;
cout<<"\nFrequence"<<i11<<": ";
for(int j1=0; j1<26; j1++)
{
char pp1='A';
i1 = i11;
int number1 = 0;
while(ch1[i1])
{
char c=ch1[i1];
if(c>90)
c=64+(c%90);
if(c==p1)
number1++;
i1+=6;
}
p1=p1+1;
count1=count1+number1;
a1[k1++]=number1;
pp1+=j1;
cout<<pp1<<":"<<number1<<" ";
}
cout<<"\nPart number: "<<count1;
cout<<"\n\n";
for(i=0; i<26; i++)
{
iy1=0;
for(int n=0; n<26; n++)
{
int rr = (n+i)%26;
iy1+=(a1[n]*(pro[rr]/0.8))/(count1);
}
cout<<"k"<<i<<":"<<iy1<<"; ";
if((i+1)%5==0)
cout<<"\n";
}
cout<<"\n\n";
}
/********************* 4.密文和解密后的明文 ******************************/
i = 0;
char ch3[500];
while(ch1[i])
{
char cc=ch1[i]+24; //24
if(cc>90&&i<count)
ch3[i++]=64+(cc%90);
else if(i<count)
ch3[i++]=cc;
cc=ch1[i]+9; //9
if(cc>90&&i<count)
ch3[i++]=64+(cc%90);
else if(i<count)
ch3[i++]=cc;
cc=ch1[i]+2; //2
if(cc>90&&i<count)
ch3[i++]=64+(cc%90);
else if(i<count)
ch3[i++]=cc;
cc=ch1[i]+11; //11
if(cc>90&&i<count)
ch3[i++]=64+(cc%90);
else if(i<count)
ch3[i++]=cc;
cc=ch1[i]+7; //7
if(cc>90&&i<count)
ch3[i++]=64+(cc%90);
else if(i<count)
ch3[i++]=cc;
cc=ch1[i]+12; //12
if(cc>90&&i<count)
ch3[i++]=64+(cc%90);
else if(i<count)
ch3[i++]=cc;
}
ch3[i]='\0';
cout<<"\n\n4.解密后的明文:\n"<<ch1<<"\n\n"<<ch3<<"\n\n\n";
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -