仿射密码加密

  1. 加密算法
    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;
    }
  2. 解密算法
    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;
    }
  3. 最大公约数算法
    int gcd(int x,int y){
    	int z=0;
    	while(y){
    	    z = y;
    		y = x%y;
    	    x = z;
    	}
    	return x;
    }
    
  4. 求模逆算法  
    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;
    }

     总体代码:自己整合吧,动动手呀动动脑

  5. 不用文件输入输出的总体代码

    /* 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;
    }
    
    
    

猜你喜欢

转载自blog.csdn.net/Yumitter/article/details/83927979