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