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

📄 vigenere_cipher.cpp

📁 Vigenere_Cipher_.zip 密码学经典加密解密算法 vc++实现
💻 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 + -