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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
python计算圆周率pi的方法
Jul 11 Python
Python实现的密码强度检测器示例
Aug 23 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
快速了解python leveldb
Jan 18 Python
python3实现名片管理系统
Nov 29 Python
实例讲解Python3中abs()函数
Feb 19 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 Python
python 闭包函数详细介绍
Apr 19 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
Bootstrap基础学习
2015/06/16 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
Python探索之修改Python搜索路径
2017/10/25 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis