Elgamal算法-------简单C语言算法实现

Elgamal算法实现

目录

Elgamal算法实现

1.基本算法

2.具体算法

3.代码

4.结果:


1.基本算法

快速幂算法 pow_mod(a,b,p)

计算a^b mod p

 

2.具体算法

elgamal加密算法 elgamal_en(m,pub,p,g,c1,c2)

c1=g^k mod p

c2=m*(pub^k) mod p

其中k为任意整数,m为明文,pub为公钥,p为大素数,g为生成元,c1,c2为密文

elgamal解密算法 elgamal_de(c1,c2,pri,p,g)

m_=c2 * ((c1_ )^pri) mod p

其中m_为解密后的数据,p为大素数,g为生成元,c1_为c1模p的逆元,pri为私钥

 

3.代码

#include
#include
#include

int pow_mod(int a,int b,int p){
	int ans=1;
	int tmp=a%p;
	while(b){
		if(b&1)
			ans=ans*tmp%p;
		b>>=1;
		tmp=tmp*tmp%p;
	}
	return ans%p;
}

void elgamal_en(int m,int pub,int p,int g,int *c1,int *c2){
	int k=5;
	*c1=pow_mod(g,k,p);
	*c2=m*pow_mod(pub,k,p)%p;
}
int elgamal_de(int c1,int c2,int pri,int p,int g){
	int m;
	int c1_=pow_mod(c1,p-2,p);
	m=c2*pow_mod(c1_,pri,p)%p;
	return m;
}
int is_prime(int p){
	int i;
	for(i=2;i<=sqrt(p);i++){
		if(p%i==0)
			return 0;
	}
	return 1;
}
void main(){
	int p;//素数
	int g=2;

	do{
		printf("请输入一个素数:");
		scanf("%d",&p);
	}while(!is_prime(p));
	
	printf("输入用户A的私钥:");
	int pri;
	scanf("%d",&pri);

	int pub;
	pub=pow_mod(g,pri,p);

	printf("用户A的公钥为:%d\n",pub);
	
	printf("输入明文(小于%d):",p);
	int m;
	scanf("%d",&m);

	int c1,c2;
	elgamal_en(m,pub,p,g,&c1,&c2);
	printf("用公钥加密后的密文为:c1=%d,c2=%d\n",c1,c2);

	int m_=elgamal_de(c1,c2,pri,p,g);
	printf("用私钥解密后的明文为:%d\n",m_);
}

4.结果:

Elgamal算法-------简单C语言算法实现_第1张图片

你可能感兴趣的:(Elgamal算法-------简单C语言算法实现)