?? 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 + -