RSA加密解密算法

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#define MAX 20

typedef struct{
	int a[MAX];
	int N;
}BTN;

int Euclidean(int a,int b);//欧几里得算法求 最大公约数
int ExtendedEuclidean(int a,int b);//扩展欧几里得算法求逆
int SquareMultiply(int x,int c,int n);//z=pow(x,c)mod n
BTN ExBinary(int numx);//十进制向二进制转化
int* RsaParameter(int p,int q);//RSA参数生成
int EnRSA(int p,int q,int num);//加密/*公钥(n,b)*/
int DeRSA(int p,int q,int a,int num);解密/*私钥(p,q,a)*/


void main()
{
	int mp,mq,*MyKey;
	int x,x1,x2;
	mp=101;mq=103;
	x=9726;
	MyKey=RsaParameter(mp,mq);
	x1=EnRSA(MyKey[0],MyKey[1],x);
	x2=DeRSA(MyKey[2],MyKey[3],MyKey[4],x1);
	printf("\n加密%d得到的密文是:%d",x,x1);
	printf("\n解密%d得到的明文是:%d\n",x1,x2);
}


int Euclidean(int a,int b)
{//欧几里得算法求 最大公约数
	int r0,r1,m,r,q,rm;
	r0=a;
	r1=b;
	m=1;
	r=r1;
	if(a==0 || b==0) r=0;
	while(r!=0)
	{
		rm=r;
		q=r0/r1;
		r=r0-q*r1;
		r0=r1;
		r1=r;
		m++;
	}
	return rm;
}



int ExtendedEuclidean(int a,int b)
{//扩展欧几里得算法求逆
	int a0,b0,t0,t,s0,s,q,r;
	int temp;
	a0=a;
	b0=b;
	t0=0;t=1;s0=1;s=0;
	q=a0/b0;
	r=a0-q*b0;
	while(r>0)
	{
		temp=t0-q*t;
		t0=t;
		t=temp;
		temp=s0-q*s;
		s0=s;
		s=temp;
		a0=b0;
		b0=r;        /*********** r=gcd(a,b)
					 s*a+t*b=r      *************/
		q=a0/b0;
		r=a0-q*b0;
	}
	r=b0;
	if(s<0)s=b+s;
	return s;

}

int SquareMultiply(int x,int c,int n)
{//z=pow(x,c)mod n
	int l;
	int z;
	BTN c2;
	c2=ExBinary(c);
	z=1;
	l=c2.N;
	for(int i=l-1;i>=0;i--)
	{
		z=pow(z,2);
		z=z%n;
		if(c2.a[i]==1)
		{
			z=(z*x)%n;
		}
		//printf("%d  %d\n",c2.a[i],z);
	}
	return z;
}

BTN ExBinary(int num)
{//十进制转换成二进制
	BTN b;
	int i=0;
	while(num!=0)
	{
		b.a[i]=num%2;
		num=num/2; 
		i++;
	}
	b.N=i;
	return b;
}

int* RsaParameter(int p,int q)
{//RSA参数生成
	int n,s,b,a,k;
	int *key;
	key=(int *)malloc(5*sizeof(int));
	n=p*q;
	s=(p-1)*(q-1);
	for(;;)
	{
		b=rand()%s;
		k=Euclidean(b,s);
		if(k==1)break;
	}
	a=ExtendedEuclidean(b,s);
	*key=n;
	*(key+1)=b;
	*(key+2)=p;
	*(key+3)=q;
	*(key+4)=a;
	return key;
}

int EnRSA(int n,int b,int num)
{//加密/*公钥(n,b)*/
	int Cryptograph;
	Cryptograph=SquareMultiply(num,b,n);
	return Cryptograph;
}

int DeRSA(int p,int q,int a,int num)
{//解密/*私钥(p,q,a)*/
	int Cleartext;
	int n;
	n=p*q;
	Cleartext=SquareMultiply(num,a,n);
	return Cleartext;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值