C语言实现RSA的简单加解密

C语言实现 RSA的简单加密解密
RSA我就不普及了,网上都有,现在用我的实验报告实现一下:
需要的数据有:
两个大素数p,q;
n=pq;
t=(p-1)
(q-1);
公钥e满足(e,t)=1;
私钥d满足de==1(mod n);
加密公式c=m^e(mod n),c是密文,m是明文;
加密的时候注意明文m<n;

下面再展示一下代码块:

//判断两个数是不是互素。 
void gcd(int p,int q){
    
    
	int temp1,temp2;   //q=temp2*p+temp1 ;
	if(q<p){
    
    
		temp1=p;
		p=q;
		q=temp1;
	}
	temp1=q%p,temp2=q/p; 
	while(temp1!=0){
    
    
		
	    q=p;p=temp1;
		temp1=q%p;temp2=q/p;
		}
		if(temp1==0&&temp2==q){
    
    
			printf("符合条件!\n");
	    }
	    else{
    
    
	    	printf("不符合条件!\n");
		}
}
//求e关于模(p-1)(q-1)的逆元d:即私钥 
int extend(int e,int t){
    
    
	int d;
	for(d=0;d<t;d++){
    
    
		if(e*d%t==1)
	        return d;
	}
}

加密函数中要把符号明文转换成数字明文才可以加密,加密原理是依次把一个个字母对应的ascii码加密;加密函数中的加密公式pow(m,e)%n可能会导致溢出,这是解决之后的:

//加密函数 
void encrypt(int e,int n){
    
           //自己指定指数e 

    //先将符号明文转换成字母所对应的ascii码。 
	char mingwen[100];    //符号明文 
	printf("请输入明文:\n");
	scanf("%s",mingwen);  //gets(mingwen);
	//gets(mingwen);
	changdu=strlen(mingwen);
	int ming[strlen(mingwen)];   //定义符号明文 
	for(int i=0;i<strlen(mingwen);i++){
    
    
	ming[i]=mingwen[i];        //将字母转换成对应的ascii码。 
	printf("%d",mingwen[i]);
	} 
	printf("\n"); 
	//开始加密 
	printf("加密开始…………………………\n");
	int zhuan=1;    //c为加密后的数字密文 
	for(int i=0;i<strlen(mingwen);i++){
    
    
	 
	   for(int j=0;j<e;j++){
    
    
		zhuan=zhuan*ming[i]%n;
		//zhuan=zhuan%n; 
	   }
	   c[i]=zhuan;
	   //printf("%d",mi[i]); 
	   zhuan=1;
	} 
	printf("加密密文为:\n");
	for(int i=0;i<strlen(mingwen);i++) 
	printf("%d",c[i]); 
	printf("\n加密结束…………………………\n");
	}

解决之前的:(只要把大的幂指数计算分开计算就行了)

	//以下写法会导致溢出!
//	{
    
    
//		for(int i=0;i<strlen(mingwen);i++){
    
    
//		zhuan=pow()
//		mi[i]=int(pow(ming[i],e))%n;
//		printf("密文为:%d",mi[0]);
//	}
//	} 
	
	
//	printf("密文为:\n");
//	for(int i=0;i<strlen(mingwen);i++){
    
    
//		printf("%d",mi[i]);
//	}
//解密函数 
void decrypto(int d,int n){
    
    
	int de_mingwen[changdu],zhuan1=1;
	char de_ming[changdu];
	for(int i=0;i<changdu;i++){
    
    
	 
	   for(int j=0;j<d;j++){
    
    
		zhuan1=zhuan1*c[i]%n;
		//zhuan=zhuan%n; 
	   }
	   de_mingwen[i]=zhuan1;
	   //printf("%d",mi[i]); 
	   zhuan1=1;
	} 
	printf("解密开始…………………………\n");
	printf("解密后的数字明文为:\n");
	for(int i=0;i<changdu;i++) 
	printf("%d",de_mingwen[i]); 
	printf("\n");
	printf("解密后的符号明文为:\n");
	for(int i=0;i<changdu;i++){
    
    
		de_ming[i]=de_mingwen[i];
		printf("%c",de_ming[i]);
	}
	printf("\n解密结束…………………………\n");
}

主函数:

int main(){
    
    
	int q,p,e,d,n,t,x;
	printf("请输入p:",p);scanf("%d",&p);
	printf("请输入q:",q);scanf("%d",&q);
	n=q*p;
	t=(q-1)*(p-1); 
	gcd(p,q);
	printf("请输入一个指数e,使得(e,t)=1:");scanf("%d",&e);
	gcd(e,t);
	
	d=extend(e,t); 
	printf("密钥为:%d,一定保管好!",d);
	printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	encrypt(e,n);
	printf("\n请输入正确的密钥,密钥正确将解密上面的密文:");scanf("%d",&d);
	decrypto(d,n);
	printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	return 0;
}

加密函数encrypt()中输入明文不能用gets(),因为gets()遇到回车就会结束,这样单个函数测试是没有问题的,但是如果测试整个程序就会出先还没有执行函数就结束的情况:
在这里插入图片描述
用换成scanf("%s",mingwen),这样就可以执行啦!
在这里插入图片描述
记得加上完整的头文件哦!因为我定义了一些全局变量:

#include<stdio.h>
#include<string.h>
int changdu; 
int c[100];

小白绝对看懂系列!因为我也很菜,所以会写得比较详细,防止我下次看的时候不知道是啥哈哈哈。

整个实验就是这样啦,可能写得有点急,整个程序还是有一些拖沓,里面有些功能还需要优化一下,不过基本功能算是实现啦!

这里有个问题想请教前辈:
怎样在一个函数中使用指针的方法访问另一个函数的变量?除了使用全局变量外,希望前辈给个例子,比如解密函数里面访问加密函数里面的加密后的明文c
还有额外的一个问题:一个函数怎么返回一个数组?

猜你喜欢

转载自blog.csdn.net/weixin_44116874/article/details/109393329