使用RSA算法加密字符串:从基础到实现 - Python
在现代数据安全中,加密算法起着至关重要的作用。特别是非对称加密算法,如RSA(Rivest-Shamir-Adleman),广泛应用于保护敏感信息的传输。本文将详细介绍如何使用RSA算法加密和解密字符串,包括生成密钥对、加密和解密消息的完整代码实现。
什么是RSA加密?
RSA加密是一种非对称加密算法,这意味着它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。非对称加密的主要优势在于,公钥可以公开发布,而私钥必须安全保存。这种方法确保了即使加密密钥被广泛传播,只有持有解密密钥的人才能读取加密信息。
安装必要的库
在开始之前,确保你的Python环境中已经安装了PyCryptodome库,这是一个功能强大的加密库,可以实现各种加密算法,包括RSA。
pip install pycryptodome
生成RSA密钥对
首先,我们需要生成一对RSA密钥,包括一个公钥和一个私钥。公钥用于加密消息,而私钥用于解密消息。
from Crypto.PublicKey import RSAdef generate_key_pair():"""生成RSA密钥对"""key = RSA.generate(2048) # 生成2048位的RSA密钥private_key = key.export_key() # 导出私钥public_key = key.publickey().export_key() # 导出公钥return private_key, public_key# 生成密钥对
private_key, public_key = generate_key_pair()
加密字符串
使用公钥加密字符串,我们需要导入公钥并创建一个加密对象。然后,使用该对象对字符串进行加密。
from Crypto.Cipher import PKCS1_OAEPdef encrypt_string(message, public_key):"""使用RSA公钥加密字符串"""key = RSA.import_key(public_key) # 导入公钥cipher_rsa = PKCS1_OAEP.new(key) # 创建用于加密的PKCS1_OAEP对象ciphertext = cipher_rsa.encrypt(message.encode()) # 加密消息return ciphertext# 自定义待加密的字符串
custom_message = "Hello, this is a secret message!"
encrypted_message = encrypt_string(custom_message, public_key)
查看加密后的密文
加密后的密文通常是二进制数据,为了便于查看和传输,我们可以将其转换为Base64编码。
import base64# 将密文转换为Base64编码
encrypted_message_base64 = base64.b64encode(encrypted_message).decode('utf-8')
print("Encrypted message (Base64):", encrypted_message_base64)
解密字符串
使用私钥解密密文,需要导入私钥并创建一个解密对象。然后,使用该对象对密文进行解密。
def decrypt_string(ciphertext, private_key):"""使用RSA私钥解密字符串"""key = RSA.import_key(private_key) # 导入私钥cipher_rsa = PKCS1_OAEP.new(key) # 创建用于解密的PKCS1_OAEP对象message = cipher_rsa.decrypt(ciphertext).decode() # 解密消息return message# 解密密文
decrypted_message = decrypt_string(encrypted_message, private_key)
print("Decrypted message:", decrypted_message)
完整示例代码
以下是完整的示例代码,展示了如何生成RSA密钥对、加密字符串、查看加密后的密文以及解密字符串。
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64def generate_key_pair():"""生成RSA密钥对"""key = RSA.generate(2048)private_key = key.export_key()public_key = key.publickey().export_key()return private_key, public_keydef encrypt_string(message, public_key):"""使用RSA公钥加密字符串"""key = RSA.import_key(public_key)cipher_rsa = PKCS1_OAEP.new(key)ciphertext = cipher_rsa.encrypt(message.encode())return ciphertextdef decrypt_string(ciphertext, private_key):"""使用RSA私钥解密字符串"""key = RSA.import_key(private_key)cipher_rsa = PKCS1_OAEP.new(key)message = cipher_rsa.decrypt(ciphertext).decode()return messageif __name__ == "__main__":# 生成RSA密钥对private_key, public_key = generate_key_pair()# 自定义密钥和待加密的字符串custom_message = "Hello, this is a secret message!"custom_public_key = public_key # 使用生成的公钥进行加密# 加密字符串encrypted_message = encrypt_string(custom_message, custom_public_key)# 将密文转换为Base64编码,以便更容易查看encrypted_message_base64 = base64.b64encode(encrypted_message).decode('utf-8')print("Encrypted message (Base64):", encrypted_message_base64)# 解密字符串decrypted_message = decrypt_string(encrypted_message, private_key)print("Decrypted message:", decrypted_message)
总结
本文介绍了如何使用RSA算法加密和解密字符串。我们详细讲解了如何生成RSA密钥对、加密字符串、查看加密后的密文以及解密字符串的步骤和实现方法。通过这些步骤,你可以轻松实现基本的非对称加密功能,为数据传输提供安全保障。
RSA算法虽然强大,但在实际应用中通常会结合对称加密算法使用,以处理大数据量的加密任务。例如,可以使用RSA加密对称密钥,然后使用对称密钥加密实际数据。这种组合方式不仅提高了安全性,还能有效处理大规模数据的加密需求。

相关文章:
使用RSA算法加密字符串:从基础到实现 - Python
在现代数据安全中,加密算法起着至关重要的作用。特别是非对称加密算法,如RSA(Rivest-Shamir-Adleman),广泛应用于保护敏感信息的传输。本文将详细介绍如何使用RSA算法加密和解密字符串,包括生成密钥对、加密…...
MFC实现守护进程,包括开机自启动、进程单例、进程查询、进程等待、重启进程、关闭进程
在Windows平台上实现一个守护进程,由于与系统有关,所有使用MFC来实现是最合适的,被守护的进程则不限语言。废话不多,直接开整。 目录 1. 开机自启动 2. 进程单例 3. 进程查询 4. 进程等待 5. 重启进程 6. 关闭进程 7、最后…...
Spark SQL数据源 - Parquet文件
当使用Spark SQL处理Parquet文件时,你可以使用spark.read.parquet()方法从文件系统中加载Parquet数据到一个DataFrame中。Parquet是一种列式存储格式,非常适合用于大数据集,因为它提供了高效的压缩和编码方案。 以下是一个简单的例子&#x…...
eNsp——两台电脑通过一根网线直连通信
一、拓扑结构 二、电脑配置 ip和子网掩码,配置两台电脑处于同一网段 三、测试 四、应用 传文件等操作,可以在一台电脑上配置FTP服务器...
杂牌记录仪TS视频流恢复方法
大多数的记录仪都采用了MP4/MOV文件方案,极少数的可能在用AVI文件,极极少数的在用TS文件方案。很多人可能不太解TS文件,这是一种古老的视频文件结构,下边这个案例我们来看下TS视频文件的恢复方法。 故障存储:8G存储卡/fat32文件系…...
十_信号7-信号集
int sigemptyset(sigset_t *set); 清空信号集 int sigfillset(sigset_t *set); 填充满 信号集 int sigaddset(sigset_t *set, int signum); 向信号集中添加信号 int sigdelset(sigset_t *set, int signum); 从型号集中删除信号 int sigismember(const sigset_t *set, int s…...
GPT-4o
微软最新发布的CopilotPC采用了OpenAI最新的GPT-4o技术,新增了多项强大功能。以下是主要的新增功能: 更强大的AI处理能力:CopilotPC采用了专门用于AI处理的特殊芯片,使得电脑能够处理更多的人工智能任务,而无需调用云…...
32位与64位程序下函数调用的异同——计科学习中缺失的内容
前言 今天,通过一个有趣的案例,从反编译的角度看一下C语言中函数参数是如何传递的。 创建main.c文件,将下面实验代码拷贝到main.c文件中。 # main.c #include <stdio.h>int test(int a, int b, int c, int d, int e, int f, int g, …...
Python爬虫实战(实战篇)—16获取【百度热搜】数据—写入Ecel(附完整代码)
文章目录 专栏导读背景结果预览1、爬取页面分析2、通过返回数据发现适合利用lxmlxpath3、继续分析【小说榜、电影榜、电视剧榜、汽车榜、游戏榜】4、完整代码总结 专栏导读 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门…...
js切割数组的两种方法slice(),splice()
slice() 返回一个索引和另一个索引之间的数据(不改变原数组),slice(start,end)有两个参数(start必需,end选填),都是索引,返回值不包括end 用法和截取字符串一样 splice() 用来添加或者删除数组的数据,只返回被删除的数据,类型为数组(改变原数组) var heroes["李白&q…...
【计算机毕设】基于SpringBoot的医院管理系统设计与实现 - 源码免费(私信领取)
免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的医院管理系统,以提高医院管理效率,优化医疗服务流程,提升患者就诊体验…...
导线防碰撞警示灯:高压线路安全保障
导线防碰撞警示灯:高压线路安全保障 在广袤的大地上,高压线路如同血脉般纵横交错,然而,在这看似平静的电力输送背后,却隐藏着不容忽视的安全隐患。特别是在那些输电线路跨越道路、施工等区域的路段,线下超…...
【LeetCode 77. 组合】
1. 题目 2. 分析 本题有个难点在于如何保存深搜得到的结果?总结了一下,深搜处理的代码,关于返回值有三大类。 第一类:层层传递,将最深层的结果传上来;这类题有:【反转链表】 第二类࿱…...
element-ui组件table去除下方滚动条,实现鼠标左右拖拽移动表格
时隔多日,再次遇到值得记录的问题。 需求 项目前端使用vue框架,页面使用element-ui进行页面快速搭建。默认的table组件当表格过长时,下方会出现横向的滚动条,便于用户对表格进行左右滑动。考虑到页面美观问题,滚动条…...
【C++】list的使用(上)
🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🌈关于list🔥默认成员函数构造函数(constructor)析构函数(destructor)赋值运算符重载 …...
【代码随想录训练营】【Day 37】【贪心-4】| Leetcode 840, 406, 452
【代码随想录训练营】【Day 37】【贪心-4】| Leetcode 840, 406, 452 需强化知识点 python list sort的高阶用法,两个key,另一种逆序写法python list insert的用法 题目 860. 柠檬水找零 思路:注意 20 块找零,可以找3张5块升…...
concat是什么?前端开发者必须掌握的数组拼接利器
concat是什么?前端开发者必须掌握的数组拼接利器 在前端开发中,concat是一个极其重要的概念,它能够帮助我们实现数组之间的无缝拼接。那么,concat到底是什么?为什么它在前端开发中如此重要?接下来…...
WHAT - 容器化系列(一)
这里写目录标题 一、什么是容器与虚拟机1.1 什么是容器1.2 容器的特点1.3 容器和虚拟机的区别虚拟机(VM):基于硬件的资源隔离技术容器:基于操作系统的资源隔离技术对比总结应用场景 二、容器的实现原理1. Namespace(命…...
QT7_视频知识点笔记_67_项目练习(页面以及对话框的切换,自定义数据类型,DB数据库类的自定义及使用)
视频项目:7----汽车销售管理系统(登录,品牌车管理,新车入库,销售统计图表)-----项目视频没有,代码也不全,更改项目练习:学生信息管理系统。 学生信息管理系统࿱…...
windows10系统64位安装delphiXE11.2完整教程
windows10系统64位安装delphiXE11.2完整教程 https://altd.embarcadero.com/download/radstudio/11.0/radstudio_11_106491a.iso XE11.1 https://altd.embarcadero.com/download/radstudio/11.0/RADStudio_11_2_10937a.iso XE11.2 关键使用文件在以下内容:windows10…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
