栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python:ElGamal

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)#明文比对
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982418.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号