#include<stdio.h>
#include<string.h>
//仿射加密 传入明文和输出的结果 和 倍数 k1及相加的k2
void fangshe_jiami(char *text,char *result,int k1,int k2){
int i,z=0;
int l = strlen(text); //获取明文的长度
for(i=0;i<l;i++)
{
//判断大小写,也可用ASCII来判断
if (text[i] >= 'A' && text[i] <= 'Z'){
result[z]=(k1*(text[i]-'A')+k2)%26+'A'; //进行取模运算 ,去让明文*k1再加上k2 整体取模
} else if (text[i] >= 'a' && text[i] <= 'z'){
result[z]=(k1*(text[i]-'a')+k2)%26+'a'; //进行取模运算
}
z++;
}
}
//仿射解密 此时的text为密文
void fangshe_jiemi(char *text,char *result,int k3,int k2){
int i,result_index=0;
int length = strlen(text); //获取明文的长度 ,获取长度进行每一位的解密
for(i=0;i<length;i++)
{
//判断大小写
if (text[i] >= 'A' && text[i] <= 'Z'){
result[result_index]=(k3*((text[i]-'A')-k2))%26+'A'; //让密文*k1的
if(k3*((text[i]-'A')-k2) < 0){
result[result_index] = result[result_index] + 26;
}
} else if (text[i] >= 'a' && text[i] <= 'z'){
result[result_index]=(k3*((text[i]-'a')-k2))%26+'a';
if(k3*((text[i]-'a')-k2) < 0){ //处理负数
result[result_index] = result[result_index] + 26;
}
}
result_index++;
}
}
//Vigenere加密
void Vigenere_jiami(char *text,char *result,char *k){
int l,i,j=0,z=0;
for(l=0;text[l]!='\0';l++);
for(i=0;i<l;i++)
{
result[z]=(text[i]-'a'+k[j]-'a')%26+'a';
j++;
z++;
}
}
//Vigenere解密
void Vigenere_jiemi(char *text,char *result,char *k){
int l,i,j=0,z=0;
for(l=0;text[l]!='\0';l++);
for(i=0;i<l;i++)
{
result[z]=(text[i]-k[j]+26)%26+'a';
j++;
z++;
}
}
int main(){
char text[50]="";
char result[50]="";
char k[50]="";
int k1,k2,k3;
int type;
printf("请填写明文或者密文\n");
scanf("%[^\n]",text);
printf("请选择加密方式,输入1 仿射加密,输入2 Vigenere加密\n");
scanf("%d",&type);
switch (type){
case 1:
printf("加密还是解密 1加密 2解密");
scanf("%d",&type);
switch(type){
case 1:
/**加密**/
printf("请输入密钥k1\n");
scanf("%d",&k1);
printf("请输入密钥k2\n");
scanf("%d",&k2);
fangshe_jiami(text,result,k1,k2);
printf("明文%s的密文为:%s\n",text,result);
break;
case 2:
/**解密**/
printf("请输入密钥k1的逆元\n");
scanf("%d",&k3);
printf("请输入密钥k2\n");
scanf("%d",&k2);
fangshe_jiemi(text,result,k3,k2);
printf("密文%s的明文为:%s\n",text,result);
break;
}
break;
case 2:
printf("加密还是解密 1加密 2解密");
scanf("%d",&type);
printf("请输入密钥k\n");
scanf("%s",k);
switch(type){
case 1:
/**加密**/
Vigenere_jiami(text,result,k);
printf("明文%s的密文为:%s\n",text,result);
break;
case 2:
/**解密**/
Vigenere_jiemi(text,result,k);
printf("密文%s的明文为:%s\n",text,result);
break;
}
break;
}
return 0;
}
最后修改:2023 年 04 月 04 日
© 允许规范转载
1 条评论
叼茂SEO.bfbikes.com