#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");
}
维吉尼亚密码加解密(no 文件加解密)
最新推荐文章于 2024-07-11 20:15:08 发布