维吉尼亚密码

实验环境: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退出程序,该程序段不仅可以方便运行而且方便验证加解密的正确性

实验感悟:

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值