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实现apahce网站日志分析示例
Apr 02 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
利用python求积分的实例
Jul 03 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
python手写均值滤波
Feb 19 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
用python发送微信消息
Dec 21 Python
Python jiaba库的使用详解
Nov 23 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(5) 类和对象
2010/02/16 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
javascript下function声明一些小结
2007/12/28 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
python函数形参用法实例分析
2015/08/04 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
应届生人事助理求职信
2013/11/09 职场文书
纪念建党演讲稿范文
2014/01/13 职场文书
网络管理专业求职信
2014/03/15 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
素质教育学习心得体会
2016/01/19 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
室外天线与收音机天线杆接合方法
2022/04/05 无线电