維吉尼亞密碼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網工魏淑芬+楊森



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章