【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;
明解c语言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);
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 ption 2.it\n"); scanf("%d",&i);
getchar();
switch(i){
case1:encryption();
goto list;
case2:decryption();
goto list;
case3:exit(1);
}
}
运⾏结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论