【C语言】维吉尼亚密码加密解密

维吉尼亚密码是一种以移位代换为代表的周期代换密码。26个英文字符a-z的编号一次为0,1,2-25。

  • 代码:
  • 运行结果:

算法思路:
给出一串明文先判断是否在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);
 }
}

运行结果:

【C语言】维吉尼亚密码加密解密_第1张图片

你可能感兴趣的:(C语言)