密码学——Elgamel算法(随机生成域参数、随机生成密钥对、加密、解密)(C/C++实现)

C/C++代码

#include <iostream>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

// 指数运算
// 输入a和b
// 输出a的b次方
int power(int a, int b)
{
	int temp = a;
	for(int i=1 ; i<b ; i++)
	{
		temp = temp * a;
	}
	return temp;
}

// 判断一个数是否为素数
// 输入一个数a 
// 返回:如果a是素数,返回true ; 否则返回false
bool Prime(int a)
{
	for(int i=2 ; i<= (a/2) ; i++)
	{
		if((a % i) == 0)
		{
			return false;
		}
	}
	return true;	
}

// 辗转相除法
// 输入 a 和 b
// 返回 a和b 的最大公约数
int gcd(int a , int b)
{
    while(b!=0)
    {
        int temp = a % b;
        a = b;
        b = temp;
    }
    return a;
}

// 欧拉函数
// 输入a
// 返回a的欧拉函数值
int euler(int a)
{
	int b = 0;
	for(int i=1 ; i<a ; i++)
	{
		if(gcd(a,i) == 1)
		{
			b += 1;
		}
	}
	return b;
}

// 求阶函数
int order(int a, int n, int b)
{
	int  p = 1;

	while( p<=n && power(b,p%a) != 1)
	{
		p += 1;
	}
	
	p = p - 1;

	if (p <= n)
	{
		return p;
	}
	else
	{
		return -1;
	}
}

// 公钥p的生成函数
int Generate_p()
{
	srand((unsigned int)time(NULL));
	int p = (rand() % (10000 - 1000 + 1) + 1000);

	for(; p<10000 ; p++)
	{
		if (Prime(p)==true)
		{
			return p;
		}
	}
}

// 公钥g的生成函数
int Generate_g(int p)
{
	int n = euler(p);

	for(int a = 2; a<p ; a++)
	{

		if(order(p,n,a) == n)
		{
			return a;
		}
	}
}

// 密钥d的生成函数
int Generate_d(int p)
{
	srand((unsigned int)time(NULL));
	int d = rand() % ( p-2-2+1) + 2;

	return d;
}

// 快速模幂运算
// 形式为 (a^b) mod c
// 输入 a 、b 和 c  因为要求a^b , 因此是长整数
// 返回 (a^b) mod c 计算结果
int modpow(long long a, long long b, int c) 
{
    int res = 1;
    while(b > 0)
    {
        if(b & 1) 
        {
            res = (res * a) % c;
        }
        
        b = b >> 1;
        a = (a * a) % c; 
    }   
    return res;
}

// 求解乘法逆元
// 输入num 和 mod。 求num 在 mod 下的乘法逆元
// 返回num 在 mod 下的乘法逆元
int inverse(int num,int mod)
{
    int a = num;
    int b = mod;
    int x = 0, y = 1, x0 = 1, y0 = 0;
    int qt, temp;
    
	while(b != 0)
	{
		qt = a / b;
        temp = a % b;
        
		a = b;
        b = temp;
        
		temp = x; x = x0 - qt * x; x0 = temp;
        temp = y; y = y0 - qt * y; y0 = temp;
	}

    if(x0 < 0)
    {
        x0 += mod;
    }
    
    return x0;
}

// ElGamal算法加密过程
// 输入公钥{g,y,p} , 明文m
// 返回密文对:C = {c1,c2} , 以数组形式
void Encryption(int y, int g, int p, int m, int &C1, int &C2)
{

	int r;
	int temp;
	int c1, c2;
	srand((unsigned)time(NULL));
	r = rand();

	c1 = modpow(g, r, p);
	temp = modpow(y, r, p);
	c2 = (m * temp)%p;
	cout << "加密后结果(密文对): " << "{" << c1 << "," << c2 << "}" << endl;
	
	C1 = c1;
	C2 = c2;
} 

// ElGamal解密过程
// 输入密文对:{c1,c2} ,密钥d 以及公钥p
// 返回明文m
int Decryption(int c1, int c2, int d, int p)
{
	int temp;
 	temp = modpow(c1, d, p);

	int temp1 = inverse(temp, p);

	int m = (c2*temp1)%p;

	return m;
} 

int main()
{
	// 定义明文 m
	int m = 2;

	// 随机生成p
	int p = Generate_p();

	// 随机生成g
	int g = Generate_g(p);

	// 随机生成d
	int d = Generate_d(p);

	//开始进行
	cout << "3. Elgamel算法(随机生成域参数、随机生成密钥对、加密、解密)" << endl;
	cout << endl;

	cout << "明文m的内容为: " << m << endl;
	cout << endl;

	cout << "公钥为:" << endl;
	cout << "y: " << modpow(g,d,p) << endl;
	cout << "g: " << g << endl;
	cout << "p: " << p << endl;
	cout << endl;

	cout << "密钥为:" << endl;
	cout << "d: " << d << endl;
	cout << endl;

	int c1,c2 ; 
	Encryption(modpow(g,d,p),g,p,m,c1,c2);

	cout <<"解密后的结果为: " << Decryption(c1,c2,d,p) << endl;
	cout << endl;
	
	system("pause");
	return 0;
}

运行结果

运行结果

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rayme629

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值