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

📄 playfair.cpp

📁 密码学实验自己编的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 + -