📄 hill.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 + -