维吉尼亚C语言实现

维吉尼亚密码

结构简单
随便发发

#include "stdafx.h"//在vs调试的需要加入这个和ws2_32.lib 
#include <stdlib.h>//stdlib 头文件里包含了C、C++语言的最常用的系统函数,该文件包含了的C语言标准库函数的定义 
#include <stdio.h>// 标准输入输出函数库
#include <string.h> //在使用到字符数组时需要使用 
#define N 10000//可运算100长度的密码  /*考虑内存的话要改*/
void Pan(char str[]);//判断合法的函数 
void Pan1(char str[]);//判断合法的函数 
void jiami(char m[],char key[]);//声明加密函数 
void jiemi(char s[],char key[]);//声明解密函数 
void geshihua(char str[]);//声明格式化函数 
int main(){//主函数 
	char choose;//功能选择的变量 
	char m[N]; //明文数组 
	char key[N]; //密钥数组 
	char s[N];//密文 数组 
	int len_k=strlen(key);//密钥长度,类型int,整形 
	for(;;){//控制循环,输入退出 
		printf("请选择功能(功能键不区分大小写)\n加密1\n解密2\n退出3\n");
		scanf("%s",&choose);//功能输入
		getchar();//清空上一步的回车 防止下面puts无法计算 
		if(choose=='1'){
				printf("输入明文:");
			
				gets(m);//获取明文 
			
				Pan1(m);//判断 he fa ?

			
					
				printf("输入密钥:");
		
				gets(key);//输入密钥 
				
				Pan(key);
				puts(key);
				geshihua(key);//改密钥格式 
				printf("密文:");
				jiami(m,key);//调用加密函数
	
				continue;}
		else if(choose=='2'){
				printf("输入密文:");
				
				gets(s);//接受密文 
				Pan1(s);
			
				printf("输入密钥:");
				
				gets(key);//接受密钥 
				Pan(key);
				
				geshihua(key);//格式化密钥 
				printf("明文:");
				jiemi(s,key);//调用解密函数 
				
				continue;}
		else if(choose=='3'){
				printf("已经退出!\n");
				exit(0);//退出功能
			}
		else {
			printf("输入错误!\n");
				continue;
				
		}
}//for结束 
}
void jiami(char m[],char key[])//加密函数 
{
	int i,j;//i,j控制循环,j控制key的轮回, 
	int len_k=strlen(key);//密钥长度
	char s[N];//密文接受组 
	for(i=0,j=0;m[i]!='\0';i++){ 
	if(m[i]==32){//判断空格 
		s[i]=' ';
	}
	else if(m[i]>='A'&&m[i]<='Z'){//if 是大写 
		
		s[i]=((int)(m[i]-'A')+(int)(key[j%len_k]-'A'))%26+65;//加密算法 ,放入结果s 
		j++;
	}
	else if(m[i]>='a'&&m[i]<='z'){//如果是小写 
		s[i]=((int)(m[i]-'a')+(int)(key[j%len_k]-'A'))%26+97;//加密算法 ,放入结果s 
		j++; 
	}
		
		printf("%c",s[i]); //输出密文 
	}	
	printf("\n");//打出回车 
}
void Pan(char str[]){//kong ge 
	int i;
	int j=0;
	for(i=0;str[i]!='\0';i++){
		if(str[i]!=' '){
			
			str[j++]=str[i];
			
		}
	}
}
void Pan1(char str[]){
		int i;
	for(i=0;str[i]!='\0';i++)	{	//在26字母,' ' 
		if(int(str[i])!=32&&int(str[i])<65||int(str[i])>90&&int(str[i])<97||int(str[i])>122)//判断输入的东西合法码 
		{
			printf("输入格式不正确,请您重新输入\n"); 
		exit(0);	}		
}		
}
void geshihua(char str[])//格式化函数 
{
	int i;
	for(i=0;str[i]!='\0';i++){
	if(str[i]>='a'&&str[i]<='z'){   			
		str[i]=str[i]-32;//改大写 
		}
	else if (str[i]>='A'&&str[i]<='Z'){
			str[i]=str[i];
		}	
	}
}
void jiemi(char s[],char key[])//解密函数 
{
int i,j;//i,j控制循环,j控制key的轮回, 
	int len_k=strlen(key);//密钥长度
	char q[N];//密文接受组 
	for(i=0,j=0;s[i]!='\0';i++){ 
	if(s[i]==32){//判断空格 
		q[i]=' ';
	}
	else if(s[i]>='A'&&s[i]<='Z'){//if 是大写 
		q[i]=((int)(s[i]-'A')-(int)(key[j%len_k]-'A')+26)%26+65;//加密算法 ,放入结果s 
		j++;
	}
	else if(s[i]>='a'&&s[i]<='z'){//如果是小写 
		q[i]=((int)(s[i]-'a')-(int)(key[j%len_k]-'A')+26)%26+97;//加密算法 ,放入结果s 
		j++;
	}
		
		printf("%c",q[i]); //输出密文 
	}	
	printf("\n");//打出回车 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值