维吉尼亚密码c++/vs2008

维吉尼亚密码c++/vs2008

// 维吉尼亚.cpp : 定义控制台应用程序的入口点。


#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#pragma warning(disable : 4996)
#define N 1000
void MString(char a[],char b[]);
void KString(char d[],char e[]);

int main() {
	char a[N],b[N],d[N],e[N];  
	char choice;                              //定义的明文,密钥,明文的字符数组// 
	int i,j,q; 

		do{                                                                      //设置选择菜单// 
		printf("             维吉尼亚密码\n        ");
	    printf("*************************************************\n");
		printf("1.Encrypt\n");
		printf("2.Decrypt\n");
		printf("0.退出\n");
		printf("*************************************************\n");
		printf("请输入以~2或者~2开头的字符串,0为退出");
		scanf("%s",&choice);
		
	   switch(choice) {
		case '1':
			     
	            printf("请输入明文,密钥:\n");
				getchar();
				gets(a);				
				
				 
				j=1;
				for(i=0;i<(int)strlen(a);i++) {
					
					if(('A'<=a[i]&&a[i]<='Z')||('a'<=a[i]&&a[i]<='z')||(a[i]==32))
					{    j=j+2;               //排除输入密文和密钥中的非法字符// 								
					}else{
						j=0;
						printf("输入错误");
							break;
					}
				}
				gets(b);
				for(i=0;i<(int)strlen(b);i++) {
					
					if(('A'<=b[i]&&b[i]<='Z')||('a'<=b[i]&&b[i]<='z')||(b[i]==32)){
							j=j+2;		
					}else{
						j=0;
						printf("输入错误");
							break;
					}
			}
				
			   if(j!=1)
			   {
				MString(a,b);
			    }
			    break;
		case '2':
				
				printf("请输入密文,密钥:\n");
				getchar();
				gets(d);				
				
				q=1;
				for(i=0;i<(int)strlen(d);i++) {
			
					if(('A'<=d[i]&&d[i]<='Z')||('a'<=d[i]&&d[i]<='z')||(d[i]==32))
					{    q=q+2;               //排除输入密文和密钥中的非法字符// 								
					}else{
						q=0;
						printf("输入错误");
							break;
					}
			}
				gets(e);
				for(i=0;i<(int)strlen(e);i++) {
					
					if(('A'<=e[i]&&e[i]<='Z')||('a'<=e[i]&&e[i]<='z')||(e[i]==32))
					{    q=q+2;               //排除输入密文和密钥中的非法字符// 								
					}else{
						q=0;
						printf("输入错误");
							break;
					}
			}
		
				 if(q!=1)
			   {
			 KString(d,e);
			    }

			break;
		case '0':
			printf("退出\n");
			break;
		
			
	}
	}while(choice!='0'||'1'||'2');
		printf("请重新输入: ");
}
//加密函数// 
void MString(char a[],char b[]) {
	char c[N];
	char str[53]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','\0'}; //定义字符串数组从a~zA-Z依次排序// 
	int i,m,n,r;
	int lena=(int)strlen(a);
	int lenb=(int)strlen(b);

	int i2=0;
	printf("密文:");
	for(i=0; i<lena; i++) {  
		if(a[i]==32){
		c[i]=32;
		}else{
			if(b[i2%lenb]>='a'&&b[i2%lenb]<='z') {
			n=b[i2%lenb]-97;
		}
		if(b[i2%lenb]>='A'&&b[i2%lenb]<='Z') {
			n=b[i2%lenb]-65;
		}
		if(a[i]>='a'&&a[i]<='z') {
			m=a[i]-97;
			r=(m+n)%26;
		}
		if(a[i]>='A'&&a[i]<='Z') {
			m=a[i]-65;
			r=(m+n)%26+26;
		}
		

		i2++;
		c[i]=str[r];
		}

		
		printf("%c",c[i]);
	                                                 //清空密钥数组防止下一次运行用到本次密钥// 
	}
}
//解密函数// 
void KString(char d[],char e[]) {
	int i,m1,n1,r1;
	char str[53]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','\0'}; //定义字符串数组从a~z依次排序// 
	char f[N];
	
	int lend=(int)strlen(d);
	int lene=(int)strlen(e);
	   
	int i2=0;
	printf("明文:");
	for(i=0; i<lend; i++) {
		if(d[i]==32){
		f[i]=32;
		}else {
		if(e[i2%lene]>='a'&&e[i2%lene]<='z') {
			n1=e[i2%lene]-97;
		}
		if(e[i2%lene]>='A'&&e[i2%lene]<='Z') {
			n1=e[i2%lene]-65;
		}
		if(d[i]>='a'&&d[i]<='z') {
			m1=d[i]-97;
			r1=(m1+26-n1)%26;
		}
		if(d[i]>='A'&&d[i]<='Z') {
			m1=d[i]-65;
			r1=(m1+26-n1)%26+26;
		}
		i2++;
		f[i]=str[r1];
		}
		
		
		printf("%c",f[i]);
		                                 //清空密钥数组防止下一次运行用到本次密钥// 
	}
}

来自17网工魏淑芬+杨森



  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值