维吉尼亚密码加解密(no 文件加解密)

#include<stdio.h>
#include<string.h>
void Encrypt(char P[],char K[],char a[]);//加密函数 
void Decode(char C[],char K[],char a[]);//解密函数
int main()
{
	int n;
	char P[100],
		 C[100],
		 K[100],
		a[26]={'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'};
	while(1)
	{
		printf("*************维吉尼亚密码加解密**************\n");
		printf("*********************************************\n");
		printf("*                                           *\n");
		printf("*        1 加密                             *\n");
		printf("*        2 解密                             *\n");
		printf("*        0 退出                             *\n");
		printf("*                                           *\n");
		printf("*********************************************\n");
		printf("请输入命令序号: \t");
		scanf("%d",&n);
		
		if(n==1)	
			Encrypt(P,K,a);
		else if(n==2)	
			Decode(C,K,a);
		else if(n==0)	
			return 0;
		else printf("\t\t命令错误,请重新输入!!!\n");
	}
	return 0;
}
void Encrypt(char P[],char K[], char a[])//密钥空间 > 明文空间
{
	int i,j,n,m,e;
	printf("    请输入 密钥 :\t");
	scanf("%s",K);
	i=j=0;
    n=m=0;//用来存储 P K空间的大小 
    e=0;//用来判断 P_nu[i]+K_nu[j]是否是26的倍数,防止对26取mold时等0 
	int P_nu[100],K_nu[100],nu=0,
	    y[100];//y[]数组储存 加密后的字母数字 
	char Y[100];//储存 由y[]数组数字---->Y[]数组的字母 
	printf("    请输入 明文 P :\t");
	scanf("%s",P);
	n=strlen(P);//n是 P[] 数组所容纳数字的多少
	m=strlen(K);//m是 K[] 数组所容纳数字的多少
	for(i=0;K[i]!='\0';i++)//求密钥空间各个 字母 所对应的数字 
	{
		for(j=0;a[j]!='\0';j++)
		{
			if(K[i]==a[j])
			{
				K_nu[nu]=j;
				nu++;//nu 多一个1
			}		
		}
	}	
	nu=0;

	for(i=0;P[i]!='\0';i++)//求明文空间各个 字母 所对应的数字 
	{
		for(j=0;a[j]!='\0';j++)
		{
			if(P[i]==a[j])
			{
				P_nu[nu]=j;
				nu++;//nu 多一个1
			}		
		}
	}
	
	//输出 明文,密钥所对应的数字 
	printf("-----------输出明wen数字---------------------------------------------------------------"); 
	for(i=0;i<n;i++) 
	{
		 printf(" %d",P_nu[i]);
	}
	printf("\n");	
	printf("-----------输出密yao数字---------------------------------------------------------------"); 
		for(i=0;i<m;i++) 
	{
		 printf(" %d",K_nu[i]);
	}
	printf("\n");

	//nu=0;//初始化nu,上一个循环已使用 
	//计算加密运算
	for(i=0,j=0;i<n;i++,j++)//i表示明文数字,j表示密钥数字 
	{
		//if(j==(m-1)) j=0;//  加密公式为: 密文=(明文+密钥)mold26-1 ----------->从1计数时减一 
		e=(P_nu[i]+K_nu[j%(m)])%26; //用if判断(P_nu[i]+K_nu[j])mold26是否为0 
		//if(e==0) e+=26;
		y[i]=e;//存放密文的数字 
		//nu++;//直接以 n 就可以,为strlen(P) 
	}
	printf("输出加密后的结果:    \t");
	printf("\t"); 
	for(i=0;i<n;i++) //A 码127以内的可以用此转换   ,n为P空间大小 
	{
		 printf("%c",a[y[i]]);
	}
	printf("\n");	
}

//解密函数 
void Decode(char C[],char K[], char a[])
{
	int i,j,n,m,e;
	printf("    请输入 密钥 :\t");
	scanf("%s",K);
	i=j=0;
    n=m=0;//用来存储 C K空间的大小 
    //e=0;//用来判断 P_nu[i]+K_nu[j]是否是26的倍数,防止对26取mold时等0 
	int C_nu[100],K_nu[100],nu=0,
	    y[100];//y[]数组储存 解密后的字母数字 
	printf("    请输入 密文 C :\t");
	scanf("%s",C);
	n=strlen(C);//n是 C[] 数组所容纳数字的多少
	m=strlen(K);//m是 K[] 数组所容纳数字的多少
	for(i=0;K[i]!='\0';i++)//求密钥空间各个 字母 所对应的数字 
	{
		for(j=0;a[j]!='\0';j++)
		{
			if(K[i]==a[j])
			{
				K_nu[nu]=j;
				nu++;//nu 多一个1
			}		
		}
	}	
	nu=0;

	for(i=0;C[i]!='\0';i++)//求密文空间各个 字母 所对应的数字 
	{
		for(j=0;a[j]!='\0';j++)
		{
			if(C[i]==a[j])
			{
				C_nu[nu]=j;
				nu++;//nu 多一个1
			}		
		}
	}
	
	//输出 密文,密钥所对应的数字 
	printf("-----------输出密wen数字---------------------------------------------------------------"); 
	for(i=0;i<n;i++) 
	{
		 printf(" %d",C_nu[i]);
	}
	printf("\n");	
	printf("-----------输出密yao数字---------------------------------------------------------------"); 
		for(i=0;i<m;i++) 
	{
		 printf(" %d",K_nu[i]);
	}
	printf("\n");

	//nu=0;//初始化nu,上一个循环已使用 
	//计算解密运算
	for(i=0,j=0;i<n;i++,j++)//i表示密文数字,j表示密钥数字 
	{
		if(C_nu[i]>=K_nu[j%m]) y[i]=C_nu[i]-K_nu[j%m];//比较P K 对应的数字, 
		else  y[i]=26-(K_nu[j%m]-C_nu[i]);
	}
	printf("输出加密后的结果:    \t");
	printf("\t"); 
	for(i=0;i<n;i++) //A 码127以内的可以用此转换   ,n为P空间大小 ,当赋值运算时 
	{
		 printf("%c",a[y[i]]);
	}
	printf("\n");	
}
    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/Lina_ACM/article/details/51162394
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞