【python】python中非对称加密算法RSA实现原理与应用实战

devtools/2024/12/23 1:14:45/

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Python中RSA加解密
    • 一、安装所需库
    • 二、生成RSA密钥对
      • 示例代码
    • 三、使用公钥加密数据
      • 示例代码
    • 四、使用私钥解密数据
      • 示例代码
    • 五、RSA签名与验证
      • 签名过程
      • 验证过程
    • 六、实际应用案例
      • 案例背景
      • 加密与签名过程
      • 解密与验证过程
      • 示例代码
        • Alice端代码
    • 七、总结

RSA_18">Python中RSA加解密

RSA加密算法是一种非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·沙米尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年提出。RSA算法的安全性基于大数分解的困难性,即已知两个大素数p和q的乘积n,求解p和q非常困难。RSA算法广泛应用于数据加密和数字签名等领域。

本文将详细介绍如何在Python中使用RSA算法进行加密和解密,包括密钥对的生成、加密过程、解密过程以及签名和验证签名的过程。同时,将结合具体案例进行说明。

一、安装所需库

在Python中使用RSA算法,首先需要安装pycryptodome库。这个库提供了完整的RSA加密和解密功能。可以使用pip命令进行安装:

pip install pycryptodome

RSA_32">二、生成RSA密钥对

RSA加密的第一步是生成一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开,而私钥需要保密。

示例代码

python">from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes# 生成RSA密钥对
key = RSA.generate(2048)  # 生成2048位的密钥# 导出密钥
private_key = key.export_key()
with open("private.pem", "wb") as f:f.write(private_key)public_key = key.publickey().export_key()
with open("public.pem", "wb") as f:f.write(public_key)print("私钥已保存到private.pem")
print("公钥已保存到public.pem")

上述代码生成了一对2048位的RSA密钥对,并将私钥和公钥分别保存到private.pempublic.pem文件中。

三、使用公钥加密数据

有了公钥后,就可以使用公钥对明文数据进行加密。加密后的数据只有对应的私钥才能解密。

示例代码

python">from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64# 加载公钥
with open("public.pem", "rb") as f:public_key = RSA.import_key(f.read())# 明文数据
message = "Hello, RSA Encryption!".encode('utf-8')# 使用公钥加密
cipher = PKCS1_OAEP.new(public_key)
encrypted_message = cipher.encrypt(message)# 将加密后的数据转换为base64编码,便于存储和传输
encrypted_message_b64 = base64.b64encode(encrypted_message).decode('utf-8')
print("加密后的数据(Base64编码):", encrypted_message_b64)

注意,这里使用了PKCS1_OAEP填充模式进行加密,它提供了比PKCS1_v1_5更好的安全性。

四、使用私钥解密数据

在收到加密的数据后,可以使用对应的私钥进行解密,还原出原始的明文数据。

示例代码

python">from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64# 加载私钥
with open("private.pem", "rb") as f:private_key = RSA.import_key(f.read())# 加密数据(这里用之前生成的加密数据)
encrypted_message_b64 = "你的加密数据(Base64编码)"
encrypted_message = base64.b64decode(encrypted_message_b64)# 使用私钥解密
cipher = PKCS1_OAEP.new(private_key)
decrypted_message = cipher.decrypt(encrypted_message)print("解密后的数据:", decrypted_message.decode('utf-8'))

encrypted_message_b64替换为实际接收到的加密数据的Base64编码字符串。

RSA_117">五、RSA签名与验证

除了加密和解密外,RSA还可以用于数字签名,以确保数据的完整性和来源的可靠性。签名过程使用私钥,验证过程使用公钥。

签名过程

python">from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256# 加载私钥
with open("private.pem", "rb") as f:private_key = RSA.import_key(f.read())# 待签名的数据
message = "这是一份需要签名的文件内容".encode('utf-8')# 使用SHA256哈希函数对数据进行哈希
h = SHA256.new(message)# 使用私钥进行签名
signer = pkcs1_15.new(private_key)
signature = signer.sign(h)# 将签名转换为base64编码
signature_b64 = base64.b64encode(signature).decode('utf-8')
print("签名(Base64编码):", signature_b64)

验证过程

python">from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
import base64# 加载公钥
with open("public.pem", "rb") as f:public_key = RSA.import_key(f.read())# 待验证的数据和签名
message = "这是一份需要签名的文件内容".encode('utf-8')
signature_b64 = "你的签名(Base64编码)"
signature = base64.b64decode(signature_b64)# 使用SHA256哈希函数对数据进行哈希
h = SHA256.new(message)# 使用公钥验证签名
verifier = pkcs1_15.new(public_key)
if verifier.verify(h, signature):print("签名验证成功,数据未被篡改。")
else:print("签名验证失败,数据可能被篡改。")

signature_b64替换为实际接收到的签名的Base64编码字符串。

六、实际应用案例

案例背景

假设Alice是一家公司的业务员,她在外地考察商机并发现了重要的商业信息。她需要将这个信息通过电子邮件发送给公司经理Bob。然而,电子邮件传输过程中存在安全风险,如数据被抓包、邮箱密码泄露等。为了确保信息的安全传输,Alice决定使用RSA加密算法对邮件内容进行加密,并使用私钥对邮件进行签名,以确保邮件的完整性和来源的可靠性。

加密与签名过程

  1. Alice生成RSA密钥对:Alice使用Python的pycryptodome库生成一对RSA密钥对,并将公钥发送给Bob。

  2. Alice加密邮件内容:Alice将发现的商业信息作为明文,使用Bob的公钥进行加密,得到密文。

  3. Alice签名邮件内容:Alice使用自己的私钥对邮件内容进行签名,得到签名信息。

  4. Alice发送邮件:Alice将加密后的邮件内容和签名信息一起通过电子邮件发送给Bob。

解密与验证过程

  1. Bob接收邮件:Bob收到Alice发送的加密邮件和签名信息。

  2. Bob解密邮件内容:Bob使用自己的私钥对加密的邮件内容进行解密,还原出原始的商业信息。

  3. Bob验证签名:Bob使用Alice的公钥对签名信息进行验证,确保邮件在传输过程中未被篡改,并且确实是Alice发送的。

示例代码

这里只给出Alice加密和签名的部分代码,Bob的解密和验证过程与前面介绍的过程类似。

Alice端代码
python"># 假设Alice已经获得了Bob的公钥,并保存在bob_public.pem文件中# 加密邮件内容
encrypted_email_content = rsa_encrypt("重要商业信息".encode('utf-8'), bob_public_key)# 签名邮件内容
signature = rsa_sign("重要商业信息".encode('utf-8'), alice_private_key, 'SHA-256')# Alice将encrypted_email_content和signature通过电子邮件发送给Bob

注意:rsa_encryptrsa_sign函数是自定义的,用于封装加密和签名的过程,具体实现可以参考前面的示例代码。

七、总结

本文详细介绍了在Python中使用RSA算法进行加密、解密、签名和验证签名的过程。通过结合实际应用案例,展示了RSA算法在数据安全传输中的重要作用。希望大家通过本文能够掌握RSA算法的基本原理和Python实现方法,并在实际工作中加以应用。


http://www.ppmy.cn/devtools/111786.html

相关文章

【网络安全】JavaScript获取应用程序隐藏元素及关键字段

未经许可,不得转载。 文章目录 CSS隐藏元素识别识别页面中所有第三方域名列出当前网页上加载的所有 JavaScript 文件的 URLCSS隐藏元素识别 识别页面上通过 CSS 属性隐藏的元素,如( display: none、visibility: hidden 或 opacity: 0 ): javascript:(function() {let hidd…

AUTOSAR_EXP_ARAComAPI的5章笔记(5)

返回目录 5.3.5.3 Accessing Event Data — aka Samples 成功订阅了一个事件后,如何实现对接收的 Sample的访问呢?从服务提供者发送到订阅的Proxy实例的 Sample,在典型的进程间通信(IPC)实现中,会在缓冲区中积累 / 排队(例如内核…

凸优化学习(2)——梯度类方法求解(gradient descent)

🍅 写在前面 👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。 🔎个人主页:主页链接(欢迎各位大佬光临指导) ⭐️近…

oracle 如何查询表被锁

在Oracle数据库中,查询表是否被锁可以通过多种方式实现。以下是一些常用的方法来查询Oracle数据库中的表锁情况: 1. 使用V$LOCKED_OBJECT视图 V$LOCKED_OBJECT是Oracle提供的动态性能视图,用于显示当前被锁定的对象信息。通过查询该视图&am…

Spring Boot实战-文章管理系统(1.用户相关接口)

一、用户相关接口 1.注解 RestController:是一个组合注解,它结合了 Controller 和 ResponseBody 注解的功能(就相当于把两个注解组合在一起)。 在使用 RestController 注解标记的类中,每个方法的返回值都会以 JSON 或…

在Python中实现简单缓存机制:概念与实践

在Python中实现简单缓存机制:概念与实践 在软件开发中,缓存是一种常用的技术,用于提高数据访问速度和减少计算开销。通过缓存机制,可以将频繁访问的数据存储在内存中,从而避免重复计算或数据获取。本文将详细介绍如何在Python中实现一个简单的缓存机制,并提供示例代码。…

Ubuntu报错:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend 锁正由进程 7647

正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 7647正在等 这个错误表明你正在尝试使用APT(高级包装工具)时,它无法获取所需的锁文件。锁文件用于防止多个进程同时修改系统软件包,这可能会导致损坏。 解决…

Python之 条件与循环(Python‘s Conditions and loops)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…