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求解水仙花数的方法
May 11 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python中if elif else及缩进的使用简述
May 31 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
python实现剪切功能
Jan 23 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
python 画出使用分类器得到的决策边界
Aug 21 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
pytorch简介
Nov 11 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和js中json的编码和解码
2016/10/24 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python读取mp3中ID3信息的方法
2015/03/05 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
python实现推箱子游戏
2020/03/25 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
师说教学反思
2014/02/07 职场文书
合作经营协议书范本
2014/04/17 职场文书
人口与计划生育责任书
2015/05/09 职场文书
领导视察通讯稿
2015/07/18 职场文书
团结主题班会
2015/08/13 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
springboot如何初始化执行sql语句
2021/06/22 Java/Android
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL