Python:ElGamal

简介

百度百科传送门
基于迪菲-赫尔曼密钥交换的非对称加密算法
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)#明文比对
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值