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发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
浅谈python类属性的访问、设置和删除方法
Jul 25 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
对pandas处理json数据的方法详解
Feb 08 Python
python binascii 进制转换实例
Jun 12 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
Pandas搭配lambda组合使用详解
Jan 22 Python
使用Django框架创建项目
Jun 10 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和cookie来保存用户登录信息
2013/07/05 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
php实现购物车功能(上)
2020/07/23 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
Three.js快速入门教程
2016/09/09 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
用python生成1000个txt文件的方法
2018/10/25 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
会展中心部门工作职责
2013/11/27 职场文书
竞争上岗实施方案
2014/03/21 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
催款函怎么写
2015/06/24 职场文书
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python
详解Vue的列表渲染
2021/11/20 Vue.js