仿射密码与单表代换的代码实现


题目要求

试设计实现仿射密码和单表代换密码:给出密钥生成(随机选择小于26的数、选择和26互素的密钥;以及生成0-25上的一个随机置换)、加解密的伪代码

仿射密码
//仿射密码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//密钥生成
int gcd(int a, int b) {
    int temp;
    while (b != 0) {
        temp = a % b;
        a = b;
        b = temp;
    }
    return a;
}

int keygenerationA(){
	int a;
    srand((unsigned)time(NULL));
    a = rand()%26;
    while(gcd(a,26)!=1)a = rand()%26;
    printf("a=%d\n", a);
    return a;
} 

int keygenerationB(){
	int b;
    srand((unsigned)time(NULL)+1);
    b = rand()%26;
    printf("b=%d\n", b);
    return b;
}

//加密
int encrypt(int a,int b,int p){
	int c;
	c=(a*p+b)%26;
	char d = (char)c+97;
    printf("%c\n", d);
    return c;
} 

//解密
int mod_inverse(int x) {
    for(int i=0;i<26;i++){
    	if((x*i)%26==1){
    		return i;
    		break;
		}
	}   
}

int decrypt(int a,int b,int c){
	int p;
	a=mod_inverse(a);
	p=((c-b)*a)%26;
	if(p<0){
        p+=26;
    }
	char d = (char)p+97;
    printf("%c\n", d);
} 

//主函数 
int main(){
	char text[100]="";
	int end[100];
	int a;
	int b;
	printf("生成密钥:\n");
	a=keygenerationA();
	b=keygenerationB();
	printf("请输入明文\n");
	scanf("%[^\n]",text);
	int l= strlen(text);
	printf("以下为密文\n");
	for(int i=0;i<l;i++){
	 	int p=text[i]-97;
	 	end[i]=encrypt(a,b,p);
	} 
	printf("以下为明文\n");
	for(int i=0;i<l;i++){
	 	int c=end[i];
	 	decrypt(a,b,c);
	}
}
单表代换密码
//单表代换
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//密钥生成 
void keygeneration(int *k){
	int num;
	int t[26]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
	for(int i=0;i<26;i++){
      srand((unsigned)time(NULL)+i);
      num=rand()%(26-i);
      k[i]=t[num];
      
      for(int j=num;j<25-i;j++){
      	t[j]=t[j+1];
	  }
	}
	printf("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\n");
	for(int l=0;l<26;l++){
		printf("%c ",k[l]+65);
	}
    printf("\n");
}

//加密
int encrypt(int *k,int a){
	int c;
	c=k[a];
	char d = (char)c+65;
    printf("%c\n", d);
    return c;
} 

//解密
int decrypt(int *k,int a){
	for(int i=0;i<26;i++){
		if(k[i]==a){
			printf("%c\n",i+97);
		}
	} 
}  

//主函数
int main(){
	char text[100]="";
	int end[100];
	int k[26];
	printf("生成密钥:\n");
	keygeneration(k);
	printf("请输入明文\n");
	scanf("%[^\n]",text);
	int l= strlen(text);
	printf("以下为密文\n");
	for(int i=0;i<l;i++){
		int p=text[i]-97;
	 	end[i]=encrypt(k,p);
	}
	printf("以下为明文\n");
	for(int i=0;i<l;i++){
	 	int c=end[i];
	 	decrypt(k,c);
	} 
} 

文章作者: autumnwt
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 autumnwt !
  目录