Python实现ElGamal加密算法的示例代码


Posted in Python onJune 19, 2020

在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法。

ElGamal加密算法可以定义在任何循环群G上。它的安全性取决于G上的离散对数难题。

使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特)。

代码如下:

import random
from math import pow
a = random.randint(2, 10) #产生小于p的随机常数a

def gcd(a, b):
  if a < b:
    return gcd(b, a)
  elif a % b == 0:
    return b;
  else:
    return gcd(b, a % b)
  # Generating large random numbers

def gen_key(q):
  key = random.randint(pow(10, 20), q)
  while gcd(q, key) != 1:
    key = random.randint(pow(10, 20), q)
  return key

# Modular exponentiation
def power(a, b, c):
  x = 1
  y = a
  while b > 0:
    if b % 2 == 0:
      x = (x * y) % c;
    y = (y * y) % c
    b = int(b / 2)
  return x % c

# Asymmetric encryption
def encrypt(msg, p, h, r):
  en_msg = []
  b = gen_key(p) # 得b
  K = power(h, b, p)#K=(Sa)^b mod p
  C1 = power(r, b, p) #C1=Sb=r^b mod p
  for i in range(0, len(msg)):
    en_msg.append(msg[i])
  print("C1 : ", C1)
  # print("(Sa)^b mod p used : ", K)
  for i in range(0, len(en_msg)):
    en_msg[i] = K * ord(en_msg[i])
  print("C2 : ", en_msg)
  return en_msg, C1

def decrypt(C2, C1, a, p):
  dr_msg = []
  h = power(C1, a, p)
  for i in range(0, len(C2)):
    dr_msg.append(chr(int(C2[i] / h)))
  return dr_msg

# Driver code
def main():
  msg = '01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234'        # 共125位数字,1000bit
  print("明文 :", msg)
  p = random.randint(pow(10, 20), pow(10, 50))# 获得大素数q
  r = random.randint(2, p)#得r
  a = gen_key(p) # Private key for receiver
  h = power(r, a, p)
  C2, C1 = encrypt(msg, p, h, r)
  dr_msg = decrypt(C2, C1, a, p)
  dmsg = ''.join(dr_msg)
  print("解密后文 :", dmsg);

if __name__ == '__main__':
  main()

总结

到此这篇关于Python实现ElGamal加密算法的示例代码的文章就介绍到这了,更多相关python ElGamal加密算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的subprocess模块总结
Nov 07 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
Python实现全排列的打印
Aug 18 Python
python 求定积分和不定积分示例
Nov 20 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
Python求区间正整数内所有素数之和的方法实例
Oct 13 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 Python
Python3.9.1中使用match方法详解
Feb 08 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
python 字符串的驻留机制及优缺点
Jun 19 #Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 #Python
Python应用实现处理excel数据过程解析
Jun 19 #Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 #Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 #Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 #Python
Python应用实现双指数函数及拟合代码实例
Jun 19 #Python
You might like
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
python连接数据库的方法
2017/10/19 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
python3实现表白神器
2019/04/09 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
应届生如何写自荐信
2014/01/05 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
服务之星获奖感言
2014/01/21 职场文书
学期自我评价
2014/01/27 职场文书
股东授权委托书
2014/10/15 职场文书
怎么写工作检讨书
2014/11/16 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
vue组件vue-esign实现电子签名
2022/04/21 Vue.js