Python实现ElGamal加密算法的示例代码
作者:出门左拐是海 发布时间:2023-05-23 15:25:58
标签:python,ElGamal,加密算法
在密码学中,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()
来源:https://blog.csdn.net/I_canjnu/article/details/106807142


猜你喜欢
- 引言在 web 项目中,我们经常使用自定义状态码来告知请求方请求结果以及请求状态;在 Python 中该如何设计自定义的状态码信息呢?普通类
- 这10个asp处理网页编码转换的函数,不知何时收藏在我的电脑中,今天刚好看到了,拿出来与大家分享,这里各种常见的网页编码问题已经
- 在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式
- PHP原型模式Prototype Pattern是什么原型模式是一种创建型模式,它可以通过复制现有对象来创建新的对象,而无需知道具体的创建过
- 1、 二叉树的构建我们都知道二叉搜索树的特点是:当前节点的值大于它的左子树的值,小于等于右子树的值。所以我们这里可以通过迭代的方式构建二叉搜
- 本文实例为大家分享了python实现复制大量文件的具体代码,供大家参考,具体内容如下本来是去项目公司拷数据,结果去了发现有500G,靠系统的
- ubuntu18.04版本,python版本python2.7,python3.5,python3.6因为安装一些库会安装到python3.
- 虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编
- 一、效果展示文件上传和展示:文件搜索:文件下载:删除文件:二、关键代码#urls.pyfrom django.urls import pat
- 一.权限表mysql数据库中的3个权限表:user 、db、 host权限表的存取过程是:1)先从user表中的host、 user、 pa
- 一、准备工作:安装pywin32,后面开发需要pywin32的支持,否则无法完成与windows层面相关的操作。pywin32的具体安装及注
- 基本设置class Map3D( # 初始化配置项,参考 `global_options.InitOpts` &n
- 1.开始----程序-----oracle------配置和移植工具-----Net Manager----本地----服务命名---ora
- 在缺失值填补上如果用前后的均值填补中间的均值,比如,0,空,1,我们希望中间填充0.5;或者0,空,空,1,我们希望中间填充0.33,0.6
- 问题出现在当时后台数据会返回到data中但是没有出现下拉菜单,查询资料 发现 Vue的this理解有误jsp 下拉菜单 <select
- 一、初始化主界面import pygamepygame.init()screen = pygame.display.set_mode((50
- python 内置函数filterclass filter(object): """ filter(funct
- 使用distinct在mysql中查询多条不重复记录值的解决办法如何使用distinct在mysql中查询多条不重复记录值?有时候想用dis
- 一、filter()在Python内建函数中,有一个和map()函数用法类似、却可以用来过滤元素的迭代函数,这个函数就是filter()。它
- PyQt5布局控件QVBoxLayout简介采用QVBoxLayout类,按照从上到下的顺序添加控件本节内容较少,演示两个实例,便于明白QV