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

📄 cipher.cpp

📁 使用维吉尼亚密码进行控制台编程
💻 CPP
字号:
//维吉尼亚加密算法
#include"stdio.h"
#include"ctype.h"
#include"string.h"
#include"stdlib.h"
#define LEN 2000

char * Vigenere_encrypt(char k[],char plain[]); //维吉尼亚加密函数声明
char * Vigenere_decrypt(char k[],char cipher[]); //维吉尼亚解密函数声明

int main(int argc,char *argv[])     // 控制台函数
{	
	char plaintext[LEN],ciphertext[LEN],*key;
	char *cipher,*plain;
	char *argc1,*argc2;
	
	FILE *in,*out;
	
	argc1=argv[1];
	argc2=argv[2];
	
	if(argc!=6||(argc1[1]!='e'&&argc1[1]!='d')||(argc2[1]!='k')) //对命令输入的格式进行规定,错误退出
    {
        printf("命令输入错误,请按如此格式输入:\n");
        printf("程序名 e/d k key infile outfile\n");
        exit(0);
    }
    key=argv[3];    //对密钥进行验证,错误重新输入退出
    int t=0;
	for(;key[t]!='\0';t++)
	{
	   if(key[t]<97||key[t]>122)
	   {
	       printf("密钥输入错误!\n");
	       exit(0);
       }
    }
    if((in=fopen(argv[4],"r"))==NULL)      //判定文件是否已经打开
    {
        printf("cannot open the file!\n");
        exit(0);
    }
    if((out=fopen(argv[5],"w"))==NULL)   //判定文件是否已经打开
    {
        printf("cannot open the file!\n");
        exit(0);
    }
	if(argc1[1]=='e')          //调用加密函数进行加密
	{
	    fread(plaintext,LEN,1,in);
	    cipher=Vigenere_encrypt(key,plaintext);
        fwrite(cipher,LEN,1,out);
        	
    }
	else if(argc1[1]=='d')  //调用解密函数进行解密
	{
	   fread(ciphertext,LEN,1,in);
	   plain=Vigenere_decrypt(key,ciphertext);
	   fwrite(plain,LEN,1,out);
    }
	/*else       //对超出字符集的字符不做加密处理,保持不变
	{
        printf("You commend is wrong\n");
        exit(0);
    } */
    fclose(in);    //关闭文件
    fclose(out);
    return 0;
	
}	

char * Vigenere_encrypt(char k[],char plain[]) //加密算法函数
{	int m,n=0,l;
	char *ciph;
	ciph=(char *)malloc(LEN*sizeof(char));
	for(m=0,l=0;plain[m]!='\0';m++,l++)
	{	if(k[n]=='\0')
			n=0;	
		if(plain[m]>=97&&plain[m]<=122)	
		{ciph[l]=((plain[m]+k[n])%97)%26+65;
		 n++;
		
		}
		else if(plain[m]<=90&&plain[m]>=65)
		{ciph[l]=((plain[m]+k[n]-32)%65)%26+97;
		 n++;
		}
		else
        {ciph[l]=plain[m];
           n++;
            }
	}	
	ciph[l]='\0';
	return ciph;
	
}
char *Vigenere_decrypt(char k[],char cipher[])   //解密算法函数
{   int i,j,m=0,n;
    char *plaintext;
    plaintext=(char *)malloc(LEN*sizeof(char));
    for(i=0,j=0;cipher[i]!='\0';i++,j++)
    {   if(k[m]=='\0')
            m=0;
        if(cipher[i]>=97&&cipher[i]<=122)	
		{plaintext[j]=(cipher[i]-k[m]+26)%26+65;
		 m++;
		
		}
		else if(cipher[i]<=90&&cipher[i]>=65)
		{plaintext[j]=(cipher[i]-k[m]+58)%26+97;
		 m++;
		}
		else
        {plaintext[j]=cipher[i];
           m++;
        }
    }
    plaintext[j]='\0';
    return plaintext;
}





⌨️ 快捷键说明

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