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