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操作MySQL数据库的方法分享
May 29 Python
Python实用日期时间处理方法汇总
May 09 Python
详解Python中dict与set的使用
Aug 10 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
python队列Queue的详解
May 10 Python
python画图的函数用法以及技巧
Jun 28 Python
Python操作redis和mongoDB的方法
Dec 19 Python
python使用多线程+socket实现端口扫描
May 28 Python
5道关于python基础 while循环练习题
Nov 27 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调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
PHP实现简易blog的制作
2016/10/24 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
在Python中使用元类的教程
2015/04/28 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
简单了解Python中的几种函数
2017/11/03 Python
python破解zip加密文件的方法
2018/05/31 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
竞选班长自荐书范文
2014/03/09 职场文书
企业法人授权委托书
2014/04/03 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
班组拓展活动方案
2014/08/14 职场文书
校车安全管理责任书
2015/05/11 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
Python数组变形的几种实现方法
2022/05/30 Python
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL