简介
百度百科传送门
基于迪菲-赫尔曼密钥交换的非对称加密算法
EIGamal公开密钥密码体制是基于有限域中离散对数间题的难解性。它所根据的原理是:求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。在相应的群G中,指数函数是单向函数。
算法
说明
- import说明: 在导入中加入了我自己写的素数相关函数,可自行添加改写
- 输入: 十进制整数(代码中为mb,即B的明文),可用注释部分替换
- 输出: 分两部分:加密部分输出加密后的十进制密文对,解密部分输出解密后的十进制明文(懒,自行拆解代码
- 其他: 自动生成安全素数p(速度看运气,快则两三秒,没有上限)、原根g、随机数a、g的a次方, 素数p、原根g、g的a次方作为公钥,随机数a为私钥,公私钥对都是接收者A的
- 流程: 系统生成相关参数,B将明文mb加密成(c1,c2)后发送给A;A收到后用私钥a解密输出明文ma(,最后比对明文正确性,正常肯定没这步)。
代码
运行报错、超时请看说明
import prime
import random
import math
p=prime.safe_length(150)
g=prime.safe_root(p)
a=random.randint(2, p)
ga=pow(g,a,p)
print('公钥:('+str(p)+',\n'+str(g)+',\n'+str(ga)+')')
#print('私钥:'+str(a))
mb=prime.length(149)#int(input('m:'))
print('\nB\'s input:\n'+str(mb))
k=random.randint(1, p-1)
while math.gcd(p-1, k)!=1:
k=random.randint(1, p-1)
c1=pow(g, k,p)
c2=((mb%p)*pow(ga,k,p))%p
print('\ncyphertext:('+str(c1)+',\n'+str(c2)+')')
v=pow(c1,a,p)
ma=(c2*prime.modinv(v,p))%p
print('\nA\'s output:\n'+str(ma))
print(ma==mb)#明文比对