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

📄 hill.cpp

📁 各种加密解密算法,包括hill,vijinia和置换加密等,实现txt文本加解密
💻 CPP
字号:
#include<iostream>
#include<fstream>
using namespace std;

#define num 26
#define name_long 10
#define key_num 3
int table[2][key_num][key_num];
int key[2][key_num][key_num];
int fre_m[26];
int fre_c[26];
double long out[26];
int all=0;
int realnum;
void input();
void cry();
void dec();
void main()
{
	cout<<"请选择加密矩阵0(2*2)   1(3*3):"<<endl;
	cin>>realnum;
	double long total_fre=0;
	input();
	cry();
	for(int i=0;i<26;i++)
	{
		out[i]=((double long)fre_m[i]/(double long)all);
		cout<<"字母"<<(char)(i+97)<<"出现的概率是"<<out[i]<<endl;
		total_fre=total_fre+out[i]*out[i];
	}
	cout<<"重合指数为"<<total_fre<<endl;
	for(i=0;i<26;i++)
		out[i]=0;
	total_fre=0;
	for( i=0;i<26;i++)
	{
		out[i]=((double long)fre_c[i]/(double long)all);
		cout<<"字母"<<(char)(i+97)<<"出现的概率是"<<out[i]<<endl;
		total_fre=total_fre+out[i]*out[i];
	}
	cout<<"重合指数为"<<total_fre<<endl;
	
	dec();
	
}
void input()
{
    fstream   file("key.txt",fstream::in); 
    if(!file)   cout<<"error"<<endl;  
	for(int i=0;i<key_num;i++)
		for(int j=0;j<key_num;j++)
			file>>table[1][i][j];
	for(i=0;i<key_num-1;i++)
		for(int j=0;j<key_num-1;j++)
			file>>table[0][i][j];
	
		file.close;
		fstream   file1("dec.txt",fstream::in); 
		if(!file1)   cout<<"error"<<endl;  
		for(i=0;i<key_num;i++)
			for(int j=0;j<key_num;j++)
				file1>>key[1][i][j];
		for(i=0;i<key_num;i++)
			for(int j=0;j<key_num-1;j++)
				file1>>key[0][i][j];

			file1.close;
			
}
void cry()
{
	FILE *fp1,*fp2;
	char file_name_1[name_long];
	char file_name_2[name_long];
	char ch;
	char cher;
	char in[key_num],out[key_num];
	int innum[key_num],outnum[key_num];
	int i=0,f=0;
	cout<<"请输入你要加密的文件:"<<endl;
	cin>>file_name_1;
	cout<<"请输入你要写入的文件:"<<endl;
	cin>>file_name_2;
	fp1=fopen(file_name_1,"r");
	fp2=fopen(file_name_2,"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]++;
				in[i]=ch;
				innum[i]=(int)in[i]-97;
				i++;
				if(i==realnum+2)
				{
					for(int m=0;m<key_num;m++)
						outnum[m]=0;
					for(int h=0;h<key_num;h++)
					{
						i=0;
						for(int j=0;j<realnum+2;j++)
							outnum[h]=(outnum[h]+table[realnum][h][j]*innum[j])%26;
					}					
					for(int j=0;j<realnum+2;j++)
					{
						out[j]=(char)(outnum[j]+97);
						cher=out[j];
					//	cout<<cher;
						f=(int)(cher-97);
						fre_c[f]++;
						fputc(cher,fp2);
					}
				}
			}
			else
			{
				//cout<<ch;
				fputc(ch,fp2);
			}
		}
		if((ch=fgetc(fp1))==-1)
			for(int x=0;x<i;x++)
			{
//				cout<<in[x];
				fputc(in[x],fp2);
			}

		fclose(fp1);
		fclose(fp2);
}


void dec()
{
	FILE *fp1,*fp2;
	char file_name_1[name_long];
	char file_name_2[name_long];
	char ch;
	char cher;	
	char in[key_num],out[key_num];
	int innum[key_num],outnum[key_num];
	int i=0;
	cout<<"请输入你要解密的文件:"<<endl;
	cin>>file_name_1;
	cout<<"请输入你要写入的文件:"<<endl;
	cin>>file_name_2;
	fp1=fopen(file_name_1,"r");
	fp2=fopen(file_name_2,"w");
	if(fp2==NULL)
		cout<<"对不起,要写的文件不能打开"<<endl;
	if(fp1==NULL)
		cout<<"对不起,要解密文件不能打开"<<endl;
	else
		while((ch=fgetc(fp1))!=EOF)
		{			
			if(ch>='a'&&ch<='z')
			{
				in[i]=ch;
				innum[i]=(int)in[i]-97;
				i++;
				if(i==realnum+2)
				{
					for(int m=0;m<realnum+2;m++)
						outnum[m]=0;
					for(int h=0;h<realnum+2;h++)
					{
						i=0;
						for(int j=0;j<realnum+2;j++)
							outnum[h]=(outnum[h]+key[realnum][h][j]*innum[j])%26;
					}					
					for(int j=0;j<realnum+2;j++)
					{
						out[j]=(char)(outnum[j]+97);
						cher=out[j];
		//				cout<<cher;
						fputc(cher,fp2);
					}
				}
			}
			else
			{
	//			cout<<ch;
				fputc(ch,fp2);
			}
		}
		if((ch=fgetc(fp1))==-1)
			for(int x=0;x<i;x++)
			{
//				cout<<in[x];
				fputc(in[x],fp2);
			}

		fclose(fp1);
		fclose(fp2);
}




⌨️ 快捷键说明

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