仿射加密-C语言
1、[仿射加密概念](https://baike.baidu.com/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/2250198?fr=aladdin)
2、代码:
#include<stdio.h>
#include<string.h>
void pritext(char text[128]);
void cryp(char cryp[],char text1[],int a,int b);
void jm(char c[128],char m[128],int a,int b);
main()
{
int re=1;
int i;
int count=0;
char text[128];
char cryp2[128];
printf("input text:");
gets(text);
cryp(&cryp2,text,5,8);
jm(cryp2,text,5,8);
}
void pritext(char text[128]){
int count=strlen(text);
int i=0;
for(i=0;i<count;i++){
printf("%c",text[i]);
}
printf("\n");
}
void cryp(char c[128],char m[128],int a,int b){
int mlen=strlen(m);
int i=0;
printf("加密前:%s",m);
for(i=0;i<mlen;i++){
//cryp[i]=my[(int)(text1[i]+k)%26];
if (m[i]==' '){
c[i]=m[i];}
else if(m[i]>64&&m[i]<91) { //区分明文的大小写
c[i]=(a*(m[i]-65)+b)%26 +65;} //对大写字母进行加密
else {
c[i]=(a*(m[i]-97)+b)%26 +97;} //对小写字母进行加密
printf("\n%c加密中:%c",m[i],c[i]);
}
printf("\n加密后:");
for(i=0;i<mlen;i++){
printf("%c",c[i]);
}
printf("\n");
}
int NI(int a) /*求a相对于b的逆元*/
{
int b = 26;
int i = 0;
while(a*(++i)%b!=1); //a*i=1 mod b
return i;
}
void jm(char c[128],char m[128],int a,int b){
int length;
int j=0,i=0;
length = strlen(m);
printf("\n开始解密:");
for(j=0;j<length-1;j++){
if (c[j]==' '){
m[j]=c[j];}
else if(c[j]>64&&c[j]<91) { //对大写密文进行解密
m[j]=(NI(a)*((c[j]-65)-b))%26+65; //解密算法 m[i]=a逆*(c[i]-b)mod 26
if(NI(a)*((c[j]-65)-b)<0){ //修正 NI(a)*((c[j]-65)-b)结果为负数的情况
m[j]=m[j]+26;
}
}
else{ //对小写密文进行解密
m[j]=(NI(a)*((c[j]-97)-b))%26+97; //解密算法 m[i]=a逆*(c[i]-b)mod 26
if(NI(a)*((c[j]-97)-b)<0){ //修正 NI(a)*((c[j]-97)-b)结果为负数的情况
m[j]=m[j]+26;
}
}
printf("\n%c解密中:%c",c[j],m[j]);//输出解密后的明文
}
printf("\n");
printf("\n解密后:");
for(i=0;i<length;i++){
printf("%c",m[i]);
}
printf("\n");
}
3、结果图:
参考文章:https://blog.****.net/xiaoyun_ny/article/details/41216369