简单的ElGamal算法实现

ElGamal算法实现的难点在于,求大素数的本原根。

:创造是极客唯一的属性

一、算法介绍

ElGamal是公钥密码的一种,建立在模大素数的离散对数困难求解问题之上。
本文只关注ElGamal在加解密上的简单实现(你可以理解为验证),在签名、认证、密钥交换方面的应用不予考虑。
ElGamal加解密共分为三个模块:密钥生成、加密、解密。

  • 密钥生成
    在这里插入图片描述

  • 加密
    在这里插入图片描述

  • 解密
    在这里插入图片描述

说明:在这里,设定大素数p为强素数(即p=2*q+1,且q为大素数),并且最高150位。

二、代码实现

整个算法的难点在于大素数p的本原根的寻找。
通常情况下,我们求一个素数p的原根的方法是:从2开始往上逐一递增,直到找到一个数a,满足ap-1(mod p)==1且a(p-1)的各质因子(mod p)!=1,此时a即为p的一个原根。(注意:素数是一定存在原根的
但是此法放在大数的背景下就黔驴技穷了,因为时间复杂度太高了!!!
你会急得满头大汗:本原根可是加密的前提。
江山代有才人出,真正的极客能够从0到1,解决别人解决不了的问题,比如咱们的Whitefield与Martin Hellman两位老先生,“别急,先坐下来喝杯茶,关于强素数本原根问题,我们已经解决了!”
算法给出的p是强素数,而著名的DH算法恰好解决了这个问题:正如其所说的,要寻找大强素数的本原根,只需满足两个条件。这样一来,速度就提上去了。

关键代码如下:

  1. 变量定义
    在这里插入图片描述
  2. 密钥生成
//密钥生成
	printf("First,let's generate the key!\n"
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值