📄 playfair.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
char token[2];
char character_matrix[5][5];//字符矩阵
char character[]="abcdefghiklmnopqrstuvwxyz";
FILE *in;
FILE *mingwen;
FILE *miwen;
void judge_A_or_a(char chr,FILE *p,char chr1)
{
char bh;
if(65<=chr&&chr<=90)
{
chr1=toupper(chr1);
bh=chr1;
fputc(bh,p);
}
else
{
bh=chr1;
fputc(bh,p);
}
}
void playfair(char ch1,char ch2,int n)
{
int i1,i2,j1,j2;
if(n==1)
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(ch1==character_matrix[i][j]||ch1==toupper(character_matrix[i][j]))
{
i1=i;j1=j;
}
if(ch2==character_matrix[i][j]||ch2==toupper(character_matrix[i][j]))
{
i2=i;j2=j;
}
}
if(i1==i2)
{
j1=(j1+1)%5;
j2=(j2+1)%5;
judge_A_or_a(ch1,miwen,character_matrix[i1][j1]);
judge_A_or_a(ch2,miwen,character_matrix[i2][j2]);
}
if(j1==j2)
{
i1=(i1+1)%5;
i2=(i2+1)%5;
judge_A_or_a(ch1,miwen,character_matrix[i1][j1]);
judge_A_or_a(ch2,miwen,character_matrix[i2][j2]);
}
if(j1!=j2&&i1!=i2)
{
judge_A_or_a(ch1,miwen,character_matrix[i1][j2]);
judge_A_or_a(ch2,miwen,character_matrix[i2][j1]);
}
}
if(n==2)
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(ch1==character_matrix[i][j]||ch1==toupper(character_matrix[i][j]))
{
i1=i;j1=j;
}
if(ch2==character_matrix[i][j]||ch2==toupper(character_matrix[i][j]))
{
i2=i;j2=j;
}
}
if(i1==i2)
{
j1=(j1+4)%5;
j2=(j2+4)%5;
judge_A_or_a(ch1,mingwen,character_matrix[i1][j1]);
judge_A_or_a(ch2,mingwen,character_matrix[i2][j2]);
}
if(j1==j2)
{
i1=(i1+4)%5;
i2=(i2+4)%5;
judge_A_or_a(ch1,mingwen,character_matrix[i1][j1]);
judge_A_or_a(ch2,mingwen,character_matrix[i2][j2]);
}
if(j1!=j2&&i1!=i2)
{
judge_A_or_a(ch1,mingwen,character_matrix[i1][j2]);
judge_A_or_a(ch2,mingwen,character_matrix[i2][j1]);
}
}
}
void scanner(FILE *Mingwen,int n)//观测字符串的结果
{
char ch;
fseek(Mingwen, 0, SEEK_SET);
while((ch=fgetc(Mingwen))!=EOF)//fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF.
{
if(isalpha(ch))//isalpha(ch)功能:如果参数是字母字符,函数返回非零值,否则返回零值。
{
token[0]=ch;
ch=fgetc(Mingwen);
while(1)
{
if(isalpha(ch))
{
token[1]=ch;
break;
}
if(ch==EOF)
{
if(token[0]='z')
token[1]='A';
else
token[1]='Z';
break;
}
else
{
ch=fgetc(Mingwen);
}
}
if(token[0]=='j'||token[0]=='J')
token[0]='i';
if(token[1]=='j'||token[1]=='J')
token[1]='i';
while(token[0]==token[1])
{ if(token[0]=='z'||token[0]=='Z')
token[1]='A';
else
token[1]='z';
playfair(token[0],token[1],n);
ch=fgetc(Mingwen);
if(ch=='j')ch='i';
if(ch==EOF)
{
if(token[0]=='z'||token[0]=='Z')
ch='A';
else
ch='z';
token[1]=ch;
}
}
playfair(token[0],token[1],n);
}
}
}
void characterfile()
{
char string[40];//密钥
printf("设定密钥:");
scanf("%s",string);
int num2=strlen(string);
int m=0;
for(int i=0;i<num2;i++)//第一层为密钥串
for(int t=m;t<26;t++)//第二层为字符矩阵
{ if(string[i]=='j')
string[i]='i';
if(string[i]==character[t])
{
for(int j=t;j>=m;j--)
{
if(j>m)
character[j]=character[j-1];
else
character[j]=string[i];
}
m++;
}
}
for(int n=0;n<26;n++)
{
if(n/5)
character_matrix[n/5][n%5]=character[n];
else
character_matrix[0][n]=character[n];
}
printf("字符矩阵: %s\n", character_matrix);
}
void inputfile()
{
char filename[30];
printf("输入文件名:");
scanf("%s",filename);
if((in=fopen(filename,"r"))==NULL)
{
printf("cannot open the file %s.\n",filename);
exit(1);
}
}
void main()
{
char ch='Y';
int sel;
while((ch!='N')&&(ch!='n'))
{
printf("--------------请选择相应操作--------------\n");
printf("1. 对信息进行加密 \n");
printf("2. 对密文进行解密 \n");
printf("3. 退出本程序 \n");
printf("----------------------------------------------\n");
scanf("%d",&sel);
switch(sel)
{
case 1:
characterfile();
inputfile();
miwen=fopen("miwen.txt","w+");
scanner(in,1);
fclose(in);
fclose(miwen);
break;
case 2:
characterfile();
inputfile();
mingwen=fopen("mingwen.txt","w+");
scanner(in,2);
fclose(in);
fclose(mingwen);
break;
case 3:exit(0);
default:
printf("提示;输入错误!");
break;
}
system("cls");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -