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

来源:互联网 发布:餐馆软件 编辑:程序博客网 时间:2024/05/14 06:56
#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");}
1 0