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算法恰好解决了这个问题:正如其所说的,要寻找大强素数的本原根,只需满足两个条件。这样一来,速度就提上去了。
关键代码如下:
- 变量定义
- 密钥生成
//密钥生成
printf("First,let's generate the key!\n"