EIGamal公钥密码算法

一.实验报告在这里插入图片描述

二.代码

extern "C"
{
#include "miracl.h"
}
#include<stdio.h>
#include<math.h>
#include<string.h>

miracl *mip = mirsys(2000, 10);
big p_a, g_a, a_a, miu_p_a, g_a_a;

//产生原根
void produce(){
	big temp_1, save;
	temp_1 = mirvar(1);
	save = mirvar(0);
	while(1){
		incr(g_a, 1, g_a);
		//判断此时产生的g是否为原根
		powmod(g_a, miu_p_a, p_a, save);
		if(compare(save, temp_1) == 0) break;
	}
	
	return;
}
int main(){

	//ALICE密钥的产生
	p_a = mirvar(0);
    g_a = mirvar(1);
    a_a = mirvar(0);
    miu_p_a = mirvar(0);
    g_a_a = mirvar(0);
	
	//明文消息
	big m;
	char str[500];
	m = mirvar(0);
	printf("请输入m的值:");
	gets(str);
	cinstr(m,str);
	//产生大素数p_a
	while(1){
		int flag = 0;
		bigdig(150, 10, p_a);
		if(isprime(p_a)) {
			add(p_a, p_a, p_a);
			incr(p_a, 1, p_a);
			if(isprime(p_a))flag = 1;
		}
		if(flag)break;
	}

	//产生原根g
	decr(p_a, 1, miu_p_a);
	produce();
	//随机选取整数a
	bigdig(150, 10, a_a);
	powmod(g_a, a_a, p_a, g_a_a);

	//输出Alice的p,g
	printf("p = ");
	cotnum(p_a, stdout);
	printf("g = ");
	cotnum(g_a, stdout);


//	printf("g^a = \n");
//	cotnum(g_a_a, stdout);
//	printf("Alice 的私钥为:\n");
//	cotnum(a_a, stdout);




	//加密过程
	//随机选取整数k
	big k, temp1;
	temp1 = mirvar(1);
	k = mirvar(0);
	while(1){
		bigrand(miu_p_a, k);
		if(compare(k, temp1) != -1) break;
	}
	printf("k = ");
	cotnum(k, stdout);


	//计算C1
	big c1;
	c1 = mirvar(0);
	powmod(g_a, k, p_a, c1);
	printf("c1 = \n");
	cotnum(c1, stdout);
	//计算C2
	big c2;
	c2 = mirvar(0);
	powmod(g_a_a,k,p_a,c2);
	multiply(m, c2, c2);
	powmod(c2,temp1,p_a,c2);
	printf("c2 = \n");
	cotnum(c2, stdout);

	//解密过程
	big v,m_jie;
	v = mirvar(0);	m_jie = mirvar(0); 
	powmod(c1,a_a,p_a, v);
	xgcd(v, p_a, v, v, v);
	multiply(c2, v, m_jie);
	powmod(m_jie,temp1,p_a,m_jie);
	if(compare(m_jie, m) == 0){
		printf("is same\n");
	} else {
		printf("is not same\n");
	}
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值