实验环境:DEV C++ 5.11
实验原理:
维吉尼亚密码是一种使用多表代换的代换密码,是在凯撒密码的基础上扩展出来的多表密码。
维吉尼亚密码引入了“密钥”的概念,根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。
实验要求:
使用熟悉的高级语言,编写一段程序,实现维吉尼亚密码
维吉尼亚实验代码:
#include <stdio.h>
#include <string.h>
//加密函数:统一加密为大写字母
void encrypt(char *text, char *result, char *k)
{
int i,j=0,z=0;
for(i=0;i<strlen(text);i++)//在明文长度内循环
{
if(text[i]>='a' && text[i] <= 'z') //小写字母
result[z]=(text[i]-'a'+k[j]-'a')%26 +'A';
else //大写字母
result[z]=(text[i]-'A'+k[j]-'a')%26 +'A';
j++;
if(j>=strlen(k)) j=0;//以密钥长度为一个周期循环
z++;
}
}
//解密函数:统一解密为小写字母
void decrypt(char *text, char *result, char *k)
{
int i,j=0,z=0;
for(i=0;i<strlen(text);i++)
{
if(text[i]>='a' && text[i] <= 'z')//小写字母
result[z]=(text[i]-k[j]+26)%26 +'a';
else //大写字母
result[z]=(text[i]-k[j]+58)%26 +'a';
j++;
if(j>=strlen(k)) j=0;//以密钥长度为一个周期循环
z++;
}
}
int main()
{
int type;
printf("欢迎来到维吉尼亚密码系统!");
while(1)
{
char text[99]="";
char result[99]="";
char k[99]="";
printf("\n0:退出 1:加密 2:解密\n");
printf("请输入你的选择:");
scanf("%d",&type);
if(type == 0)
{
printf("系统退出。\n");
break;
}
printf("请输入一段英文字母:");//默认输入为一段连续英文字母串
scanf("%s",text);
printf("请输入密钥:");//密钥默认小写
scanf("%s",k);
if(type ==1)
{
encrypt(text,result,k);
printf("密文为:%s\n",result);//输出密文
}
else if(type == 2)
{
decrypt(text,result,k);
printf("明文为:%s\n",result);//输出明文
}
else
printf("输入有误!请重新输入!\n");
}
}
运行结果:
这里代码设置了一个无限循环,直到选0退出程序,该程序段不仅可以方便运行而且方便验证加解密的正确性
实验感悟:
略