- 加密算法
int encode(FILE *m,FILE *c,int a,int b){ char ch = fgetc(m); char r; while(ch != EOF){ if(ch >='A' && ch <= 'Z'){ //大写字母加密 r=((ch-'A')*a+b)%26+'A'; fputc(r, c); } else if(ch >='a' && ch <= 'z'){ //小写字母加密 r=((ch-'a')*a+b)%26+'a'; fputc(r, c); } else fputc(ch,c); //其他字符,不加密输出原文 ch=fgetc(m); } fclose(m); fclose(c); return 0; }
- 解密算法
int decode(FILE *m,FILE *c,int a,int b){ int i=1; char ch; char r; m = fopen("ciphertext.txt", "r"); ch= fgetc(m); a=a%26; b=b%26; while((a*i)%26!=1) i+=2; //计算a的模逆 while(ch != EOF){ if(ch >='A' && ch <= 'Z'){ r=((ch-'A'-b+26)*i)%26+'A'; //解密大写字母 fputc(r, c); } else if(ch >='a' && ch <= 'z'){ r=((ch-'a'-b+26)*i)%26+'a'; //解密小写字母 fputc(r, c); } else fputc(ch,c); //其他字符,不加密输出原文 ch=fgetc(m); } fclose(m); fclose(c); return 0; }
- 最大公约数算法
int gcd(int x,int y){ int z=0; while(y){ z = y; y = x%y; x = z; } return x; }
- 求模逆算法
while((a*i)%26!=1) i+=2;
本题是求a mod26 的逆 ,while循环足够了啦,当然也可以用扩展的欧几里得算法,可自行百度或看证明的原理。
int exgcd(int a,int b,int* x,int* y) { int d; if(b==0) { *x=1;*y=0; return a; } d=exgcd(b,a%b,y,x); *y-=a/b*(*x); return d; }
总体代码:自己整合吧,动动手呀动动脑
-
不用文件输入输出的总体代码
/* m明文,c密文,str1,str2中间变量*/ #include <stdio.h> #include <stdlib.h> int gcd(int x,int y); //计算最大公约数 int encode(char *m,char *c,int a,int b); int decode(char *c,char *m,int a,int b); int main() { int a=0,b=0; char m[1024]="\0",c[1024]="\0",d[1024]="\0"; printf("请输入密钥对(a,b): "); scanf("%d %d",&a,&b); if(gcd(a,26)!=1){ printf("\na与26不互素,无法解密\n\n"); return 1; } printf("请输入需要加密的明文:\n"); scanf("%s",m); encode(m,c,a,b); //加密 printf("\n加密后的密文:\t"); printf("%s\n",c); decode(c,d,a,b); printf("\n解密后的明文:\t"); //解密 printf("%s\n",d); return 0; } int gcd(int x,int y){ int z=0; while(y){ z = y; y = x%y; x = z; } return x; } int encode(char *m,char *c,int a,int b){ char *str1=m; a=a%26; b=b%26; while(*str1){ if(*str1>='A'&& *str1<='Z'){ //大写字母加密 *c=((*str1-'A')*a+b)%26+'A'; str1++; c++; } else if(*str1>='a'&& *str1<='z'){ //小写字母加密 *c=((*str1-'a')*a+b)%26+'a'; str1++; c++; } else{ //其他字符,不加密输出原文 *c=*str1; str1++; c++; } } return 0; } int decode(char *c,char *d,int a,int b){ int i=1; char *str2=c; a=a%26; b=b%26; while((a*i)%26!=1) i+=2; while(*str2){ if(*str2>='A'&& *str2<='Z'){ *d=((*str2-'A'-b+26)*i)%26+'A'; str2++; d++; } else if(*str2>='a'&& *str2<='z'){ *d=((*str2-'a'-b+26)*i)%26+'a'; str2++; d++; } else{ *d=*str2;str2++;d++;} } return 0; }
仿射密码加密
最新推荐文章于 2024-05-15 01:05:46 发布