算法思路:
给出一串明文先判断是否在26个英文字母,然后用明文加上去密钥的得出的数值就是向后移位的位数,用此可以得出密文。而与这种方法相反得出解密的明文。判断给出的字母是不是在26个大小英文字母内,需保证是在26个字母内,使得明文,密钥,密文均在26个字母内。
注意:在编程过程中字符大小写的ACSII值是不同的。
例:明文是wearediscoveredsaveyourself;密钥是deceptive;编程实现对明文的加密及解密。密文是zicvtwqngrzgvtwavzhcqyglmgj。
#include <stdio.h>
void encryption()
{
int a,b,i=0,j=0;
char x[100],k[10],y[100];
printf("Please input the message:");
gets(x);
printf("\n");
printf("Please the key:");
gets(k);
printf("\n");
a=strlen(x);
b=strlen(k);
strlwr(k);
if(a>b)
{
for(i=0;i<a;i++)
{
y[i]=(x[i]+k[j]-97-97)%26+97;
printf("%c",y[i]);
j++;
if(j>=b)
{j=0;}
}
}
else
{for(i=0;i<a;i++)
{
y[i]=(x[i]+k[j]-97-97)%26+97;
printf("%c",y[i]);
j++;
}
}
printf("\n");
}
void decryption()
{
int a,b,i=0,j=0;
char x[100],k[10],y[100];
printf("Please input the message:");
gets(x);
printf("\n");
printf("Please the key:");
gets(k);
printf("\n");
a=strlen(x);
b=strlen(k);
strlwr(k);
if(a>b)
{
for(i=0;i<a;i++)
{
if(x[i]<97)
{
y[i]=(x[i]-(k[j]-32)+26)%26+65;
printf("%c",y[i]);
}else
{
y[i]=(x[i]-k[j]+26)%26+97;
printf("%c",y[i]);
}
j++;
if(j>=b)
{j=0;}
}
}
else
{for(i=0;i<a;i++)
{
y[i]=(x[i]-k[j]+26)%26+97;
printf("%c",y[i]);
j++;
}
}
printf("\n");
}
void main()
{int i;
list:printf("please choose a function:1.encryption 2.decryption 3.exit\n");
scanf("%d",&i);
getchar();
switch(i){
case 1:encryption();
goto list;
case 2:decryption();
goto list;
case 3:exit(1);
}
}