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

📄 sceret.cpp

📁 各种加密解密算法,包括hill,vijinia和置换加密等,实现txt文本加解密
💻 CPP
字号:
#include<iostream>
#include<fstream>
using namespace std;
#define num 26
#define name_long 10
#define length 9
#define key_length 7
int fre_m[26];
int fre_c[26];
char table[num+1][num+1];
char key[length];
char get[key_length];
int keyz[key_length];
int keyz_back[key_length];
int order[length];
int xo=0,f;
char file_name[2][name_long];
int all=0;
double long out[26];
int num1=0;

void input();
void getkey();
void fresh();
void cry_v();
void cry_z();
void dec_v();
void dec_z();

void main()
{
	double long total_fre=0;
	int t;
    cout<<"进行多少次迭代?"<<endl;
	cin>>t;
	input();
	getkey();
	for(int i=0;i<t;i++)
	{
		cry_v();
		if(num1==0)
		{
			for(int j=0;j<26;j++)
			{
				out[j]=((double long)fre_m[j]/(double long)all);
				cout<<"字母"<<(char)(j+97)<<"出现的概率是"<<out[j]<<endl;
				total_fre=total_fre+out[j]*out[j];
			}
			cout<<"重合指数为"<<total_fre<<endl;
		}
		cry_z();
		for(int j=0;j<26;j++)
			out[j]=0;
		total_fre=0;
		if(num1==t-1)
		{
			for(int j=0;j<26;j++)
			{
				out[j]=((double long)fre_c[j]/(double long)all);
				cout<<"字母"<<(char)(j+97)<<"出现的概率是"<<out[j]<<endl;
				total_fre=total_fre+out[j]*out[j];
			}
			cout<<"重合指数为"<<total_fre<<endl;
		}
		num1++;
		
	}
	for(i=0;i<t;i++)
	{
		dec_z();
		dec_v();
	}
	
}

void fresh()
{
	for(int i=0;i<26;i++)
		fre_m[i]=fre_c[i]=0;
	all=0;
}
void input()
{
    fstream   file("change.txt",fstream::in); 
    if(!file)   cout<<"error"<<endl;  
	for(int i=0;i<num+1;i++)
		for(int j=0;j<num+1;j++)
			file>>table[i][j];
		file.close;
		fstream   file1("zchange.txt",fstream::in); 
		if(!file1)   cout<<"error"<<endl;  
		for(i=0;i<key_length;i++)
			file1>>keyz[i];
		for(i=0;i<key_length;i++)
			file1>>keyz_back[i];
		file1.close;
		cout<<"请输入你要维吉尼亚加密的文件:"<<endl;
		cin>>file_name[0];
		cout<<"请输入你要维吉尼亚加密写入的文件:"<<endl;
		cin>>file_name[1];
		
}
void getkey()
{
	cout<<"请输入一个"<<length<<"位的维吉尼亚密钥"<<endl;
	for(int i=0;i<length;i++)
	{
		cin>>key[i];
		for(int x=0;x<num+1;x++)
			if(table[x][0]==key[i])
			{
				order[i]=x;
				break;
			}
	}
}

void cry_v()
{
	fresh();
	FILE *fp1,*fp2;
	char ch;
	char cher;
	int x,y,h=0;
	fp1=fopen(file_name[0],"r");
	fp2=fopen(file_name[1],"w");
	if(fp2==NULL)
		cout<<"对不起,要写的文件不能打开"<<endl;
	if(fp1==NULL)
		cout<<"对不起,要读的文件不能打开"<<endl;
	else
		while((ch=fgetc(fp1))!=EOF)
		{	
			if(ch>='a'&&ch<='z')
			{
				all++;
				f=(int)(ch-97);
				fre_m[f]++;
				x=order[h];
				for(y=0;y<num+1;y++)
					if(ch==table[0][y])
						break;
					h=(h++)%length;
					if(h==length)
						h=0;
					cher=table[x][y];
				//	cout<<cher;
					fputc(cher,fp2);
				
			}
			else if(ch>='A'&&ch<='Z')
			{
				all++;
				f=(int)(ch-65);
				fre_m[f]++;
				x=order[h];
				for(y=0;y<num+1;y++)
					if((ch+32)==table[0][y])
						break;
					h=(h++)%length;
					if(h==length)
						h=0;
					cher=table[x][y];
			//		cout<<cher;
					fputc(cher,fp2);
			}
			else
			{
			//	cout<<ch;
				fputc(ch,fp2);
			}
		}
		fclose(fp1);
		fclose(fp2);
}
void cry_z()
{
	fresh();
	FILE *fp1,*fp2;
	char ch;
	char cher;
	int h=0;
	fp1=fopen(file_name[1],"r");
	fp2=fopen(file_name[0],"w");
	if(fp2==NULL)
		cout<<"对不起,要写的文件不能打开"<<endl;
	if(fp1==NULL)
		cout<<"对不起,要读的文件不能打开"<<endl;
	else
		while((ch=fgetc(fp1))!=EOF)
		{	
			get[h]=ch;
			h=(h++)%key_length;
			if(h==key_length)
			{
				for(int i=0;i<key_length;i++)
				{
					cher=get[keyz_back[i]];
	//				cout<<cher;
					fputc(cher,fp2);
					if(cher>='a'&&cher<='z')
					{	
					all++;
					f=(int)(cher-97);
					fre_c[f]++;
					}
					else if(cher>='A'&&cher<='Z')
					{
						all++;
						f=(int)(cher-65);
						fre_c[f]++;				
					}
				}
				h=0;
			}
			
		}
		if((ch=fgetc(fp1))==-1)
			for(int i=0;i<h;i++)
			{
		//		cout<<get[i];
				fputc(get[i],fp2);
				all++;
				f=(int)(get[i]-65);
				fre_c[f]++;	

			}
			
			fclose(fp1);
			fclose(fp2);
}


void dec_v()
{
	FILE *fp1,*fp2;
	char ch;
	char cher;	
	int i=0;
	fp1=fopen(file_name[1],"r");
	fp2=fopen(file_name[0],"w");
	if(fp2==NULL)
		cout<<"对不起,要写的文件不能打开"<<endl;
	if(fp1==NULL)
		cout<<"对不起,要解密文件不能打开"<<endl;
	else
	{
		while((ch=fgetc(fp1))!=EOF)
		{
			if(ch>='a'&&ch<='z')
			{
				for(int j=0;j<num+1;j++)
					if((char)((int)ch-32)==table[order[i]][j])
					{
						cher=table[0][j];
	//					cout<<cher;
						fputc(cher,fp2);
						i=(i++)%length;
						if(i==length)
							i=0;
						break;
					}
			}		
			else if(ch>='A'&&ch<='Z')
			{
				for(int j=0;j<num+1;j++)
					if(ch==table[order[i]][j])
					{
						cher=table[0][j];
//						cout<<cher;
						fputc(cher,fp2);
						i=(i++)%length;
						if(i==length)
							i=0;
						break;
					}
			}
			else
			{
			//	cout<<ch;
				fputc(ch,fp2);
			}
		}
		fclose(fp1);
		fclose(fp2);
	}
}
void dec_z()
{
	FILE *fp1,*fp2;
	char ch;
	char cher;	
	int h=0;
	fp1=fopen(file_name[0],"r");
	fp2=fopen(file_name[1],"w");
	if(fp2==NULL)
		cout<<"对不起,要写的文件不能打开"<<endl;
	if(fp1==NULL)
		cout<<"对不起,要解密文件不能打开"<<endl;
	else
	{
		while((ch=fgetc(fp1))!=EOF)
		{
			get[h]=ch;
			h=(h++)%key_length;
			if(h==key_length)
			{
				for(int i=0;i<key_length;i++)
				{	cher=get[keyz[i]];
//				cout<<cher;
				fputc(cher,fp2);
				}
				h=0;
			}
		
		}
		if((ch=fgetc(fp1))==-1)
			for(int i=0;i<h;i++)
			{
//				cout<<get[i];
				fputc(get[i],fp2);
			}
			fclose(fp1);
			fclose(fp2);
	}
}

⌨️ 快捷键说明

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