Python实现 ElGamal 加密算法

news/2024/9/19 4:51:04/ 标签: python, 开发语言, ElGamal, 密码学, 加密解密

目录

      • 使用 Python 实现 ElGamal 加密算法的博客
        • 引言
        • ElGamal 加密算法的工作原理
        • Python 面向对象实现 ElGamal 算法
        • 代码解析
        • 示例场景:安全消息传输
        • 代码解析
        • Python 代码的扩展和优化
        • 总结

ElGamal__2">使用 Python 实现 ElGamal 加密算法的博客

引言

ElGamal 加密算法 是一种基于离散对数难题的非对称加密算法,由塔希尔·艾尔加迈尔(Taher ElGamal)在1985年提出。它与 RSA 类似,是一种常用于安全通信的公钥加密系统。ElGamal 算法广泛应用于数字签名、加密系统和零知识证明等领域。本文将详细介绍 ElGamal 算法的原理,并使用 Python 以面向对象的方式实现 ElGamal 加密与解密操作,最后结合一个场景演示其应用。


ElGamal__10">ElGamal 加密算法的工作原理

ElGamal 加密系统基于离散对数问题的困难性,其安全性依赖于难以计算大整数的离散对数。算法主要由三个部分组成:密钥生成、加密和解密。

  1. 密钥生成

    • 选择一个大的素数 p p p 和一个整数 g g g,其中 g g g 是模 p p p 的一个生成元。
    • 随机选择一个私钥 x x x,满足 1 < x < p − 1 1 < x < p-1 1<x<p1
    • 计算公钥 y = g x m o d p y = g^x \mod p y=gxmodp
    • 公钥为 ( p , g , y ) (p, g, y) (p,g,y),私钥为 x x x
  2. 加密过程

    • 选择要加密的明文消息 m m m,满足 m < p m < p m<p
    • 随机选择一个临时密钥 k k k,满足 1 < k < p − 1 1 < k < p-1 1<k<p1
    • 计算加密对 ( c 1 , c 2 ) (c_1, c_2) (c1,c2),其中:
      c 1 = g k m o d p c_1 = g^k \mod p c1=gkmodp
      c 2 = m ⋅ y k m o d p c_2 = m \cdot y^k \mod p c2=mykmodp
    • 加密后的密文为 ( c 1 , c 2 ) (c_1, c_2) (c1,c2)
  3. 解密过程

    • 使用私钥 x x x 解密密文 ( c 1 , c 2 ) (c_1, c_2) (c1,c2),计算:
      m = c 2 ⋅ ( c 1 x ) − 1 m o d p m = c_2 \cdot (c_1^x)^{-1} \mod p m=c2(c1x)1modp
    • 其中 ( c 1 x ) − 1 (c_1^x)^{-1} (c1x)1 c 1 x c_1^x c1x 的模 p p p 的逆元,可以使用扩展欧几里得算法计算。
ElGamal__37">Python 面向对象实现 ElGamal 算法

为了实现 ElGamal 算法,我们将定义一个名为 ElGamal 的类,其中包含密钥生成、加密和解密的方法。

python">import randomclass ElGamal:def __init__(self, p, g):"""初始化 ElGamal 实例,指定素数 p 和生成元 g。"""self.p = p  # 大素数 pself.g = g  # 生成元 gself.private_key = None  # 私钥self.public_key = None  # 公钥 (p, g, y)def generate_keys(self):"""生成公钥和私钥。"""# 选择一个随机私钥 xself.private_key = random.randint(2, self.p - 2)# 计算公钥 yy = pow(self.g, self.private_key, self.p)self.public_key = (self.p, self.g, y)return self.public_keydef encrypt(self, plaintext, k=None):"""使用公钥加密消息。:param plaintext: 明文消息 (整数形式):param k: 临时密钥 (可选),默认为随机选择:return: 密文对 (c1, c2)"""if not (1 <= plaintext < self.p):raise ValueError(f"明文消息必须在范围 1 到 {self.p-1} 之间。")if k is None:k = random.randint(2, self.p - 2)# 计算 c1 = g^k mod pc1 = pow(self.g, k, self.p)# 计算 c2 = m * y^k mod py = self.public_key[2]c2 = (plaintext * pow(y, k, self.p)) % self.preturn (c1, c2)def decrypt(self, ciphertext):"""使用私钥解密密文。:param ciphertext: 密文对 (c1, c2):return: 解密后的明文消息"""c1, c2 = ciphertext# 计算 s = c1^x mod ps = pow(c1, self.private_key, self.p)# 计算 s 的逆元s_inv = pow(s, -1, self.p)# 计算明文 m = c2 * s^(-1) mod pplaintext = (c2 * s_inv) % self.preturn plaintext
代码解析
  1. 类初始化 __init__ 方法:接收一个素数 p p p 和一个生成元 g g g 作为输入,初始化 ElGamal 加密系统。

  2. 密钥生成 generate_keys 方法:随机生成一个私钥 x x x,计算公钥 y = g x m o d p y = g^x \mod p y=gxmodp,返回公钥 ( p , g , y ) (p, g, y) (p,g,y)

  3. 加密 encrypt 方法:使用公钥和随机的临时密钥 k k k 对明文进行加密,生成密文对 ( c 1 , c 2 ) (c_1, c_2) (c1,c2)

  4. 解密 decrypt 方法:使用私钥对密文进行解密,计算明文消息。

示例场景:安全消息传输

假设我们在一个安全消息传输系统中使用 ElGamal 加密算法。Alice 需要将一条秘密消息发送给 Bob。双方同意使用 ElGamal 加密算法。Bob 生成公钥和私钥,并将公钥发送给 Alice。Alice 使用 Bob 的公钥对消息进行加密,并将密文发送给 Bob。Bob 接收到密文后使用自己的私钥进行解密,恢复原始消息。

python"># 示例:Alice 和 Bob 的安全消息传输# 1. Bob 生成公钥和私钥
p = 467  # 大素数 p
g = 2    # 生成元 gbob = ElGamal(p, g)
public_key = bob.generate_keys()
print(f"Bob 的公钥: {public_key}")# 2. Alice 使用 Bob 的公钥加密消息
alice = ElGamal(p, g)
plaintext = 123  # 明文消息 (整数形式)
ciphertext = alice.encrypt(plaintext)
print(f"Alice 加密的消息 (密文): {ciphertext}")# 3. Bob 使用私钥解密密文
decrypted_message = bob.decrypt(ciphertext)
print(f"Bob 解密的消息: {decrypted_message}")assert plaintext == decrypted_message, "解密后的消息与原始消息不一致!"
代码解析
  1. Bob 生成密钥对:Bob 选择一个大素数 ( p = 467 ) 和生成元 ( g = 2 ),生成公钥和私钥。

  2. Alice 加密消息:Alice 使用 Bob 的公钥对明文消息进行加密,并生成密文对。

  3. Bob 解密密文:Bob 使用私钥解密密文,恢复原始明文消息。

Python 代码的扩展和优化

为了提高 ElGamal 算法的实用性,我们可以进一步扩展代码:

  1. 支持字符串加密:当前实现只支持整数形式的消息,我们可以扩展支持字符串消息加密和解密。

  2. 优化密钥生成:优化生成大素数和生成元的算法,使用更加安全的密钥生成机制。

  3. 加入异常处理:完善代码中的异常处理机制,保证加密解密过程的鲁棒性。

以下是支持字符串加密的扩展代码示例:

python">class ElGamalExtended(ElGamal):def string_to_int(self, message):"""将字符串消息转换为整数。"""return int.from_bytes(message.encode('utf-8'), 'big')def int_to_string(self, number):"""将整数转换为字符串消息。"""return number.to_bytes((number.bit_length() + 7) // 8, 'big').decode('utf-8')def encrypt_message(self, message, k=None):"""加密字符串消息。"""plaintext = self.string_to_int(message)return self.encrypt(plaintext, k)def decrypt_message(self, ciphertext):"""解密密文为字符串消息。"""decrypted_number = self.decrypt(ciphertext)return self.int_to_string(decrypted_number)# 使用扩展类进行字符串加密解密
if __name__ == "__main__":p =467g = 2bob = ElGamalExtended(p, g)public_key = bob.generate_keys()message = "Hello, Bob!"ciphertext = bob.encrypt_message(message)print(f"加密后的密文: {ciphertext}")decrypted_message = bob.decrypt_message(ciphertext)print(f"解密后的消息: {decrypted_message}")assert message == decrypted_message, "解密后的消息与原始消息不一致!"
总结

在本文中,我们详细介绍了 ElGamal 加密算法的原理,并使用 Python 以面向对象的方式实现了其加密与解密过程。同时,我们通过一个简单的场景示例,演示了 ElGamal 算法在安全通信中的实际应用。ElGamal 算法凭借其基于离散对数难题的安全性,成为现代密码学领域中的重要工具之一。通过对该算法的学习和实现,可以更深入理解公钥加密的核心思想和应用。


http://www.ppmy.cn/news/1521008.html

相关文章

绿色无广告,纯净体验——2024年优质免费视频剪辑软件

如果你习惯一个视频网站的时候&#xff0c;工作上遇到问题也会第一时间在视频网站上进行搜索解决方案。就比如我同事就很喜欢在短视频网站上搜索Office软件的一些操作步骤。如果你也想分享这类视频&#xff0c;那么我们一起探讨下有哪些适合抖音剪辑的视频剪辑工具。 1.福昕视…

magisk+lsposed hook okhttp3采集小红书app端接口(包含完整源码)(2024-09-03)

摘要&#xff1a; 本文介绍如何通过hook OkHttp3框架来拦截并处理应用的网络响应&#xff0c;特别是在某书APP中&#xff0c;通过深入理解Okhttp3的API&#xff0c;hook RealCall以获取请求和响应数据&#xff0c;实现关键词搜索、笔记和用户等数据的回传操作。 一、原理介…

商品信息的标准化

销售环节的数字化见效最快 现在&#xff0c;企业的数字化是非常热的话题&#xff0c;工业&#xff14;.&#xff10;&#xff0c;人工智能&#xff0c;物联网&#xff0c;机器人都是企业数字化转型的主要方向&#xff0c;但是某些时候&#xff0c;我们走的太远&#xff0c;却忘…

2409vue,vue3.5更新

原文 今天,很高兴地发布Vue3.5! 此次要版本不包含破坏更改,只包括内部改进和有用的新函数.这里包含一些亮点. 反应式系统优化 在3.5中,Vue的响应式系统经历了另一次重大重构,实现了更好性能并显著提高了(-56%)内存使用率而行为不变. 此重构还解决了在SSR时,因挂起计算而导…

微服务中的服务降级与熔断机制

目录&#xff1a; 1、简介2、服务降级2.1. Hystrix基础配置2.2. 启用Hystrix2.3. 实现服务降级2.4. 配置Hystrix 3、熔断机制3.1. 配置熔断器3.2. 查看Hystrix Dashboard 1、简介 在微服务架构中&#xff0c;服务降级与熔断机制是保证系统稳定性和可靠性的关键技术。当系统中的…

flowable 国产数据库并发性能优化

最近在生产环境有用户反馈系统流转速度较慢&#xff0c;这边用的是金仓数据库&#xff0c;这边查了数据库的慢sql日志&#xff0c;最后发现问题&#xff0c;以下是部分慢sql的执行时间截图 主要都是流转过程中更新执行表和历史变量表执行时间较长&#xff0c;于是查了表的默认索…

2024年全国铁路(铁路、高铁、地铁)矢量数据集

数据更新时间​&#xff1a;2024年6月​&#xff1b; ​数据范围&#xff1a;全国各省&#xff08;不包含台湾&#xff09;; 数据格式​&#xff1a;shp; ​数据包含类型&#xff1a;铁路、高铁、地铁 数据​坐标信息&#xff1a; EPSG Code 4326 大地基准面 D_WGS_1…

【OpenGL】 理解makeCurrent函数

背景 用QT学校OpenGL绝对可以事半功倍&#xff0c;QT提供了一系列对OpenGL的支持&#xff0c;包括OPenGL窗口类&#xff0c;对OpenGL函数的面向对象的封装等。 总体说明 在Qt框架中&#xff0c;makeCurrent 是QOpenGLContext类的一个方法&#xff0c;它封装了这些平台特定的…

CSS解析:盒模型

在网页上实现元素布局涉及很多技术。在复杂网站上&#xff0c;可能会用到浮动元素、绝对定位元素以及其他各种大小的元素&#xff0c;甚至也会使用较新的CSS特性&#xff0c;比如Flexbox或者网格布局。 在此之前我们要打好基础&#xff0c;深刻理解浏览器是如何设置元素的大小…

Update Azure OpenAI npm Package to 2023-12-01-preview Version

题意&#xff1a;将 Azure OpenAI npm 包更新到 2023-12-01-preview 版本 问题背景&#xff1a; I am currently using the azure-openai npm package in my project with version 2023-03-15-preview. As per the latest updates, version 2023-12-01-preview is available a…

使用 SCSS 或 LESS 相比于纯 CSS 的好处

使用 SCSS 或 LESS 相比于纯 CSS 有以下几个好处&#xff1a; 变量支持&#xff1a; SCSS/LESS&#xff1a;可以定义变量用于存储颜色、字体大小、间距等值&#xff0c;便于在整个样式文件中复用。例如&#xff0c;可以定义一个颜色变量 $primary-color: #3498db;&#xff0c;然…

网站维护更新简易单页404页html代码

源码介绍 一个简约风格的单页html页面&#xff0c;可用于网站维护中或更新网站时挂个首页使用&#xff0c;如果不喜欢现在的颜色请F12修改设置既可。 效果预览 源码获取 网站维护更新简易单页404页html代码

数据分析利器:Java与MySQL构建强大的数据挖掘系统

数据分析在当今信息时代具有重要的作用&#xff0c;它可以帮助企业和组织深入理解数据&#xff0c;发现隐藏在数据中的模式和规律&#xff0c;并基于这些洞察进行决策和优化。Java与MySQL作为两个强大的工具&#xff0c;结合起来可以构建出一个高效、可靠且功能丰富的数据挖掘系…

在Ubuntu 16.04上安装Nginx的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 Nginx 是世界上最流行的 Web 服务器之一&#xff0c;负责托管一些互联网上最大和最高流量的网站。在大多数情况下&#xff0c;它比…

杭州网站建设网页手机版

杭州作为中国的电子商务之都&#xff0c;网站建设在杭州可谓是异常繁荣。随着移动互联网的兴起&#xff0c;越来越多的企业开始注重网页的手机版建设&#xff0c;以满足用户在移动设备上的浏览需求。杭州网站建设公司也专门针对手机版网页进行优化&#xff0c;提供更好的用户体…

Git 使用指南 --- 版本管理

序言 Git 是一个开源的 分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说&#xff0c;掌握 Git 的使用是必要的。  在这个系列中&#xff0c;将详细的介绍 Git 的使用和原理&#xff0c;话不多说&#xff0c;让我们开始吧。…

【UEFI基础】SMBIOS基础和使用

SMBIOS的定义 SMBIOS的全称是System Management BIOS&#xff0c;关于它的理解包括&#xff1a; 它不是一个BIOS&#xff0c;之所以出现了BIOS字样&#xff0c;是因为它跟BIOS有关&#xff0c;仅此而已。它是一个规范&#xff0c;定义了BIOS传递给操作系统的系统管理信息&…

java整合Redission

1.maven仓库查询Redisson并倒入项目 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.35.0</version> </dependency> 2.配置文件&#xff08;采用yml配置方式&…

并发和并行的关系

先说结论&#xff0c;并发、并行并不对立&#xff0c;可同时存在。 什么是并发&#xff1f; CPU运行速度远大于内存读取速度&#xff0c;为了充分利用CPU性能&#xff0c;不让它总是等着从内存里读数据&#xff0c;CPU时间片技术应运而生&#xff0c;可分时复用CPU&#xff0c…

Linux——redis理论、安全模型

一、redis 主要的data type redis 的原生客户端redis 支持通过python php golang 等语言连接redis 主要适用场景 二、redis如何进行数据存储 非关系数据库 不使用二维表 redis 使用键值对完成数据的存储redis一共有16个库 &#xff0c;不同的库使用编号 0-15redis 在…